diff options
author | Sergi Mateo Bellido <sergi.mateo-bellido@mongodb.com> | 2020-11-27 08:44:34 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-12-01 09:31:40 +0000 |
commit | ecd54f7d5a7d56baf9509e83f0393565369b1936 (patch) | |
tree | 4b1dd06243c976ea2abe3719fb7f123b2c00e523 /src/mongo/s/database_version.cpp | |
parent | f8f6d95d4ef13b9530509e82dcba6a6a17a6b83f (diff) | |
download | mongo-ecd54f7d5a7d56baf9509e83f0393565369b1936.tar.gz |
SERVER-52587 Making collection and database instances comparable through cluster time (no more epochs)
Part 1: setting up the environment to start comparing DatabaseVersions
through timestamps.
Changelog:
- Moving the ComparableDatabaseVersion class to the DatabaseVersion
header.
- Using ComparableDatabaseVersions in two places where we were doing
DatabaseVersion comparsions.
Diffstat (limited to 'src/mongo/s/database_version.cpp')
-rw-r--r-- | src/mongo/s/database_version.cpp | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/mongo/s/database_version.cpp b/src/mongo/s/database_version.cpp index 53da1268f97..e2043e39299 100644 --- a/src/mongo/s/database_version.cpp +++ b/src/mongo/s/database_version.cpp @@ -33,6 +33,8 @@ namespace mongo { +AtomicWord<uint64_t> ComparableDatabaseVersion::_uuidDisambiguatingSequenceNumSource{1ULL}; + DatabaseVersion DatabaseVersion::makeFixed() { DatabaseVersion dbVersion; dbVersion.setLastMod(0); @@ -45,4 +47,42 @@ DatabaseVersion DatabaseVersion::makeUpdated() const { return newVersion; } +ComparableDatabaseVersion ComparableDatabaseVersion::makeComparableDatabaseVersion( + const DatabaseVersion& version) { + return ComparableDatabaseVersion(version, _uuidDisambiguatingSequenceNumSource.fetchAndAdd(1)); +} + +BSONObj ComparableDatabaseVersion::toBSONForLogging() const { + BSONObjBuilder builder; + if (_dbVersion) + builder.append("dbVersion"_sd, _dbVersion->toBSON()); + else + builder.append("dbVersion"_sd, "None"); + + builder.append("uuidDisambiguatingSequenceNum"_sd, + static_cast<int64_t>(_uuidDisambiguatingSequenceNum)); + + return builder.obj(); +} + +bool ComparableDatabaseVersion::operator==(const ComparableDatabaseVersion& other) const { + if (!_dbVersion && !other._dbVersion) + return true; // Default constructed value + if (_dbVersion.is_initialized() != other._dbVersion.is_initialized()) + return false; // One side is default constructed value + + return *_dbVersion == *other._dbVersion; +} + +bool ComparableDatabaseVersion::operator<(const ComparableDatabaseVersion& other) const { + if (!_dbVersion && !other._dbVersion) + return false; // Default constructed value + + if (_dbVersion && other._dbVersion && _dbVersion->getUuid() == other._dbVersion->getUuid()) { + return _dbVersion->getLastMod() < other._dbVersion->getLastMod(); + } else { + return _uuidDisambiguatingSequenceNum < other._uuidDisambiguatingSequenceNum; + } +} + } // namespace mongo |