Overte C++ Documentation
AssetsBackupHandler.h
1 //
2 // AssetsBackupHandler.h
3 // domain-server/src
4 //
5 // Created by Clement Brisset on 1/12/18.
6 // Copyright 2018 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #ifndef hifi_AssetsBackupHandler_h
13 #define hifi_AssetsBackupHandler_h
14 
15 #include <set>
16 #include <map>
17 
18 #include <QObject>
19 #include <QTimer>
20 #include <QJsonDocument>
21 #include <QJsonObject>
22 
23 #include <AssetUtils.h>
24 #include <ReceivedMessage.h>
25 #include <PortableHighResolutionClock.h>
26 
27 #include "BackupHandler.h"
28 
29 class AssetsBackupHandler : public QObject, public BackupHandlerInterface {
30  Q_OBJECT
31 
32 public:
33  AssetsBackupHandler(const QString& backupDirectory, bool assetServerEnabled);
34 
35  std::pair<bool, float> isAvailable(const QString& backupName) override;
36  std::pair<bool, float> getRecoveryStatus() override;
37 
38  void loadBackup(const QString& backupName, QuaZip& zip) override;
39  void loadingComplete() override;
40  void createBackup(const QString& backupName, QuaZip& zip) override;
41  std::pair<bool, QString> recoverBackup(const QString& backupName, QuaZip& zip, const QString& username, const QString& sourceFilename) override;
42  void deleteBackup(const QString& backupName) override;
43  void consolidateBackup(const QString& backupName, QuaZip& zip) override;
44  bool isCorruptedBackup(const QString& backupName) override;
45 
46  bool operationInProgress() { return getRecoveryStatus().first; }
47 
48 private:
49  void setupRefreshTimer();
50  void refreshMappings();
51 
52  void refreshAssetsInBackups();
53  void refreshAssetsOnDisk();
54  void checkForMissingAssets();
55  void checkForAssetsToDelete();
56 
57  void downloadMissingFiles(const AssetUtils::Mappings& mappings);
58  void downloadNextMissingFile();
59  bool writeAssetFile(const AssetUtils::AssetHash& hash, const QByteArray& data);
60 
61  void computeServerStateDifference(const AssetUtils::Mappings& currentMappings,
62  const AssetUtils::Mappings& newMappings);
63  void restoreAllAssets();
64  void restoreNextAsset();
65  void updateMappings();
66 
67  QString _assetsDirectory;
68  bool _assetServerEnabled { false };
69 
70  QTimer _mappingsRefreshTimer;
71  p_high_resolution_clock::time_point _lastMappingsRefresh;
72  AssetUtils::Mappings _currentMappings;
73 
74  struct AssetServerBackup {
75  AssetServerBackup(const QString& pName, AssetUtils::Mappings pMappings, bool pCorruptedBackup) :
76  name(pName), mappings(pMappings), corruptedBackup(pCorruptedBackup) {}
77 
78  QString name;
79  AssetUtils::Mappings mappings;
80  bool corruptedBackup;
81  };
82 
83  // Internal storage for backups on disk
84  std::vector<AssetServerBackup> _backups;
85  std::set<AssetUtils::AssetHash> _assetsInBackups;
86  std::set<AssetUtils::AssetHash> _assetsOnDisk;
87 
88  // Internal storage for backup in progress
89  std::set<AssetUtils::AssetHash> _assetsLeftToRequest;
90 
91  // Internal storage for restore in progress
92  std::vector<AssetUtils::AssetHash> _assetsLeftToUpload;
93  std::vector<std::pair<AssetUtils::AssetPath, AssetUtils::AssetHash>> _mappingsLeftToSet;
94  AssetUtils::AssetPathList _mappingsLeftToDelete;
95  int _mappingRequestsInFlight { 0 };
96  int _numRestoreOperations { 0 }; // Used to compute a restore progress.
97 };
98 
99 #endif /* hifi_AssetsBackupHandler_h */