summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEsha Maharishi <esha.maharishi@mongodb.com>2018-04-13 08:49:20 -0400
committerEsha Maharishi <esha.maharishi@mongodb.com>2018-04-13 15:02:37 -0400
commitae329950ae47013397202e48f27b0e318ac6bc10 (patch)
treebd7353fd465029562d692acafd70b6305c3246c1
parent924fa2cdc12faffe6a17e77fb990a91a5239f883 (diff)
downloadmongo-ae329950ae47013397202e48f27b0e318ac6bc10.tar.gz
SERVER-34435 DatabaseVersion idl type should not use lexicographic comparison
-rw-r--r--src/mongo/db/s/database_sharding_state.cpp3
-rw-r--r--src/mongo/s/catalog_cache.cpp4
-rw-r--r--src/mongo/s/database_version.idl5
-rw-r--r--src/mongo/s/versioning.cpp4
-rw-r--r--src/mongo/s/versioning.h1
5 files changed, 14 insertions, 3 deletions
diff --git a/src/mongo/db/s/database_sharding_state.cpp b/src/mongo/db/s/database_sharding_state.cpp
index 7054e91f6c3..fb8c6f35c42 100644
--- a/src/mongo/db/s/database_sharding_state.cpp
+++ b/src/mongo/db/s/database_sharding_state.cpp
@@ -35,6 +35,7 @@
#include "mongo/db/operation_context.h"
#include "mongo/db/s/operation_sharding_state.h"
#include "mongo/s/stale_exception.h"
+#include "mongo/s/versioning.h"
#include "mongo/util/fail_point_service.h"
#include "mongo/util/log.h"
@@ -106,7 +107,7 @@ void DatabaseShardingState::checkDbVersion(OperationContext* opCtx) const {
_dbVersion);
uassert(StaleDbRoutingVersion(dbName, *clientDbVersion, *_dbVersion),
"dbVersion mismatch",
- *clientDbVersion == *_dbVersion);
+ databaseVersion::equal(*clientDbVersion, *_dbVersion));
}
MovePrimarySourceManager* DatabaseShardingState::getMovePrimarySourceManager() {
diff --git a/src/mongo/s/catalog_cache.cpp b/src/mongo/s/catalog_cache.cpp
index 960df99ae17..1e3db67511a 100644
--- a/src/mongo/s/catalog_cache.cpp
+++ b/src/mongo/s/catalog_cache.cpp
@@ -42,6 +42,7 @@
#include "mongo/s/catalog/type_database.h"
#include "mongo/s/client/shard_registry.h"
#include "mongo/s/grid.h"
+#include "mongo/s/versioning.h"
#include "mongo/util/concurrency/with_lock.h"
#include "mongo/util/log.h"
#include "mongo/util/scopeguard.h"
@@ -298,7 +299,8 @@ void CatalogCache::onStaleDatabaseVersion(const StringData dbName,
} else if (itDbEntry->second->needsRefresh) {
// Refresh has been scheduled for the database already
return;
- } else if (!itDbEntry->second->dbt || itDbEntry->second->dbt->getVersion() == databaseVersion) {
+ } else if (!itDbEntry->second->dbt || !itDbEntry->second->dbt->getVersion() ||
+ databaseVersion::equal(*itDbEntry->second->dbt->getVersion(), databaseVersion)) {
// If the versions match, the cached database info is stale, so mark it as needs refresh.
log() << "Marking cached database entry for '" << dbName << "' as stale";
itDbEntry->second->needsRefresh = true;
diff --git a/src/mongo/s/database_version.idl b/src/mongo/s/database_version.idl
index 55a9dd55f10..9eaf8811557 100644
--- a/src/mongo/s/database_version.idl
+++ b/src/mongo/s/database_version.idl
@@ -24,7 +24,10 @@ imports:
structs:
DatabaseVersion:
description: "A (UUID, int) pair that uniquely identifies an incarnation of a database in a cluster and reflects changes to the database's primary shard"
- generate_comparison_operators: true
+ # The generated comparison operators will do a field-wise lexicographic comparison, which
+ # doesn't work because it's nonsensical to lexicographically compare UUIDs.
+ generate_comparison_operators: false
+ strict: true
fields:
uuid:
type: uuid
diff --git a/src/mongo/s/versioning.cpp b/src/mongo/s/versioning.cpp
index 8a465a9cba5..ce51a7b4707 100644
--- a/src/mongo/s/versioning.cpp
+++ b/src/mongo/s/versioning.cpp
@@ -49,5 +49,9 @@ DatabaseVersion makeIncremented(const DatabaseVersion& v) {
return dbv;
}
+bool equal(const DatabaseVersion& dbv1, const DatabaseVersion& dbv2) {
+ return dbv1.getUuid() == dbv2.getUuid() && dbv1.getLastMod() == dbv2.getLastMod();
+}
+
} // namespace databaseVersion
} // namespace mongo
diff --git a/src/mongo/s/versioning.h b/src/mongo/s/versioning.h
index 0c5f9633b2a..472b728e84f 100644
--- a/src/mongo/s/versioning.h
+++ b/src/mongo/s/versioning.h
@@ -33,6 +33,7 @@ namespace databaseVersion {
DatabaseVersion makeNew();
DatabaseVersion makeIncremented(const DatabaseVersion& v);
+bool equal(const DatabaseVersion& dbv1, const DatabaseVersion& dbv2);
} // namespace databaseVersion
} // namespace mongo