From c2f08dfdba2a8b71fc84f154b08b173670fcccf0 Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Wed, 13 Jun 2018 12:07:20 -0700 Subject: [PATCH] Update Octree to atomically persist data --- assignment-client/src/octree/OctreeServer.cpp | 4 +-- libraries/octree/src/Octree.cpp | 7 +++-- libraries/octree/src/OctreePersistThread.cpp | 31 +++---------------- libraries/octree/src/OctreePersistThread.h | 2 -- 4 files changed, 12 insertions(+), 32 deletions(-) diff --git a/assignment-client/src/octree/OctreeServer.cpp b/assignment-client/src/octree/OctreeServer.cpp index 2b2aaeb3e9..e993bea358 100644 --- a/assignment-client/src/octree/OctreeServer.cpp +++ b/assignment-client/src/octree/OctreeServer.cpp @@ -1207,8 +1207,8 @@ void OctreeServer::beginRunning() { beforeRun(); // after payload has been processed - connect(nodeList.data(), &NodeList::nodeAdded, &OctreeServer::nodeAdded); - connect(nodeList.data(), &NodeList::nodeKilled, &OctreeServer::nodeKilled); + connect(nodeList.data(), &NodeList::nodeAdded, this, &OctreeServer::nodeAdded); + connect(nodeList.data(), &NodeList::nodeKilled, this, &OctreeServer::nodeKilled); nodeList->linkedDataCreateCallback = [this](Node* node) { auto queryNodeData = createOctreeQueryNode(); diff --git a/libraries/octree/src/Octree.cpp b/libraries/octree/src/Octree.cpp index 5f943fabf2..d9da06221d 100644 --- a/libraries/octree/src/Octree.cpp +++ b/libraries/octree/src/Octree.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -972,10 +973,12 @@ bool Octree::writeToJSONFile(const char* fileName, const OctreeElementPointer& e return false; } - QFile persistFile(fileName); + QSaveFile persistFile(fileName); bool success = false; if (persistFile.open(QIODevice::WriteOnly)) { - success = persistFile.write(jsonDataForFile) != -1; + if (persistFile.write(jsonDataForFile) != -1) { + success = persistFile.commit(); + } } else { qCritical("Could not write to JSON description of entities."); } diff --git a/libraries/octree/src/OctreePersistThread.cpp b/libraries/octree/src/OctreePersistThread.cpp index d783a1effd..8b1d766418 100644 --- a/libraries/octree/src/OctreePersistThread.cpp +++ b/libraries/octree/src/OctreePersistThread.cpp @@ -62,19 +62,6 @@ OctreePersistThread::OctreePersistThread(OctreePointer tree, const QString& file void OctreePersistThread::start() { cleanupOldReplacementBackups(); - QFile tempFile { getTempFilename() }; - if (tempFile.exists()) { - qWarning(octree) << "Found temporary octree file at" << tempFile.fileName(); - qDebug(octree) << "Attempting to recover from temporary octree file"; - QFile::remove(_filename); - if (tempFile.rename(_filename)) { - qDebug(octree) << "Successfully recovered from temporary octree file"; - } else { - qWarning(octree) << "Failed to recover from temporary octree file"; - tempFile.remove(); - } - } - auto& packetReceiver = DependencyManager::get()->getPacketReceiver(); packetReceiver.registerListener(PacketType::OctreeDataFileReply, this, "handleOctreeDataFileReply"); @@ -182,7 +169,7 @@ void OctreePersistThread::handleOctreeDataFileReply(QSharedPointerincrementPersistDataVersion(); - QString tempFilename = getTempFilename(); - qCDebug(octree) << "Saving temporary Octree file to:" << tempFilename; - if (_tree->writeToFile(tempFilename.toLocal8Bit().constData(), nullptr, _persistAsFileType)) { - QFile tempFile { tempFilename }; + qCDebug(octree) << "Saving Octree data to:" << _filename; + if (_tree->writeToFile(_filename.toLocal8Bit().constData(), nullptr, _persistAsFileType)) { _tree->clearDirtyBit(); // tree is clean after saving - QFile::remove(_filename); - if (tempFile.rename(_filename)) { - qCDebug(octree) << "DONE moving temporary Octree file to" << _filename; - } else { - qCWarning(octree) << "Failed to move temporary Octree file to " << _filename; - tempFile.remove(); - } + qCDebug(octree) << "DONE persisting Octree data to" << _filename; } else { - qCWarning(octree) << "Failed to open temp Octree file at" << tempFilename; + qCWarning(octree) << "Failed to persist Octree data to" << _filename; } sendLatestEntityDataToDS(); diff --git a/libraries/octree/src/OctreePersistThread.h b/libraries/octree/src/OctreePersistThread.h index 5bb6e51e5f..0044a8fa5a 100644 --- a/libraries/octree/src/OctreePersistThread.h +++ b/libraries/octree/src/OctreePersistThread.h @@ -65,8 +65,6 @@ protected: void replaceData(QByteArray data); void sendLatestEntityDataToDS(); - QString getTempFilename() const { return _filename + ".temp"; } - private: OctreePointer _tree; QString _filename;