Add backup status getters

This commit is contained in:
Atlante45 2018-02-15 15:46:35 -08:00
parent a7ca539899
commit b76e1b9750
4 changed files with 66 additions and 24 deletions

View file

@ -111,6 +111,42 @@ void AssetsBackupHandler::checkForAssetsToDelete() {
}
}
std::pair<bool, float> AssetsBackupHandler::isAvailable(QString filePath) {
auto it = find_if(begin(_backups), end(_backups), [&](const std::vector<AssetServerBackup>::value_type& value) {
return value.filePath == filePath;
});
if (it == end(_backups)) {
return { true, 1.0f };
}
float progress = (float)it->mappings.size();
for (const auto& mapping : it->mappings) {
if (_assetsLeftToRequest.find(mapping.second) != end(_assetsLeftToRequest)) {
progress -= 1.0f;
}
}
progress /= (float)it->mappings.size();
return { false, progress };
}
std::pair<bool, float> AssetsBackupHandler::getRecoveryStatus() {
if (_assetsLeftToUpload.empty() &&
_mappingsLeftToSet.empty() &&
_mappingsLeftToDelete.empty() &&
_mappingRequestsInFlight == 0) {
return { false, 1.0f };
}
float progress = (float)_numRestoreOperations;
progress -= (float)_assetsLeftToUpload.size();
progress -= (float)_mappingRequestsInFlight;
progress /= (float)_numRestoreOperations;
return { true, progress };
}
void AssetsBackupHandler::loadBackup(QuaZip& zip) {
Q_ASSERT(QThread::currentThread() == thread());
@ -451,6 +487,11 @@ void AssetsBackupHandler::computeServerStateDifference(const AssetUtils::Mapping
}
}
_numRestoreOperations = _assetsLeftToUpload.size() + _mappingsLeftToSet.size();
if (!_mappingsLeftToDelete.empty()) {
++_numRestoreOperations;
}
qCDebug(asset_backup) << "Mappings to set:" << _mappingsLeftToSet.size();
qCDebug(asset_backup) << "Mappings to del:" << _mappingsLeftToDelete.size();
qCDebug(asset_backup) << "Assets to upload:" << _assetsLeftToUpload.size();
@ -461,8 +502,6 @@ void AssetsBackupHandler::restoreAllAssets() {
}
void AssetsBackupHandler::restoreNextAsset() {
startOperation();
if (_assetsLeftToUpload.empty()) {
updateMappings();
return;
@ -500,9 +539,7 @@ void AssetsBackupHandler::updateMappings() {
qCCritical(asset_backup) << " Error:" << request->getErrorString();
}
if (--_mappingRequestsInFlight == 0) {
stopOperation();
}
--_mappingRequestsInFlight;
request->deleteLater();
});
@ -519,9 +556,7 @@ void AssetsBackupHandler::updateMappings() {
qCCritical(asset_backup) << " Error:" << request->getErrorString();
}
if (--_mappingRequestsInFlight == 0) {
stopOperation();
}
--_mappingRequestsInFlight;
request->deleteLater();
});

View file

@ -31,13 +31,16 @@ class AssetsBackupHandler : public QObject, public BackupHandlerInterface {
public:
AssetsBackupHandler(const QString& backupDirectory);
void loadBackup(QuaZip& zip);
void createBackup(QuaZip& zip);
void recoverBackup(QuaZip& zip);
void deleteBackup(QuaZip& zip);
void consolidateBackup(QuaZip& zip);
std::pair<bool, float> isAvailable(QString filePath) override;
std::pair<bool, float> getRecoveryStatus() override;
bool operationInProgress() const { return _operationInProgress; }
void loadBackup(QuaZip& zip) override;
void createBackup(QuaZip& zip) override;
void recoverBackup(QuaZip& zip) override;
void deleteBackup(QuaZip& zip) override;
void consolidateBackup(QuaZip& zip) override;
bool operationInProgress() { return getRecoveryStatus().first; }
private:
void setupRefreshTimer();
@ -48,9 +51,6 @@ private:
void checkForMissingAssets();
void checkForAssetsToDelete();
void startOperation() { _operationInProgress = true; }
void stopOperation() { _operationInProgress = false; }
void downloadMissingFiles(const AssetUtils::Mappings& mappings);
void downloadNextMissingFile();
bool writeAssetFile(const AssetUtils::AssetHash& hash, const QByteArray& data);
@ -73,8 +73,6 @@ private:
bool corruptedBackup;
};
bool _operationInProgress { false };
// Internal storage for backups on disk
bool _allBackupsLoadedSuccessfully { false };
std::vector<AssetServerBackup> _backups;
@ -89,6 +87,7 @@ private:
std::vector<std::pair<AssetUtils::AssetPath, AssetUtils::AssetHash>> _mappingsLeftToSet;
AssetUtils::AssetPathList _mappingsLeftToDelete;
int _mappingRequestsInFlight { 0 };
int _numRestoreOperations { 0 }; // Used to compute a restore progress.
};
#endif /* hifi_AssetsBackupHandler_h */

View file

@ -20,6 +20,11 @@ class BackupHandlerInterface {
public:
virtual ~BackupHandlerInterface() = default;
virtual std::pair<bool, float> isAvailable(QString filePath) = 0;
// Returns whether a recovery is ongoing and a progress between 0 and 1 if one is.
virtual std::pair<bool, float> getRecoveryStatus() = 0;
virtual void loadBackup(QuaZip& zip) = 0;
virtual void createBackup(QuaZip& zip) = 0;
virtual void recoverBackup(QuaZip& zip) = 0;

View file

@ -20,19 +20,22 @@ class EntitiesBackupHandler : public BackupHandlerInterface {
public:
EntitiesBackupHandler(QString entitiesFilePath, QString entitiesReplacementFilePath);
void loadBackup(QuaZip& zip) {}
std::pair<bool, float> isAvailable(QString filePath) override { return { true, 1.0f }; }
std::pair<bool, float> getRecoveryStatus() override { return { false, 1.0f }; }
void loadBackup(QuaZip& zip) override {}
// Create a skeleton backup
void createBackup(QuaZip& zip);
void createBackup(QuaZip& zip) override;
// Recover from a full backup
void recoverBackup(QuaZip& zip);
void recoverBackup(QuaZip& zip) override;
// Delete a skeleton backup
void deleteBackup(QuaZip& zip) {}
void deleteBackup(QuaZip& zip) override {}
// Create a full backup
void consolidateBackup(QuaZip& zip) {}
void consolidateBackup(QuaZip& zip) override {}
private:
QString _entitiesFilePath;