From 9f35ec4fc9b00d004e6dca563b1f3e044d25b1a0 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 29 Mar 2018 17:52:08 +0200 Subject: Prepare upgrade paths that don't nuke everything --- common/genericresource.cpp | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/common/genericresource.cpp b/common/genericresource.cpp index 5f49814..9cf91da 100644 --- a/common/genericresource.cpp +++ b/common/genericresource.cpp @@ -65,18 +65,24 @@ bool GenericResource::checkForUpgrade() if (currentDatabaseVersion != Sink::latestDatabaseVersion()) { SinkLog() << "Starting database upgrade from " << currentDatabaseVersion << " to " << Sink::latestDatabaseVersion(); - //Right now upgrading just means removing all local storage so we will resync - Sink::Storage::DataStore(Sink::storageLocation(), mResourceContext.instanceId(), Sink::Storage::DataStore::ReadWrite).removeFromDisk(); - Sink::Storage::DataStore(Sink::storageLocation(), mResourceContext.instanceId() + ".userqueue", Sink::Storage::DataStore::ReadWrite).removeFromDisk(); - Sink::Storage::DataStore(Sink::storageLocation(), mResourceContext.instanceId() + ".synchronizerqueue", Sink::Storage::DataStore::ReadWrite).removeFromDisk(); - Sink::Storage::DataStore(Sink::storageLocation(), mResourceContext.instanceId() + ".changereplay", Sink::Storage::DataStore::ReadWrite).removeFromDisk(); - Sink::Storage::DataStore(Sink::storageLocation(), mResourceContext.instanceId() + ".synchronization", Sink::Storage::DataStore::ReadWrite).removeFromDisk(); - - { - auto store = Sink::Storage::DataStore(Sink::storageLocation(), mResourceContext.instanceId(), Sink::Storage::DataStore::ReadWrite); - auto t = store.createTransaction(Storage::DataStore::ReadWrite); - Storage::DataStore::setDatabaseVersion(t, Sink::latestDatabaseVersion()); + bool nukeDatabases = false; + //Only apply the necessary updates. + for (int i = currentDatabaseVersion; i < Sink::latestDatabaseVersion(); i++) { + //TODO implement specific upgrade paths where applicable, and only nuke otherwise + nukeDatabases = true; } + if (nukeDatabases) { + SinkLog() << "Wiping all databases during upgrade, you will have to resync."; + //Right now upgrading just means removing all local storage so we will resync + Sink::Storage::DataStore(Sink::storageLocation(), mResourceContext.instanceId(), Sink::Storage::DataStore::ReadWrite).removeFromDisk(); + Sink::Storage::DataStore(Sink::storageLocation(), mResourceContext.instanceId() + ".userqueue", Sink::Storage::DataStore::ReadWrite).removeFromDisk(); + Sink::Storage::DataStore(Sink::storageLocation(), mResourceContext.instanceId() + ".synchronizerqueue", Sink::Storage::DataStore::ReadWrite).removeFromDisk(); + Sink::Storage::DataStore(Sink::storageLocation(), mResourceContext.instanceId() + ".changereplay", Sink::Storage::DataStore::ReadWrite).removeFromDisk(); + Sink::Storage::DataStore(Sink::storageLocation(), mResourceContext.instanceId() + ".synchronization", Sink::Storage::DataStore::ReadWrite).removeFromDisk(); + } + auto store = Sink::Storage::DataStore(Sink::storageLocation(), mResourceContext.instanceId(), Sink::Storage::DataStore::ReadWrite); + auto t = store.createTransaction(Storage::DataStore::ReadWrite); + Storage::DataStore::setDatabaseVersion(t, Sink::latestDatabaseVersion()); SinkLog() << "Finished database upgrade to " << Sink::latestDatabaseVersion(); return true; } -- cgit v1.2.3