diff options
author | Esha Maharishi <esha.maharishi@mongodb.com> | 2018-04-13 08:49:20 -0400 |
---|---|---|
committer | Esha Maharishi <esha.maharishi@mongodb.com> | 2018-04-13 15:02:37 -0400 |
commit | ae329950ae47013397202e48f27b0e318ac6bc10 (patch) | |
tree | bd7353fd465029562d692acafd70b6305c3246c1 | |
parent | 924fa2cdc12faffe6a17e77fb990a91a5239f883 (diff) | |
download | mongo-ae329950ae47013397202e48f27b0e318ac6bc10.tar.gz |
SERVER-34435 DatabaseVersion idl type should not use lexicographic comparison
-rw-r--r-- | src/mongo/db/s/database_sharding_state.cpp | 3 | ||||
-rw-r--r-- | src/mongo/s/catalog_cache.cpp | 4 | ||||
-rw-r--r-- | src/mongo/s/database_version.idl | 5 | ||||
-rw-r--r-- | src/mongo/s/versioning.cpp | 4 | ||||
-rw-r--r-- | src/mongo/s/versioning.h | 1 |
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 |