@@ -1520,8 +1520,18 @@ Future<Version> waitForVersion(StorageServer* data, Version commitVersion, Versi
15201520 if (readVersion < data->oldestVersion .get () || readVersion <= 0 ) {
15211521 return transaction_too_old ();
15221522 } else {
1523+ // It is correct to read any version between [commitVersion, readVersion],
1524+ // because version vector guarantees no mutations between them.
15231525 if (commitVersion < data->oldestVersion .get ()) {
1524- return data->oldestVersion .get ();
1526+ if (data->version .get () < readVersion) {
1527+ // Majority of the case, try using higher version to avoid
1528+ // transaction_too_old error when oldestVersion advances.
1529+ // BTW, any version in the range [oldestVersion, data->version.get()] is valid in this case.
1530+ return data->version .get ();
1531+ } else {
1532+ ASSERT (readVersion >= data->oldestVersion .get ());
1533+ return readVersion;
1534+ }
15251535 } else if (commitVersion <= data->version .get ()) {
15261536 return commitVersion;
15271537 }
@@ -3006,8 +3016,14 @@ ACTOR Future<GetKeyValuesReply> readRange(StorageServer* data,
30063016 data->counters .kvScanBytes += atStorageVersion.logicalSize ();
30073017
30083018 ASSERT (atStorageVersion.size () <= limit);
3009- if (data->storageVersion () > version)
3019+ if (data->storageVersion () > version) {
3020+ DisabledTraceEvent (" SS_TTO" , data->thisServerID )
3021+ .detail (" StorageVersion" , data->storageVersion ())
3022+ .detail (" Oldest" , data->oldestVersion .get ())
3023+ .detail (" Version" , version)
3024+ .detail (" Range" , range);
30103025 throw transaction_too_old ();
3026+ }
30113027
30123028 // merge the sets in resultCache with the sets on disk, stopping at the last key from disk if there is
30133029 // 'more'
@@ -3099,8 +3115,14 @@ ACTOR Future<GetKeyValuesReply> readRange(StorageServer* data,
30993115 data->counters .kvScanBytes += atStorageVersion.logicalSize ();
31003116
31013117 ASSERT (atStorageVersion.size () <= -limit);
3102- if (data->storageVersion () > version)
3118+ if (data->storageVersion () > version) {
3119+ DisabledTraceEvent (" SS_TTO" , data->thisServerID )
3120+ .detail (" StorageVersion" , data->storageVersion ())
3121+ .detail (" Oldest" , data->oldestVersion .get ())
3122+ .detail (" Version" , version)
3123+ .detail (" Range" , range);
31033124 throw transaction_too_old ();
3125+ }
31043126
31053127 int prevSize = result.data .size ();
31063128 merge (result.arena ,
@@ -3318,6 +3340,12 @@ ACTOR Future<Void> getKeyValuesQ(StorageServer* data, GetKeyValuesRequest req)
33183340
33193341 Version commitVersion = getLatestCommitVersion (req.ssLatestCommitVersions , data->tag );
33203342 state Version version = wait (waitForVersion (data, commitVersion, req.version , span.context ));
3343+ DisabledTraceEvent (" VVV" , data->thisServerID )
3344+ .detail (" Version" , version)
3345+ .detail (" ReqVersion" , req.version )
3346+ .detail (" Oldest" , data->oldestVersion .get ())
3347+ .detail (" VV" , req.ssLatestCommitVersions .toString ())
3348+ .detail (" DebugID" , req.debugID .present () ? req.debugID .get () : UID ());
33213349 data->counters .readVersionWaitSample .addMeasurement (g_network->timer () - queueWaitEnd);
33223350
33233351 state Optional<TenantMapEntry> tenantEntry = data->getTenantEntry (version, req.tenantInfo );
0 commit comments