summaryrefslogtreecommitdiff
path: root/src/mongo/s/catalog_cache.cpp
diff options
context:
space:
mode:
authorSergi Mateo Bellido <sergi.mateo-bellido@mongodb.com>2021-10-04 09:34:11 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2021-10-04 09:58:38 +0000
commit3008af2319af2098f4691612f31a431c52ccc52c (patch)
treed13b3e94078fb3028ef4e998a318d639c0b9fdfc /src/mongo/s/catalog_cache.cpp
parent0ae7d4aa4916c5783a523280fe2d4ec3c2897002 (diff)
downloadmongo-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.cpp17
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)