diff --git a/fdbserver/storageserver.actor.cpp b/fdbserver/storageserver.actor.cpp index bc10b51988d..02ba30b7e87 100644 --- a/fdbserver/storageserver.actor.cpp +++ b/fdbserver/storageserver.actor.cpp @@ -313,7 +313,7 @@ struct StorageServer { CoalescedKeyRangeMap< Version > newestDirtyVersion; // Similar to newestAvailableVersion, but includes (only) keys that were only partly available (due to cancelled fetchKeys) // The following are in rough order from newest to oldest - Version lastTLogVersion, lastVersionWithData; + Version lastTLogVersion, lastVersionWithData, restoredVersion; NotifiedVersion version; NotifiedVersion desiredOldestVersion; // We can increase oldestVersion (and then durableVersion) to this version when the disk permits NotifiedVersion oldestVersion; // See also storageVersion() @@ -416,7 +416,7 @@ struct StorageServer { StorageServer(IKeyValueStore* storage, Reference> const& db, StorageServerInterface const& ssi) : instanceID(g_random->randomUniqueID().first()), storage(this, storage), db(db), - lastTLogVersion(0), lastVersionWithData(0), + lastTLogVersion(0), lastVersionWithData(0), restoredVersion(0), updateEagerReads(0), shardChangeCounter(0), fetchKeysParallelismLock(SERVER_KNOBS->FETCH_KEYS_PARALLELISM_BYTES), @@ -458,6 +458,7 @@ struct StorageServer { oldestVersion = ver; durableVersion = ver; lastVersionWithData = ver; + restoredVersion = ver; mutableData().createNewVersion(ver); mutableData().forgetVersionsBefore(ver); @@ -2186,7 +2187,7 @@ bool containsRollback( VersionUpdateRef const& changes, Version& rollbackVersion class StorageUpdater { public: - StorageUpdater(Version fromVersion, Version newOldestVersion) : fromVersion(fromVersion), newOldestVersion(newOldestVersion), currentVersion(fromVersion), processedStartKey(false) {} + StorageUpdater(Version fromVersion, Version newOldestVersion, Version restoredVersion) : fromVersion(fromVersion), newOldestVersion(newOldestVersion), currentVersion(fromVersion), restoredVersion(restoredVersion), processedStartKey(false) {} void applyMutation(StorageServer* data, MutationRef const& m, Version ver) { //TraceEvent("SSNewVersion", data->thisServerID).detail("VerWas", data->mutableData().latestVersion).detail("ChVer", ver); @@ -2216,6 +2217,7 @@ class StorageUpdater { Version currentVersion; private: Version fromVersion; + Version restoredVersion; KeyRef startKey; bool nowAssigned; @@ -2252,7 +2254,7 @@ class StorageUpdater { BinaryReader br(m.param2, Unversioned()); br >> rollbackVersion; - if ( rollbackVersion < fromVersion ) { + if ( rollbackVersion < fromVersion && rollbackVersion > restoredVersion) { TEST( true ); // ShardApplyPrivateData shard rollback TraceEvent(SevWarn, "Rollback", data->thisServerID) .detail("FromVersion", fromVersion) @@ -2389,7 +2391,7 @@ ACTOR Future update( StorageServer* data, bool* pReceivedUpdate ) data->updateEagerReads = &eager; data->debug_inApplyUpdate = true; - StorageUpdater updater(data->lastVersionWithData, std::max( std::max(data->desiredOldestVersion.get(), data->oldestVersion.get()), minNewOldestVersion )); + StorageUpdater updater(data->lastVersionWithData, std::max( std::max(data->desiredOldestVersion.get(), data->oldestVersion.get()), minNewOldestVersion ), data->restoredVersion); if (EXPENSIVE_VALIDATION) data->data().atLatest().validate(); validate(data);