diff options
author | Sergi Mateo Bellido <sergi.mateo-bellido@mongodb.com> | 2021-10-04 09:34:11 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-10-04 09:58:38 +0000 |
commit | 3008af2319af2098f4691612f31a431c52ccc52c (patch) | |
tree | d13b3e94078fb3028ef4e998a318d639c0b9fdfc /src/mongo/s/catalog_cache.cpp | |
parent | 0ae7d4aa4916c5783a523280fe2d4ec3c2897002 (diff) | |
download | mongo-3008af2319af2098f4691612f31a431c52ccc52c.tar.gz |
SERVER-60268 Reintroduce disambiguationg sequence number
Diffstat (limited to 'src/mongo/s/catalog_cache.cpp')
-rw-r--r-- | src/mongo/s/catalog_cache.cpp | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/mongo/s/catalog_cache.cpp b/src/mongo/s/catalog_cache.cpp index d786da676f9..ed6283dacf7 100644 --- a/src/mongo/s/catalog_cache.cpp +++ b/src/mongo/s/catalog_cache.cpp @@ -73,6 +73,7 @@ const OperationContext::Decoration<bool> operationBlockedBehindCatalogCacheRefre } // namespace +AtomicWord<uint64_t> ComparableDatabaseVersion::_disambiguatingSequenceNumSource{1ULL}; AtomicWord<uint64_t> ComparableDatabaseVersion::_forcedRefreshSequenceNumSource{1ULL}; CachedDatabaseInfo::CachedDatabaseInfo(DatabaseTypeValueHandle&& dbt) : _dbt(std::move(dbt)){}; @@ -95,12 +96,15 @@ DatabaseVersion CachedDatabaseInfo::databaseVersion() const { ComparableDatabaseVersion ComparableDatabaseVersion::makeComparableDatabaseVersion( const boost::optional<DatabaseVersion>& version) { - return ComparableDatabaseVersion(version, _forcedRefreshSequenceNumSource.load()); + return ComparableDatabaseVersion(version, + _disambiguatingSequenceNumSource.fetchAndAdd(1), + _forcedRefreshSequenceNumSource.load()); } ComparableDatabaseVersion ComparableDatabaseVersion::makeComparableDatabaseVersionForForcedRefresh() { return ComparableDatabaseVersion(boost::none /* version */, + _disambiguatingSequenceNumSource.fetchAndAdd(1), _forcedRefreshSequenceNumSource.addAndFetch(2) - 1); } @@ -115,6 +119,9 @@ BSONObj ComparableDatabaseVersion::toBSONForLogging() const { else builder.append("dbVersion"_sd, "None"); + builder.append("disambiguatingSequenceNum"_sd, + static_cast<int64_t>(_disambiguatingSequenceNum)); + builder.append("forcedRefreshSequenceNum"_sd, static_cast<int64_t>(_forcedRefreshSequenceNum)); return builder.obj(); @@ -142,7 +149,13 @@ bool ComparableDatabaseVersion::operator<(const ComparableDatabaseVersion& other if (_forcedRefreshSequenceNum == 0) return false; // Only default constructed values have _forcedRefreshSequenceNum == 0 and // they are always equal - return _dbVersion < other._dbVersion; + + // If both versions are valid we rely on the underlying DatabaseVersion comparison + if (_dbVersion && other._dbVersion) + return _dbVersion < other._dbVersion; + + // Finally, we do a disambiguating sequence number comparison + return _disambiguatingSequenceNum < other._disambiguatingSequenceNum; } CatalogCache::CatalogCache(ServiceContext* const service, CatalogCacheLoader& cacheLoader) |