From 4b2e907ada0ce5b64606d9fbf2e4c42b793e4d0c Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 15 Feb 2018 11:02:14 -0800 Subject: [PATCH 1/3] Update entities recover backup to reset id and version --- domain-server/src/BackupHandler.h | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/domain-server/src/BackupHandler.h b/domain-server/src/BackupHandler.h index 5fea3be6af..f2735e5adf 100644 --- a/domain-server/src/BackupHandler.h +++ b/domain-server/src/BackupHandler.h @@ -77,6 +77,8 @@ private: }; #include +#include + class EntitiesBackupHandler { public: EntitiesBackupHandler(QString entitiesFilePath, QString entitiesReplacementFilePath) : @@ -111,18 +113,27 @@ public: qCritical() << "Failed to open models.json.gz in backup"; return; } - auto data = zipFile.readAll(); + auto rawData = zipFile.readAll(); + + zipFile.close(); + + OctreeUtils::RawOctreeData data; + if (!OctreeUtils::readOctreeDataInfoFromData(rawData, &data)) { + qCritical() << "Unable to parse octree data during backup recovery"; + return; + } + + data.resetIdAndVersion(); + + if (zipFile.getZipError() != UNZ_OK) { + qCritical() << "Failed to unzip models.json.gz: " << zipFile.getZipError(); + return; + } QFile entitiesFile { _entitiesReplacementFilePath }; if (entitiesFile.open(QIODevice::WriteOnly)) { - entitiesFile.write(data); - } - - zipFile.close(); - - if (zipFile.getZipError() != UNZ_OK) { - qCritical() << "Failed to zip models.json.gz: " << zipFile.getZipError(); + entitiesFile.write(data.toGzippedByteArray()); } } From df809f5a3eb2b80bc73f39789554bf60dde3332a Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 15 Feb 2018 11:02:29 -0800 Subject: [PATCH 2/3] Cleanup logging for backup cleanup --- .../src/DomainContentBackupManager.cpp | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/domain-server/src/DomainContentBackupManager.cpp b/domain-server/src/DomainContentBackupManager.cpp index 6f311613d5..347923a282 100644 --- a/domain-server/src/DomainContentBackupManager.cpp +++ b/domain-server/src/DomainContentBackupManager.cpp @@ -295,18 +295,21 @@ void DomainContentBackupManager::removeOldBackupVersions(const BackupRule& rule) backupDir.entryInfoList({ AUTOMATIC_BACKUP_PREFIX + rule.extensionFormat + "*.zip" }, QDir::Files | QDir::NoSymLinks, QDir::Name); int backupsToDelete = matchingFiles.length() - rule.maxBackupVersions; - qCDebug(domain_server) << "Found" << matchingFiles.length() << "backups, deleting " << backupsToDelete << "backup(s)"; - for (int i = 0; i < backupsToDelete; ++i) { - auto fileInfo = matchingFiles[i].absoluteFilePath(); - QFile backupFile(fileInfo); - if (backupFile.remove()) { - qCDebug(domain_server) << "Removed old backup: " << backupFile.fileName(); - } else { - qCDebug(domain_server) << "Failed to remove old backup: " << backupFile.fileName(); + if (backupsToDelete <= 0) { + qCDebug(domain_server) << "Found" << matchingFiles.length() << "backups, no backups need to be deleted"; + } else { + qCDebug(domain_server) << "Found" << matchingFiles.length() << "backups, deleting " << backupsToDelete << "backup(s)"; + for (int i = 0; i < backupsToDelete; ++i) { + auto fileInfo = matchingFiles[i].absoluteFilePath(); + QFile backupFile(fileInfo); + if (backupFile.remove()) { + qCDebug(domain_server) << "Removed old backup: " << backupFile.fileName(); + } else { + qCDebug(domain_server) << "Failed to remove old backup: " << backupFile.fileName(); + } } + qCDebug(domain_server) << "Done removing old backup versions"; } - - qCDebug(domain_server) << "Done removing old backup versions"; } else { qCDebug(domain_server) << "Rolling backups for rule" << rule.name << "." << " Max Rolled Backup Versions less than 1 [" << rule.maxBackupVersions << "]." From efb2473fcf19737f63032331a632f8cca9672337 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Thu, 15 Feb 2018 11:02:55 -0800 Subject: [PATCH 3/3] Updaet createManualBackup to defer response until creation is done --- domain-server/src/DomainContentBackupManager.cpp | 16 ++++++++++++++-- domain-server/src/DomainContentBackupManager.h | 3 +-- domain-server/src/DomainServer.cpp | 12 ++++++++++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/domain-server/src/DomainContentBackupManager.cpp b/domain-server/src/DomainContentBackupManager.cpp index 347923a282..66655ea966 100644 --- a/domain-server/src/DomainContentBackupManager.cpp +++ b/domain-server/src/DomainContentBackupManager.cpp @@ -409,8 +409,20 @@ void DomainContentBackupManager::consolidate(QString fileName) { } } -void DomainContentBackupManager::createManualBackup(const QString& name) { - createBackup(MANUAL_BACKUP_PREFIX, name); +void DomainContentBackupManager::createManualBackup(MiniPromise::Promise promise, const QString& name) { + if (QThread::currentThread() != thread()) { + QMetaObject::invokeMethod(this, "createManualBackup", Q_ARG(MiniPromise::Promise, promise), + Q_ARG(const QString&, name)); + return; + } + + bool success; + QString path; + std::tie(success, path) = createBackup(MANUAL_BACKUP_PREFIX, name); + + promise->resolve({ + { "success", success } + }); } std::pair DomainContentBackupManager::createBackup(const QString& prefix, const QString& name) { diff --git a/domain-server/src/DomainContentBackupManager.h b/domain-server/src/DomainContentBackupManager.h index cfeae9c8b9..5cf8d4698f 100644 --- a/domain-server/src/DomainContentBackupManager.h +++ b/domain-server/src/DomainContentBackupManager.h @@ -57,9 +57,8 @@ public: void replaceData(QByteArray data); - void createManualBackup(const QString& name); - public slots: + void createManualBackup(MiniPromise::Promise promise, const QString& name); void recoverFromBackup(MiniPromise::Promise promise, const QString& backupName); void deleteBackup(MiniPromise::Promise promise, const QString& backupName); diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index 416c8e39b6..da8527bf16 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -2253,9 +2253,17 @@ bool DomainServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url return true; } - _contentManager->createManualBackup(it.value()); + auto deferred = makePromise("createManualBackup"); + deferred->then([connection, JSON_MIME_TYPE](QString error, QVariantMap result) { + QJsonObject rootJSON; + auto success = result["success"].toBool(); + rootJSON["success"] = success; + QJsonDocument docJSON(rootJSON); + connection->respond(success ? HTTPConnection::StatusCode200 : HTTPConnection::StatusCode400, docJSON.toJson(), + JSON_MIME_TYPE.toUtf8()); + }); + _contentManager->createManualBackup(deferred, it.value()); - connection->respond(HTTPConnection::StatusCode200); return true; } else if (url.path() == "/domain_settings") {