summaryrefslogtreecommitdiff
path: root/src/mongo/s/database_version.cpp
diff options
context:
space:
mode:
authorSergi Mateo Bellido <sergi.mateo-bellido@mongodb.com>2020-11-27 08:44:34 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-12-01 09:31:40 +0000
commitecd54f7d5a7d56baf9509e83f0393565369b1936 (patch)
tree4b1dd06243c976ea2abe3719fb7f123b2c00e523 /src/mongo/s/database_version.cpp
parentf8f6d95d4ef13b9530509e82dcba6a6a17a6b83f (diff)
downloadmongo-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.cpp40
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