diff options
author | Allison Easton <allison.easton@mongodb.com> | 2021-08-16 09:33:00 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2021-08-16 10:14:51 +0000 |
commit | f38a3ad9917367784698a115b4a541bebfb4e65d (patch) | |
tree | 8138fa93d844190cd0c360e559b83804ca484b17 /src/mongo | |
parent | 6044b442c75a730e0d85cd3952ec51088b64c616 (diff) | |
download | mongo-f38a3ad9917367784698a115b4a541bebfb4e65d.tar.gz |
SERVER-58989 Make timestamp required in DatabaseVersionBase IDL
Diffstat (limited to 'src/mongo')
41 files changed, 135 insertions, 266 deletions
diff --git a/src/mongo/db/s/balancer/balance_stats_test.cpp b/src/mongo/db/s/balancer/balance_stats_test.cpp index 0bae93f1693..21d1f7c13f8 100644 --- a/src/mongo/db/s/balancer/balance_stats_test.cpp +++ b/src/mongo/db/s/balancer/balance_stats_test.cpp @@ -75,7 +75,7 @@ private: const NamespaceString _nss{"foo.bar"}; const OID _epoch{OID::gen()}; const ShardId _shardPrimary{"dummyShardPrimary"}; - const DatabaseVersion _dbVersion{UUID::gen()}; + const DatabaseVersion _dbVersion{UUID::gen(), Timestamp()}; ChunkVersion _nextVersion{1, 0, _epoch, boost::none}; }; diff --git a/src/mongo/db/s/balancer/migration_test_fixture.cpp b/src/mongo/db/s/balancer/migration_test_fixture.cpp index 3320a43142d..7744c36d0a7 100644 --- a/src/mongo/db/s/balancer/migration_test_fixture.cpp +++ b/src/mongo/db/s/balancer/migration_test_fixture.cpp @@ -48,7 +48,7 @@ std::shared_ptr<RemoteCommandTargeterMock> MigrationTestFixture::shardTargeterMo } void MigrationTestFixture::setUpDatabase(const std::string& dbName, const ShardId primaryShard) { - DatabaseType db(dbName, primaryShard, true, DatabaseVersion(UUID::gen())); + DatabaseType db(dbName, primaryShard, true, DatabaseVersion(UUID::gen(), Timestamp())); ASSERT_OK(catalogClient()->insertConfigDocument( operationContext(), DatabaseType::ConfigNS, db.toBSON(), kMajorityWriteConcern)); } diff --git a/src/mongo/db/s/collection_metadata_filtering_test.cpp b/src/mongo/db/s/collection_metadata_filtering_test.cpp index 0d10ba6de96..3bd22a6cded 100644 --- a/src/mongo/db/s/collection_metadata_filtering_test.cpp +++ b/src/mongo/db/s/collection_metadata_filtering_test.cpp @@ -110,7 +110,7 @@ protected: }()); ChunkManager cm(ShardId("0"), - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none); ASSERT_EQ(4, cm.numChunks()); diff --git a/src/mongo/db/s/collection_metadata_test.cpp b/src/mongo/db/s/collection_metadata_test.cpp index b4e8e1231b5..1b7c31a3e8d 100644 --- a/src/mongo/db/s/collection_metadata_test.cpp +++ b/src/mongo/db/s/collection_metadata_test.cpp @@ -52,6 +52,7 @@ CollectionMetadata makeCollectionMetadataImpl( const std::vector<std::pair<BSONObj, BSONObj>>& thisShardsChunks, bool staleChunkManager, UUID uuid = UUID::gen(), + Timestamp timestamp = Timestamp(), boost::optional<TypeCollectionReshardingFields> reshardingFields = boost::none) { const OID epoch = OID::gen(); @@ -85,7 +86,7 @@ CollectionMetadata makeCollectionMetadataImpl( return CollectionMetadata( ChunkManager(kThisShard, - DatabaseVersion(uuid), + DatabaseVersion(uuid, timestamp), ShardingTestFixtureCommon::makeStandaloneRoutingTableHistory( RoutingTableHistory::makeNew(kNss, uuid, @@ -134,7 +135,7 @@ protected: (state >= CoordinatorStateEnum::kCommitting) ? reshardingUuid : existingUuid; return makeCollectionMetadataImpl( - KeyPattern(BSON("a" << 1)), {}, false, metadataUuid, reshardingFields); + KeyPattern(BSON("a" << 1)), {}, false, metadataUuid, Timestamp(), reshardingFields); } }; diff --git a/src/mongo/db/s/collection_sharding_runtime_test.cpp b/src/mongo/db/s/collection_sharding_runtime_test.cpp index 52022ffd6a9..bf7de89a625 100644 --- a/src/mongo/db/s/collection_sharding_runtime_test.cpp +++ b/src/mongo/db/s/collection_sharding_runtime_test.cpp @@ -62,7 +62,7 @@ protected: ChunkVersion(1, 0, epoch, boost::none /* timestamp */), ShardId("other")); ChunkManager cm(ShardId("0"), - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory( RoutingTableHistory::makeNew(kTestNss, uuid, @@ -293,8 +293,10 @@ protected: TEST_F(CollectionShardingRuntimeTestWithMockedLoader, ForceShardFilteringMetadataRefreshWithUpdateMetadataFormat) { - const DatabaseType dbType( - kNss.db().toString(), kShardList[0].getName(), true, DatabaseVersion(UUID::gen())); + const DatabaseType dbType(kNss.db().toString(), + kShardList[0].getName(), + true, + DatabaseVersion(UUID::gen(), Timestamp())); const auto epoch = OID::gen(); const Timestamp timestamp(42); @@ -329,8 +331,10 @@ TEST_F(CollectionShardingRuntimeTestWithMockedLoader, TEST_F(CollectionShardingRuntimeTestWithMockedLoader, OnShardVersionMismatchWithUpdateMetadataFormat) { - const DatabaseType dbType( - kNss.db().toString(), kShardList[0].getName(), true, DatabaseVersion(UUID::gen())); + const DatabaseType dbType(kNss.db().toString(), + kShardList[0].getName(), + true, + DatabaseVersion(UUID::gen(), Timestamp())); const auto epoch = OID::gen(); const Timestamp timestamp(42); diff --git a/src/mongo/db/s/config/config_server_test_fixture.cpp b/src/mongo/db/s/config/config_server_test_fixture.cpp index b97f1274455..ffd9c9b4baf 100644 --- a/src/mongo/db/s/config/config_server_test_fixture.cpp +++ b/src/mongo/db/s/config/config_server_test_fixture.cpp @@ -409,7 +409,7 @@ StatusWith<ChunkVersion> ConfigServerTestFixture::getCollectionVersion(Operation void ConfigServerTestFixture::setupDatabase(const std::string& dbName, const ShardId primaryShard, const bool sharded) { - DatabaseType db(dbName, primaryShard, sharded, DatabaseVersion(UUID::gen())); + DatabaseType db(dbName, primaryShard, sharded, DatabaseVersion(UUID::gen(), Timestamp())); ASSERT_OK(catalogClient()->insertConfigDocument(operationContext(), DatabaseType::ConfigNS, db.toBSON(), diff --git a/src/mongo/db/s/config/sharding_catalog_manager_add_shard_test.cpp b/src/mongo/db/s/config/sharding_catalog_manager_add_shard_test.cpp index c9e7a0c81bd..e47bebc388c 100644 --- a/src/mongo/db/s/config/sharding_catalog_manager_add_shard_test.cpp +++ b/src/mongo/db/s/config/sharding_catalog_manager_add_shard_test.cpp @@ -380,9 +380,9 @@ TEST_F(AddShardTest, StandaloneBasicSuccess) { expectedShard.setState(ShardType::ShardState::kShardAware); DatabaseType discoveredDB1( - "TestDB1", ShardId("StandaloneShard"), false, DatabaseVersion(UUID::gen())); + "TestDB1", ShardId("StandaloneShard"), false, DatabaseVersion(UUID::gen(), Timestamp())); DatabaseType discoveredDB2( - "TestDB2", ShardId("StandaloneShard"), false, DatabaseVersion(UUID::gen())); + "TestDB2", ShardId("StandaloneShard"), false, DatabaseVersion(UUID::gen(), Timestamp())); auto expectWriteConcern = ShardingCatalogClient::kMajorityWriteConcern; @@ -466,9 +466,9 @@ TEST_F(AddShardTest, StandaloneGenerateName) { expectedShard.setState(ShardType::ShardState::kShardAware); DatabaseType discoveredDB1( - "TestDB1", ShardId(expectedShardName), false, DatabaseVersion(UUID::gen())); + "TestDB1", ShardId(expectedShardName), false, DatabaseVersion(UUID::gen(), Timestamp())); DatabaseType discoveredDB2( - "TestDB2", ShardId(expectedShardName), false, DatabaseVersion(UUID::gen())); + "TestDB2", ShardId(expectedShardName), false, DatabaseVersion(UUID::gen(), Timestamp())); auto future = launchAsync([this, &expectedShardName, &shardTarget] { ThreadClient tc(getServiceContext()); @@ -810,7 +810,7 @@ TEST_F(AddShardTest, ShardContainsExistingDatabase) { std::string expectedShardName = "mySet"; DatabaseType existingDB( - "existing", ShardId("existingShard"), false, DatabaseVersion(UUID::gen())); + "existing", ShardId("existingShard"), false, DatabaseVersion(UUID::gen(), Timestamp())); // Add a pre-existing database. ASSERT_OK(catalogClient()->insertConfigDocument(operationContext(), @@ -865,7 +865,7 @@ TEST_F(AddShardTest, SuccessfullyAddReplicaSet) { expectedShard.setState(ShardType::ShardState::kShardAware); DatabaseType discoveredDB( - "shardDB", ShardId(expectedShardName), false, DatabaseVersion(UUID::gen())); + "shardDB", ShardId(expectedShardName), false, DatabaseVersion(UUID::gen(), Timestamp())); auto future = launchAsync([this, &expectedShardName, &connString] { ThreadClient tc(getServiceContext()); @@ -930,7 +930,7 @@ TEST_F(AddShardTest, ReplicaSetExtraHostsDiscovered) { expectedShard.setState(ShardType::ShardState::kShardAware); DatabaseType discoveredDB( - "shardDB", ShardId(expectedShardName), false, DatabaseVersion(UUID::gen())); + "shardDB", ShardId(expectedShardName), false, DatabaseVersion(UUID::gen(), Timestamp())); auto future = launchAsync([this, &expectedShardName, &seedString] { ThreadClient tc(getServiceContext()); @@ -996,9 +996,9 @@ TEST_F(AddShardTest, AddShardSucceedsEvenIfAddingDBsFromNewShardFails) { expectedShard.setState(ShardType::ShardState::kShardAware); DatabaseType discoveredDB1( - "TestDB1", ShardId("StandaloneShard"), false, DatabaseVersion(UUID::gen())); + "TestDB1", ShardId("StandaloneShard"), false, DatabaseVersion(UUID::gen(), Timestamp())); DatabaseType discoveredDB2( - "TestDB2", ShardId("StandaloneShard"), false, DatabaseVersion(UUID::gen())); + "TestDB2", ShardId("StandaloneShard"), false, DatabaseVersion(UUID::gen(), Timestamp())); // Enable fail point to cause all updates to fail. Since we add the databases detected from // the shard being added with upserts, but we add the shard document itself via insert, this diff --git a/src/mongo/db/s/config/sharding_catalog_manager_database_operations.cpp b/src/mongo/db/s/config/sharding_catalog_manager_database_operations.cpp index 0a0d1157987..8434c02eeaa 100644 --- a/src/mongo/db/s/config/sharding_catalog_manager_database_operations.cpp +++ b/src/mongo/db/s/config/sharding_catalog_manager_database_operations.cpp @@ -34,13 +34,11 @@ #include <pcrecpp.h> #include "mongo/bson/util/bson_extract.h" -#include "mongo/db/commands/feature_compatibility_version.h" #include "mongo/db/dbdirectclient.h" #include "mongo/db/namespace_string.h" #include "mongo/db/ops/write_ops.h" #include "mongo/db/repl/repl_client_info.h" #include "mongo/db/s/dist_lock_manager.h" -#include "mongo/db/s/sharding_ddl_50_upgrade_downgrade.h" #include "mongo/db/server_options.h" #include "mongo/db/vector_clock.h" #include "mongo/db/write_concern.h" @@ -199,13 +197,8 @@ DatabaseType ShardingCatalogManager::createDatabase(OperationContext* opCtx, optPrimaryShard ? *optPrimaryShard : selectShardForNewDatabase(opCtx, shardRegistry))); - FixedFCVRegion fcvRegion(opCtx); - - boost::optional<Timestamp> clusterTime; - if (DatabaseEntryFormat::get(fcvRegion) == DatabaseEntryFormat::kUUIDandTimestamp) { - const auto now = VectorClock::get(opCtx)->getTime(); - clusterTime = now.clusterTime().asTimestamp(); - } + const auto now = VectorClock::get(opCtx)->getTime(); + const auto clusterTime = now.clusterTime().asTimestamp(); // Pick a primary shard for the new database. DatabaseType db(dbName.toString(), diff --git a/src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp b/src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp index 669ff694087..5be30965ad4 100644 --- a/src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp +++ b/src/mongo/db/s/config/sharding_catalog_manager_shard_operations.cpp @@ -59,7 +59,6 @@ #include "mongo/db/repl/repl_set_config.h" #include "mongo/db/s/add_shard_cmd_gen.h" #include "mongo/db/s/add_shard_util.h" -#include "mongo/db/s/sharding_ddl_50_upgrade_downgrade.h" #include "mongo/db/s/sharding_logging.h" #include "mongo/db/s/type_shard_identity.h" #include "mongo/db/vector_clock_mutable.h" @@ -745,11 +744,8 @@ StatusWith<std::string> ShardingCatalogManager::addShard( // Add all databases which were discovered on the new shard for (const auto& dbName : dbNamesStatus.getValue()) { - boost::optional<Timestamp> clusterTime; - if (DatabaseEntryFormat::get(fcvRegion) == DatabaseEntryFormat::kUUIDandTimestamp) { - const auto now = VectorClock::get(opCtx)->getTime(); - clusterTime = now.clusterTime().asTimestamp(); - } + const auto now = VectorClock::get(opCtx)->getTime(); + const auto clusterTime = now.clusterTime().asTimestamp(); DatabaseType dbt( dbName, shardType.getName(), false, DatabaseVersion(UUID::gen(), clusterTime)); diff --git a/src/mongo/db/s/database_sharding_state_test.cpp b/src/mongo/db/s/database_sharding_state_test.cpp index 4522c060433..007da2b6568 100644 --- a/src/mongo/db/s/database_sharding_state_test.cpp +++ b/src/mongo/db/s/database_sharding_state_test.cpp @@ -118,8 +118,7 @@ public: return std::make_unique<StaticCatalogClient>(kShardList); } - DatabaseType createDatabase(const UUID& uuid, - boost::optional<Timestamp> timestamp = boost::none) { + DatabaseType createDatabase(const UUID& uuid, const Timestamp& timestamp) { return DatabaseType( kDbName.toString(), kShardList[0].getName(), true, DatabaseVersion(uuid, timestamp)); } @@ -129,10 +128,10 @@ protected: }; TEST_F(DatabaseShardingStateTestWithMockedLoader, OnDbVersionMismatch) { - const auto oldDb = createDatabase(UUID::gen()); - const auto newDb = createDatabase(UUID::gen()); + const auto oldDb = createDatabase(UUID::gen(), Timestamp(1)); + const auto newDb = createDatabase(UUID::gen(), Timestamp(2)); - auto checkOnDbVersionMismatch = [&](const auto& newDb) { + auto checkOnDbVersionMismatch = [&](const auto& newDb, bool expectRefresh) { const auto newDbVersion = newDb.getVersion(); auto opCtx = operationContext(); @@ -150,56 +149,23 @@ TEST_F(DatabaseShardingStateTestWithMockedLoader, OnDbVersionMismatch) { activeDbVersion = getActiveDbVersion(); ASSERT_TRUE(activeDbVersion); - ASSERT_EQ(newDbVersion.getTimestamp(), activeDbVersion->getTimestamp()); - }; - - checkOnDbVersionMismatch(oldDb); - checkOnDbVersionMismatch(newDb); - checkOnDbVersionMismatch(oldDb); -} - -TEST_F(DatabaseShardingStateTestWithMockedLoader, OnDbVersionMismatchWithUpdateMetadataFormat) { - const auto uuid = UUID::gen(); - const Timestamp timestamp(42); - - const auto db = createDatabase(uuid); - const auto timestampedDb = createDatabase(uuid, timestamp); - - auto checkOnDbVersionMismatch = [&](const auto& newDb) { - auto opCtx = operationContext(); - - _mockCatalogCacheLoader->setDatabaseRefreshReturnValue(newDb); - - auto getActiveDbVersion = [&] { - AutoGetDb autoDb(opCtx, kDbName, MODE_IS); - const auto dss = DatabaseShardingState::get(opCtx, kDbName); - auto dssLock = DatabaseShardingState::DSSLock::lockShared(opCtx, dss); - return dss->getDbVersion(opCtx, dssLock); - }; - - boost::optional<DatabaseVersion> activeDbVersion = getActiveDbVersion(); - - const auto& newDbVersion = newDb.getVersion(); - ASSERT_OK(onDbVersionMismatchNoExcept(opCtx, kDbName, newDbVersion, activeDbVersion)); - - activeDbVersion = getActiveDbVersion(); - ASSERT_TRUE(activeDbVersion); - ASSERT_EQ(newDbVersion.getTimestamp(), activeDbVersion->getTimestamp()); + if (expectRefresh) { + ASSERT_EQUALS(newDbVersion.getTimestamp(), activeDbVersion->getTimestamp()); + } }; - checkOnDbVersionMismatch(db); - checkOnDbVersionMismatch(timestampedDb); - checkOnDbVersionMismatch(db); + checkOnDbVersionMismatch(oldDb, true); + checkOnDbVersionMismatch(newDb, true); + checkOnDbVersionMismatch(oldDb, false); } -TEST_F(DatabaseShardingStateTestWithMockedLoader, ForceDatabaseRefreshWithUpdateMetadataFormat) { +TEST_F(DatabaseShardingStateTestWithMockedLoader, ForceDatabaseRefresh) { const auto uuid = UUID::gen(); - const Timestamp timestamp(42); - const auto db = createDatabase(uuid); - const auto timestampedDb = createDatabase(uuid, timestamp); + const auto oldDb = createDatabase(uuid, Timestamp(1)); + const auto newDb = createDatabase(uuid, Timestamp(2)); - auto checkForceDatabaseRefresh = [&](const auto& newDb) { + auto checkForceDatabaseRefresh = [&](const auto& newDb, bool expectRefresh) { const auto newDbVersion = newDb.getVersion(); auto opCtx = operationContext(); @@ -213,12 +179,14 @@ TEST_F(DatabaseShardingStateTestWithMockedLoader, ForceDatabaseRefreshWithUpdate return dss->getDbVersion(opCtx, dssLock); }(); ASSERT_TRUE(activeDbVersion); - ASSERT_EQ(newDbVersion.getTimestamp(), activeDbVersion->getTimestamp()); + if (expectRefresh) { + ASSERT_EQ(newDbVersion.getTimestamp(), activeDbVersion->getTimestamp()); + } }; - checkForceDatabaseRefresh(db); - checkForceDatabaseRefresh(timestampedDb); - checkForceDatabaseRefresh(db); + checkForceDatabaseRefresh(oldDb, true); + checkForceDatabaseRefresh(newDb, true); + checkForceDatabaseRefresh(oldDb, false); } } // namespace diff --git a/src/mongo/db/s/metadata_manager_test.cpp b/src/mongo/db/s/metadata_manager_test.cpp index dc59cd318e4..3002cafe317 100644 --- a/src/mongo/db/s/metadata_manager_test.cpp +++ b/src/mongo/db/s/metadata_manager_test.cpp @@ -94,7 +94,7 @@ protected: kNss, range, ChunkVersion(1, 0, epoch, boost::none /* timestamp */), kOtherShard}}); return CollectionMetadata(ChunkManager(kThisShard, - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none), kThisShard); diff --git a/src/mongo/db/s/migration_chunk_cloner_source_legacy_test.cpp b/src/mongo/db/s/migration_chunk_cloner_source_legacy_test.cpp index 8331d16be84..ffdf12f08c8 100644 --- a/src/mongo/db/s/migration_chunk_cloner_source_legacy_test.cpp +++ b/src/mongo/db/s/migration_chunk_cloner_source_legacy_test.cpp @@ -144,7 +144,7 @@ protected: } /** - * Creates a collection, which contains an index corresponding to kShardKeyPattern and insers + * Creates a collection, which contains an index corresponding to kShardKeyPattern and inserts * the specified initial documents. */ void createShardedCollection(const std::vector<BSONObj>& initialDocs) { @@ -187,7 +187,7 @@ protected: operationContext(), CollectionMetadata( ChunkManager(ShardId("dummyShardId"), - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none), ShardId("dummyShardId"))); diff --git a/src/mongo/db/s/migration_util_test.cpp b/src/mongo/db/s/migration_util_test.cpp index 48ca52613fc..3c50b5eab20 100644 --- a/src/mongo/db/s/migration_util_test.cpp +++ b/src/mongo/db/s/migration_util_test.cpp @@ -350,8 +350,9 @@ public: const ShardKeyPattern kShardKeyPattern = ShardKeyPattern(BSON("_id" << 1)); const UUID kDefaultUUID = UUID::gen(); const OID kEpoch = OID::gen(); - const DatabaseType kDefaultDatabaseType = - DatabaseType(kNss.db().toString(), ShardId("0"), true, DatabaseVersion(kDefaultUUID)); + const Timestamp kDefaultTimestamp = Timestamp(); + const DatabaseType kDefaultDatabaseType = DatabaseType( + kNss.db().toString(), ShardId("0"), true, DatabaseVersion(kDefaultUUID, kDefaultTimestamp)); const std::vector<ShardType> kShardList = {ShardType("0", "Host0:12345"), ShardType("1", "Host1:12345")}; diff --git a/src/mongo/db/s/op_observer_sharding_test.cpp b/src/mongo/db/s/op_observer_sharding_test.cpp index 9f67cb2c930..076f4d8ee82 100644 --- a/src/mongo/db/s/op_observer_sharding_test.cpp +++ b/src/mongo/db/s/op_observer_sharding_test.cpp @@ -82,7 +82,7 @@ protected: {std::move(chunk)}); return CollectionMetadata(ChunkManager(ShardId("this"), - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory(std::move(rt)), Timestamp(100, 0)), ShardId("this")); diff --git a/src/mongo/db/s/operation_sharding_state.cpp b/src/mongo/db/s/operation_sharding_state.cpp index 1280a50e9a6..66a91cdb2b1 100644 --- a/src/mongo/db/s/operation_sharding_state.cpp +++ b/src/mongo/db/s/operation_sharding_state.cpp @@ -102,8 +102,8 @@ void OperationShardingState::initializeClientRoutingVersions( } } if (dbVersion) { - invariant(_databaseVersions.find(nss.db()) == _databaseVersions.end()); - _databaseVersions[nss.db()] = *dbVersion; + const auto [_, inserted] = _databaseVersions.emplace(nss.db(), *dbVersion); + invariant(inserted); } } diff --git a/src/mongo/db/s/range_deletion_util_test.cpp b/src/mongo/db/s/range_deletion_util_test.cpp index f4300ae3a2c..1b0e75d6327 100644 --- a/src/mongo/db/s/range_deletion_util_test.cpp +++ b/src/mongo/db/s/range_deletion_util_test.cpp @@ -121,7 +121,7 @@ public: ->setFilteringMetadata( operationContext(), CollectionMetadata(ChunkManager(ShardId("dummyShardId"), - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none), ShardId("dummyShardId"))); diff --git a/src/mongo/db/s/resharding/resharding_coordinator_service_test.cpp b/src/mongo/db/s/resharding/resharding_coordinator_service_test.cpp index 638075c34f3..234d148641d 100644 --- a/src/mongo/db/s/resharding/resharding_coordinator_service_test.cpp +++ b/src/mongo/db/s/resharding/resharding_coordinator_service_test.cpp @@ -387,7 +387,7 @@ public: DatabaseType dbDoc(coordinatorDoc.getSourceNss().db().toString(), coordinatorDoc.getDonorShards().front().getId(), true, - DatabaseVersion{UUID::gen()}); + DatabaseVersion{UUID::gen(), Timestamp()}); client.insert(DatabaseType::ConfigNS.ns(), dbDoc.toBSON()); return coordinatorDoc; diff --git a/src/mongo/db/s/resharding/resharding_data_replication_test.cpp b/src/mongo/db/s/resharding/resharding_data_replication_test.cpp index a911af349f7..9e8b4d1c3e1 100644 --- a/src/mongo/db/s/resharding/resharding_data_replication_test.cpp +++ b/src/mongo/db/s/resharding/resharding_data_replication_test.cpp @@ -92,7 +92,7 @@ public: chunks); return ChunkManager(_myDonorId, - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none /* clusterTime */); } diff --git a/src/mongo/db/s/resharding/resharding_donor_recipient_common_test.h b/src/mongo/db/s/resharding/resharding_donor_recipient_common_test.h index 499ff3a5301..858cdc4643c 100644 --- a/src/mongo/db/s/resharding/resharding_donor_recipient_common_test.h +++ b/src/mongo/db/s/resharding/resharding_donor_recipient_common_test.h @@ -51,6 +51,7 @@ using namespace fmt::literals; class ReshardingDonorRecipientCommonInternalsTest : public ShardServerTestFixture { public: const UUID kExistingUUID = UUID::gen(); + const Timestamp kExistingTimestamp = Timestamp(); const NamespaceString kOriginalNss = NamespaceString("db", "foo"); const NamespaceString kTemporaryReshardingNss = @@ -62,6 +63,7 @@ public: const OID kOriginalEpoch = OID::gen(); const OID kReshardingEpoch = OID::gen(); const UUID kReshardingUUID = UUID::gen(); + const Timestamp kReshardingTimestamp = Timestamp(kExistingTimestamp.getSecs() + 1, 0); const DonorShardFetchTimestamp kThisShard = makeDonorShardFetchTimestamp(ShardId("shardOne"), Timestamp(10, 0)); @@ -80,6 +82,7 @@ protected: kOriginalShardKey, kOriginalShardKeyPattern, kExistingUUID, + kExistingTimestamp, kOriginalEpoch, shardThatChunkExistsOn); } @@ -91,6 +94,7 @@ protected: kReshardingKey, kReshardingKeyPattern, kReshardingUUID, + kReshardingTimestamp, kReshardingEpoch, shardThatChunkExistsOn); } @@ -100,13 +104,14 @@ protected: const std::string& shardKey, const BSONObj& shardKeyPattern, const UUID& uuid, + const Timestamp& timestamp, const OID& epoch, const ShardId& shardThatChunkExistsOn) { auto range = ChunkRange(BSON(shardKey << MINKEY), BSON(shardKey << MAXKEY)); auto chunk = ChunkType( nss, std::move(range), ChunkVersion(1, 0, epoch, boost::none), shardThatChunkExistsOn); ChunkManager cm(kThisShard.getShardId(), - DatabaseVersion(uuid), + DatabaseVersion(uuid, timestamp), makeStandaloneRoutingTableHistory( RoutingTableHistory::makeNew(nss, uuid, diff --git a/src/mongo/db/s/resharding/resharding_oplog_applier_test.cpp b/src/mongo/db/s/resharding/resharding_oplog_applier_test.cpp index ef205fbd7fe..b503567685b 100644 --- a/src/mongo/db/s/resharding/resharding_oplog_applier_test.cpp +++ b/src/mongo/db/s/resharding/resharding_oplog_applier_test.cpp @@ -197,7 +197,7 @@ public: chunks); return ChunkManager(_sourceId.getShardId(), - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none); } diff --git a/src/mongo/db/s/resharding/resharding_oplog_batch_applier_test.cpp b/src/mongo/db/s/resharding/resharding_oplog_batch_applier_test.cpp index 88160624032..c97b47ffce8 100644 --- a/src/mongo/db/s/resharding/resharding_oplog_batch_applier_test.cpp +++ b/src/mongo/db/s/resharding/resharding_oplog_batch_applier_test.cpp @@ -306,7 +306,7 @@ private: chunks); return ChunkManager(_myDonorId, - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none /* clusterTime */); } diff --git a/src/mongo/db/s/resharding/resharding_oplog_crud_application_test.cpp b/src/mongo/db/s/resharding/resharding_oplog_crud_application_test.cpp index b155330628d..b933e609fc1 100644 --- a/src/mongo/db/s/resharding/resharding_oplog_crud_application_test.cpp +++ b/src/mongo/db/s/resharding/resharding_oplog_crud_application_test.cpp @@ -268,7 +268,7 @@ private: chunks); return ChunkManager(_myDonorId, - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none /* clusterTime */); } diff --git a/src/mongo/db/s/resharding/resharding_recipient_service_external_state_test.cpp b/src/mongo/db/s/resharding/resharding_recipient_service_external_state_test.cpp index ba38767c4be..074a5f74aaa 100644 --- a/src/mongo/db/s/resharding/resharding_recipient_service_external_state_test.cpp +++ b/src/mongo/db/s/resharding/resharding_recipient_service_external_state_test.cpp @@ -203,10 +203,10 @@ public: void expectStaleDbVersionError(const NamespaceString& nss, StringData expectedCmdName) { onCommand([&](const executor::RemoteCommandRequest& request) { ASSERT_EQ(request.cmdObj.firstElementFieldNameStringData(), expectedCmdName); - return createErrorCursorResponse( - Status(StaleDbRoutingVersion( - nss.db().toString(), DatabaseVersion(UUID::gen()), boost::none), - "dummy stale db version error")); + return createErrorCursorResponse(Status( + StaleDbRoutingVersion( + nss.db().toString(), DatabaseVersion(UUID::gen(), Timestamp()), boost::none), + "dummy stale db version error")); }); } diff --git a/src/mongo/db/s/resharding/resharding_recipient_service_test.cpp b/src/mongo/db/s/resharding/resharding_recipient_service_test.cpp index 5dbe89aab0b..481d04a3556 100644 --- a/src/mongo/db/s/resharding/resharding_recipient_service_test.cpp +++ b/src/mongo/db/s/resharding/resharding_recipient_service_test.cpp @@ -97,7 +97,7 @@ public: chunks); return ChunkManager(_someDonorId, - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), _makeStandaloneRoutingTableHistory(std::move(rt)), boost::none /* clusterTime */); } diff --git a/src/mongo/db/s/resharding_destined_recipient_test.cpp b/src/mongo/db/s/resharding_destined_recipient_test.cpp index 26eb6ca32d0..362a88e9c30 100644 --- a/src/mongo/db/s/resharding_destined_recipient_test.cpp +++ b/src/mongo/db/s/resharding_destined_recipient_test.cpp @@ -178,7 +178,7 @@ protected: UUID sourceUuid; ShardId destShard; ChunkVersion version; - DatabaseVersion dbVersion; + DatabaseVersion dbVersion{UUID::gen(), Timestamp()}; }; ReshardingEnv setupReshardingEnv(OperationContext* opCtx, bool refreshTempNss) { @@ -196,7 +196,6 @@ protected: ReshardingEnv env(CollectionCatalog::get(opCtx)->lookupUUIDByNSS(opCtx, kNss).value()); env.destShard = kShardList[1].getName(); env.version = ChunkVersion(1, 0, OID::gen(), boost::none /* timestamp */); - env.dbVersion = DatabaseVersion(UUID::gen()); env.tempNss = NamespaceString(kNss.db(), fmt::format("{}{}", diff --git a/src/mongo/db/s/shard_server_catalog_cache_loader_test.cpp b/src/mongo/db/s/shard_server_catalog_cache_loader_test.cpp index 9f4443d8069..09ed06890cf 100644 --- a/src/mongo/db/s/shard_server_catalog_cache_loader_test.cpp +++ b/src/mongo/db/s/shard_server_catalog_cache_loader_test.cpp @@ -440,7 +440,7 @@ TEST_F(ShardServerCatalogCacheLoaderTest, PrimaryLoadFromShardedAndFindMixedChun TEST_F(ShardServerCatalogCacheLoaderTest, PrimaryLoadFromShardedAndFindDbMetadataFormatChanged) { const std::string dbName("dbName"); - DatabaseVersion version(UUID::gen()); + DatabaseVersion version(UUID::gen(), Timestamp()); DatabaseType dbType(dbName, kShardId, true /* sharded */, version); _remoteLoaderMock->setDatabaseRefreshReturnValue(dbType); diff --git a/src/mongo/db/s/sharding_ddl_50_upgrade_downgrade.cpp b/src/mongo/db/s/sharding_ddl_50_upgrade_downgrade.cpp index d372eb4d47a..254ed55ad68 100644 --- a/src/mongo/db/s/sharding_ddl_50_upgrade_downgrade.cpp +++ b/src/mongo/db/s/sharding_ddl_50_upgrade_downgrade.cpp @@ -36,21 +36,6 @@ namespace mongo { using FeatureCompatibility = ServerGlobalParams::FeatureCompatibility; using FCVersion = FeatureCompatibility::Version; -DatabaseEntryFormat::Format DatabaseEntryFormat::get(const FixedFCVRegion& fcvRegion) { - switch (fcvRegion->getVersion()) { - case FCVersion::kUpgradingFrom44To50: - case FCVersion::kUpgradingFrom49To50: - case FCVersion::kUpgradingFrom50To51: - case FCVersion::kDowngradingFrom51To50: - case FCVersion::kFullyDowngradedTo50: - case FCVersion::kVersion51: - return Format::kUUIDandTimestamp; - - default: - return Format::kUUIDOnly; - } -} - ChunkEntryFormat::Format ChunkEntryFormat::get(const FixedFCVRegion& fcvRegion) { return getForVersionCallerGuaranteesFCVStability(fcvRegion->getVersion()); } diff --git a/src/mongo/db/s/sharding_ddl_50_upgrade_downgrade.h b/src/mongo/db/s/sharding_ddl_50_upgrade_downgrade.h index 9383d0a6c8a..cb0c23ee63b 100644 --- a/src/mongo/db/s/sharding_ddl_50_upgrade_downgrade.h +++ b/src/mongo/db/s/sharding_ddl_50_upgrade_downgrade.h @@ -33,15 +33,6 @@ namespace mongo { -struct DatabaseEntryFormat { - enum Format { - kUUIDOnly, - kUUIDandTimestamp, - }; - - static Format get(const FixedFCVRegion& fcvRegion); -}; - struct ChunkEntryFormat { enum Format { kNamespaceOnlyNoTimestamps, // Chunks have ns, no timestamps in the version diff --git a/src/mongo/s/build_versioned_requests_for_targeted_shards_test.cpp b/src/mongo/s/build_versioned_requests_for_targeted_shards_test.cpp index accbd515922..f82794e31f3 100644 --- a/src/mongo/s/build_versioned_requests_for_targeted_shards_test.cpp +++ b/src/mongo/s/build_versioned_requests_for_targeted_shards_test.cpp @@ -73,7 +73,8 @@ protected: void expectGetDatabaseUnsharded() { expectFindSendBSONObjVector(kConfigHostAndPort, [&]() { - DatabaseType db(kNss.db().toString(), {"0"}, false, DatabaseVersion(UUID::gen())); + DatabaseType db( + kNss.db().toString(), {"0"}, false, DatabaseVersion(UUID::gen(), Timestamp())); return std::vector<BSONObj>{db.toBSON()}; }()); } diff --git a/src/mongo/s/catalog/sharding_catalog_client_test.cpp b/src/mongo/s/catalog/sharding_catalog_client_test.cpp index 54528489f36..cd23a564d32 100644 --- a/src/mongo/s/catalog/sharding_catalog_client_test.cpp +++ b/src/mongo/s/catalog/sharding_catalog_client_test.cpp @@ -158,7 +158,8 @@ TEST_F(ShardingCatalogClientTest, GetDatabaseInvalidName) { TEST_F(ShardingCatalogClientTest, GetDatabaseExisting) { configTargeter()->setFindHostReturnValue(HostAndPort("TestHost1")); - DatabaseType expectedDb("bigdata", ShardId("shard0000"), true, DatabaseVersion(UUID::gen())); + DatabaseType expectedDb( + "bigdata", ShardId("shard0000"), true, DatabaseVersion(UUID::gen(), Timestamp())); const OpTime newOpTime(Timestamp(7, 6), 5); @@ -205,7 +206,8 @@ TEST_F(ShardingCatalogClientTest, GetDatabaseStaleSecondaryRetrySuccess) { HostAndPort secondHost{"TestHost2"}; configTargeter()->setFindHostReturnValue(firstHost); - DatabaseType expectedDb("bigdata", ShardId("shard0000"), true, DatabaseVersion(UUID::gen())); + DatabaseType expectedDb( + "bigdata", ShardId("shard0000"), true, DatabaseVersion(UUID::gen(), Timestamp())); auto future = launchAsync([this, &expectedDb] { return catalogClient()->getDatabase( @@ -891,8 +893,10 @@ TEST_F(ShardingCatalogClientTest, GetCollectionsInvalidCollectionType) { TEST_F(ShardingCatalogClientTest, GetDatabasesForShardValid) { configTargeter()->setFindHostReturnValue(HostAndPort("TestHost1")); - DatabaseType dbt1("db1", ShardId("shard0000"), false, DatabaseVersion(UUID::gen())); - DatabaseType dbt2("db2", ShardId("shard0000"), false, DatabaseVersion(UUID::gen())); + DatabaseType dbt1( + "db1", ShardId("shard0000"), false, DatabaseVersion(UUID::gen(), Timestamp())); + DatabaseType dbt2( + "db2", ShardId("shard0000"), false, DatabaseVersion(UUID::gen(), Timestamp())); auto future = launchAsync([this] { return assertGet( @@ -934,7 +938,7 @@ TEST_F(ShardingCatalogClientTest, GetDatabasesForShardInvalidDoc) { }); onFindCommand([](const RemoteCommandRequest& request) { - DatabaseType dbt1("db1", {"shard0000"}, false, DatabaseVersion(UUID::gen())); + DatabaseType dbt1("db1", {"shard0000"}, false, DatabaseVersion(UUID::gen(), Timestamp())); return vector<BSONObj>{ dbt1.toBSON(), BSON(DatabaseType::name() << 0) // DatabaseType::name() should be a string @@ -1039,7 +1043,7 @@ TEST_F(ShardingCatalogClientTest, GetTagsForCollectionInvalidTag) { TEST_F(ShardingCatalogClientTest, UpdateDatabase) { configTargeter()->setFindHostReturnValue(HostAndPort("TestHost1")); - DatabaseType dbt("test", ShardId("shard0000"), true, DatabaseVersion(UUID::gen())); + DatabaseType dbt("test", ShardId("shard0000"), true, DatabaseVersion(UUID::gen(), Timestamp())); auto future = launchAsync([this, dbt] { auto status = @@ -1086,7 +1090,8 @@ TEST_F(ShardingCatalogClientTest, UpdateConfigDocumentNonRetryableError) { HostAndPort host1("TestHost1"); configTargeter()->setFindHostReturnValue(host1); - DatabaseType dbt("test", ShardId("shard0001"), false, DatabaseVersion(UUID::gen())); + DatabaseType dbt( + "test", ShardId("shard0001"), false, DatabaseVersion(UUID::gen(), Timestamp())); auto future = launchAsync([this, dbt] { auto status = @@ -1287,7 +1292,8 @@ TEST_F(ShardingCatalogClientTest, RetryOnFindCommandNetworkErrorSucceedsAtMaxRet } onFindCommand([](const RemoteCommandRequest& request) { - DatabaseType dbType("TestDB", ShardId("TestShard"), true, DatabaseVersion(UUID::gen())); + DatabaseType dbType( + "TestDB", ShardId("TestShard"), true, DatabaseVersion(UUID::gen(), Timestamp())); return vector<BSONObj>{dbType.toBSON()}; }); diff --git a/src/mongo/s/catalog/type_database_test.cpp b/src/mongo/s/catalog/type_database_test.cpp index 8a9eb73dcda..fe126d6b390 100644 --- a/src/mongo/s/catalog/type_database_test.cpp +++ b/src/mongo/s/catalog/type_database_test.cpp @@ -47,10 +47,12 @@ TEST(DatabaseType, Empty) { TEST(DatabaseType, Basic) { UUID uuid = UUID::gen(); + Timestamp timestamp = Timestamp(); StatusWith<DatabaseType> status = DatabaseType::fromBSON( BSON(DatabaseType::name("mydb") << DatabaseType::primary("shard") << DatabaseType::sharded(true) - << DatabaseType::version(BSON("uuid" << uuid << "lastMod" << 0)))); + << DatabaseType::version( + BSON("uuid" << uuid << "lastMod" << 0 << "timestamp" << timestamp)))); ASSERT_TRUE(status.isOK()); DatabaseType db = status.getValue(); diff --git a/src/mongo/s/catalog_cache_refresh_test.cpp b/src/mongo/s/catalog_cache_refresh_test.cpp index 6a527696088..9560317bc54 100644 --- a/src/mongo/s/catalog_cache_refresh_test.cpp +++ b/src/mongo/s/catalog_cache_refresh_test.cpp @@ -59,7 +59,8 @@ protected: void expectGetDatabase() { expectFindSendBSONObjVector(kConfigHostAndPort, [&]() { - DatabaseType db(kNss.db().toString(), {"0"}, true, DatabaseVersion(UUID::gen())); + DatabaseType db( + kNss.db().toString(), {"0"}, true, DatabaseVersion(UUID::gen(), Timestamp())); return std::vector<BSONObj>{db.toBSON()}; }()); } diff --git a/src/mongo/s/catalog_cache_test.cpp b/src/mongo/s/catalog_cache_test.cpp index 0d6827577ff..5e5d41c7df8 100644 --- a/src/mongo/s/catalog_cache_test.cpp +++ b/src/mongo/s/catalog_cache_test.cpp @@ -181,7 +181,7 @@ protected: TEST_F(CatalogCacheTest, GetDatabase) { const auto dbName = "testDB"; - const auto dbVersion = DatabaseVersion(UUID::gen()); + const auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); _catalogCacheLoader->setDatabaseRefreshReturnValue( DatabaseType(dbName, kShards[0], true, dbVersion)); @@ -197,7 +197,7 @@ TEST_F(CatalogCacheTest, GetDatabase) { TEST_F(CatalogCacheTest, GetCachedDatabase) { const auto dbName = "testDB"; - const auto dbVersion = DatabaseVersion(UUID::gen()); + const auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); loadDatabases({DatabaseType(dbName, kShards[0], true, dbVersion)}); const auto swDatabase = _catalogCache->getDatabase(operationContext(), dbName); @@ -212,7 +212,7 @@ TEST_F(CatalogCacheTest, GetCachedDatabase) { TEST_F(CatalogCacheTest, InvalidateSingleDbOnShardRemoval) { const auto dbName = "testDB"; - const auto dbVersion = DatabaseVersion(UUID::gen()); + const auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); loadDatabases({DatabaseType(dbName, kShards[0], true, dbVersion)}); _catalogCache->invalidateEntriesThatReferenceShard(kShards[0]); @@ -227,7 +227,7 @@ TEST_F(CatalogCacheTest, InvalidateSingleDbOnShardRemoval) { TEST_F(CatalogCacheTest, OnStaleDatabaseVersionNoVersion) { // onStaleDatabaseVesrsion must invalidate the database entry if invoked with no version - const auto dbVersion = DatabaseVersion(UUID::gen()); + const auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); loadDatabases({DatabaseType(kNss.db().toString(), kShards[0], true, dbVersion)}); _catalogCache->onStaleDatabaseVersion(kNss.db(), boost::none); @@ -237,7 +237,7 @@ TEST_F(CatalogCacheTest, OnStaleDatabaseVersionNoVersion) { } TEST_F(CatalogCacheTest, OnStaleShardVersionWithSameVersion) { - const auto dbVersion = DatabaseVersion(UUID::gen()); + const auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); const auto cachedCollVersion = ChunkVersion(1, 0, OID::gen(), boost::none /* timestamp */); loadDatabases({DatabaseType(kNss.db().toString(), kShards[0], true, dbVersion)}); @@ -248,7 +248,7 @@ TEST_F(CatalogCacheTest, OnStaleShardVersionWithSameVersion) { } TEST_F(CatalogCacheTest, OnStaleShardVersionWithNoVersion) { - const auto dbVersion = DatabaseVersion(UUID::gen()); + const auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); const auto cachedCollVersion = ChunkVersion(1, 0, OID::gen(), boost::none /* timestamp */); loadDatabases({DatabaseType(kNss.db().toString(), kShards[0], true, dbVersion)}); @@ -261,7 +261,7 @@ TEST_F(CatalogCacheTest, OnStaleShardVersionWithNoVersion) { } TEST_F(CatalogCacheTest, OnStaleShardVersionWithGraterVersion) { - const auto dbVersion = DatabaseVersion(UUID::gen()); + const auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); const auto cachedCollVersion = ChunkVersion(1, 0, OID::gen(), boost::none /* timestamp */); const auto wantedCollVersion = ChunkVersion(2, 0, cachedCollVersion.epoch(), cachedCollVersion.getTimestamp()); @@ -278,7 +278,7 @@ TEST_F(CatalogCacheTest, OnStaleShardVersionWithGraterVersion) { TEST_F(CatalogCacheTest, GetDatabaseWithMetadataFormatChange) { const auto dbName = "testDB"; const auto uuid = UUID::gen(); - const DatabaseVersion versionWithoutTimestamp(uuid); + const DatabaseVersion versionWithoutTimestamp(uuid, Timestamp()); const DatabaseVersion versionWithTimestamp(uuid, Timestamp(42)); auto getDatabaseWithRefreshAndCheckResults = [&](const DatabaseVersion& version) { @@ -303,7 +303,7 @@ TEST_F(CatalogCacheTest, GetDatabaseWithMetadataFormatChange) { } TEST_F(CatalogCacheTest, GetCollectionWithMetadataFormatChange) { - const auto dbVersion = DatabaseVersion(UUID::gen()); + const auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); const auto epoch = OID::gen(); const auto collVersionWithoutTimestamp = ChunkVersion(1, 0, epoch, boost::none /* timestamp */); const auto collVersionWithTimestamp = ChunkVersion(1, 0, epoch, Timestamp(42)); @@ -342,7 +342,7 @@ TEST_F(CatalogCacheTest, GetCollectionWithMetadataFormatChange) { TEST_F(CatalogCacheTest, GetCollectionWithRefreshDuringUpgradeWithMetadataFormatChangeChunksDontMatchCollection) { - const auto dbVersion = DatabaseVersion(UUID::gen()); + const auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); const auto epoch = OID::gen(); const auto timestamp = Timestamp(42); @@ -372,7 +372,7 @@ TEST_F(CatalogCacheTest, TEST_F(CatalogCacheTest, GetCollectionWithRefreshDuringUpgradeWithMetadataFormatChangeSomeChunksMatchCollection) { - const auto dbVersion = DatabaseVersion(UUID::gen()); + const auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); const auto epoch = OID::gen(); const auto timestamp = Timestamp(42); @@ -409,7 +409,7 @@ TEST_F(CatalogCacheTest, } TEST_F(CatalogCacheTest, GetCollectionWithRefreshDuringDowngradeWithMetadataFormatChange) { - const auto dbVersion = DatabaseVersion(UUID::gen()); + const auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); const auto epoch = OID::gen(); const auto timestamp = Timestamp(42); @@ -438,7 +438,7 @@ TEST_F(CatalogCacheTest, GetCollectionWithRefreshDuringDowngradeWithMetadataForm } TEST_F(CatalogCacheTest, TimeseriesFieldsAreProperlyPropagatedOnCC) { - const auto dbVersion = DatabaseVersion(UUID::gen()); + const auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); const auto epoch = OID::gen(); const auto version = ChunkVersion(1, 0, epoch, Timestamp(42)); @@ -461,7 +461,7 @@ TEST_F(CatalogCacheTest, TimeseriesFieldsAreProperlyPropagatedOnCC) { } TEST_F(CatalogCacheTest, LookupCollectionWithInvalidOptions) { - const auto dbVersion = DatabaseVersion(UUID::gen()); + const auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); const auto epoch = OID::gen(); const auto version = ChunkVersion(1, 0, epoch, Timestamp(42)); diff --git a/src/mongo/s/catalog_cache_test_fixture.cpp b/src/mongo/s/catalog_cache_test_fixture.cpp index 30ac640025c..975c8804914 100644 --- a/src/mongo/s/catalog_cache_test_fixture.cpp +++ b/src/mongo/s/catalog_cache_test_fixture.cpp @@ -133,7 +133,8 @@ ChunkManager CatalogCacheTestFixture::makeChunkManager( ChunkVersion version(1, 0, OID::gen(), boost::none /* timestamp */); const BSONObj databaseBSON = [&]() { - DatabaseType db(nss.db().toString(), {"0"}, true, DatabaseVersion(UUID::gen())); + DatabaseType db( + nss.db().toString(), {"0"}, true, DatabaseVersion(UUID::gen(), Timestamp())); return db.toBSON(); }(); @@ -194,7 +195,8 @@ ChunkManager CatalogCacheTestFixture::makeChunkManager( void CatalogCacheTestFixture::expectGetDatabase(NamespaceString nss, std::string shardId) { expectFindSendBSONObjVector(kConfigHostAndPort, [&]() { - DatabaseType db(nss.db().toString(), {shardId}, true, DatabaseVersion(UUID::gen())); + DatabaseType db( + nss.db().toString(), {shardId}, true, DatabaseVersion(UUID::gen(), Timestamp())); return std::vector<BSONObj>{db.toBSON()}; }()); } diff --git a/src/mongo/s/chunk_manager_query_test.cpp b/src/mongo/s/chunk_manager_query_test.cpp index 47b325d5414..5d9832ae690 100644 --- a/src/mongo/s/chunk_manager_query_test.cpp +++ b/src/mongo/s/chunk_manager_query_test.cpp @@ -533,7 +533,7 @@ TEST_F(ChunkManagerQueryTest, SnapshotQueryWithMoreShardsThanLatestMetadata) { ChunkHistory(Timestamp(1, 0), ShardId("1"))}); ChunkManager chunkManager(ShardId("0"), - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory(oldRoutingTable.makeUpdated( boost::none, boost::none, true, {chunk1})), Timestamp(5, 0)); diff --git a/src/mongo/s/chunk_manager_refresh_bm.cpp b/src/mongo/s/chunk_manager_refresh_bm.cpp index dd1012548dc..a8c7b626331 100644 --- a/src/mongo/s/chunk_manager_refresh_bm.cpp +++ b/src/mongo/s/chunk_manager_refresh_bm.cpp @@ -92,7 +92,7 @@ CollectionMetadata makeChunkManagerWithShardSelector(int nShards, true, chunks); return CollectionMetadata(ChunkManager(ShardId("Shard0"), - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none), ShardId("shard0")); @@ -123,7 +123,7 @@ MONGO_COMPILER_NOINLINE auto runIncrementalUpdate(const CollectionMetadata& cm, auto rt = cm.getChunkManager()->getRoutingTableHistory_ForTest().makeUpdated( boost::none, boost::none, true, newChunks); return CollectionMetadata(ChunkManager(ShardId("shard0"), - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none), ShardId("shard0")); @@ -184,7 +184,7 @@ auto BM_FullBuildOfChunkManager(benchmark::State& state, ShardSelectorFn selectS chunks); benchmark::DoNotOptimize( CollectionMetadata(ChunkManager(ShardId("shard0"), - DatabaseVersion(UUID::gen()), + DatabaseVersion(UUID::gen(), Timestamp()), makeStandaloneRoutingTableHistory(std::move(rt)), boost::none), ShardId("shard0"))); diff --git a/src/mongo/s/comparable_database_version_test.cpp b/src/mongo/s/comparable_database_version_test.cpp index cbf2d9b6869..2e2ce305ed9 100644 --- a/src/mongo/s/comparable_database_version_test.cpp +++ b/src/mongo/s/comparable_database_version_test.cpp @@ -42,7 +42,6 @@ TEST(ComparableDatabaseVersionTest, VersionsEqual) { ASSERT(version == version); }; - versionsEqual(DatabaseVersion(UUID::gen())); versionsEqual(DatabaseVersion(UUID::gen(), Timestamp(1))); } @@ -53,20 +52,9 @@ TEST(ComparableDatabaseVersionTest, VersionsEqualAfterCopy) { ASSERT(version1 == version2); }; - versionsEqualAfterCopy(DatabaseVersion(UUID::gen())); versionsEqualAfterCopy(DatabaseVersion(UUID::gen(), Timestamp(1))); } -TEST(ComparableDatabaseVersionTest, CompareVersionDifferentUuids) { - const auto version1 = - ComparableDatabaseVersion::makeComparableDatabaseVersion(DatabaseVersion(UUID::gen())); - const auto version2 = - ComparableDatabaseVersion::makeComparableDatabaseVersion(DatabaseVersion(UUID::gen())); - ASSERT(version2 != version1); - ASSERT(version2 > version1); - ASSERT_FALSE(version2 < version1); -} - TEST(ComparableDatabaseVersionTest, CompareVersionDifferentTimestamps) { const auto version1 = ComparableDatabaseVersion::makeComparableDatabaseVersion( DatabaseVersion(UUID::gen(), Timestamp(3))); @@ -77,57 +65,6 @@ TEST(ComparableDatabaseVersionTest, CompareVersionDifferentTimestamps) { ASSERT_FALSE(version2 > version1); } -TEST(ComparableDatabaseVersionTest, CompareEpochBasedVersionAgainstEpochAndTimestampBasedVersion) { - { - auto equalVersions = [](const DatabaseVersion& v1, const DatabaseVersion& v2) { - const auto version1 = ComparableDatabaseVersion::makeComparableDatabaseVersion(v1); - const auto version2 = ComparableDatabaseVersion::makeComparableDatabaseVersion(v2); - ASSERT(version1 == version2); - ASSERT_FALSE(version1 < version2); - ASSERT_FALSE(version1 > version2); - }; - - const auto epoch = UUID::gen(); - const DatabaseVersion v1(epoch); - const DatabaseVersion v2(epoch, Timestamp(1)); - equalVersions(v1, v2); - equalVersions(v2, v1); - } - - { - auto diffVersionsMoreRecentByLastMod = [](const DatabaseVersion& v1, - const DatabaseVersion& v2) { - const auto version1 = ComparableDatabaseVersion::makeComparableDatabaseVersion(v1); - const auto version2 = ComparableDatabaseVersion::makeComparableDatabaseVersion(v2); - ASSERT(version1 != version2); - ASSERT(version1 > version2); - ASSERT_FALSE(version1 < version2); - }; - - const auto epoch = UUID::gen(); - const DatabaseVersion v1(epoch); - const DatabaseVersion v2(epoch, Timestamp(1)); - diffVersionsMoreRecentByLastMod(v1.makeUpdated(), v2); - diffVersionsMoreRecentByLastMod(v2.makeUpdated(), v1); - } - - { - auto diffVersionsMoreRecentByDisambigSeqNum = [](const DatabaseVersion& v1, - const DatabaseVersion& v2) { - const auto version1 = ComparableDatabaseVersion::makeComparableDatabaseVersion(v1); - const auto version2 = ComparableDatabaseVersion::makeComparableDatabaseVersion(v2); - ASSERT(version1 != version2); - ASSERT(version1 < version2); - ASSERT_FALSE(version1 > version2); - }; - - const DatabaseVersion v1(UUID::gen()); - const DatabaseVersion v2(UUID::gen(), Timestamp(1)); - diffVersionsMoreRecentByDisambigSeqNum(v1, v2); - diffVersionsMoreRecentByDisambigSeqNum(v2, v1); - } -} - TEST(ComparableDatabaseVersionTest, VersionGreaterSameUuidOrTimestamp) { auto versionGreaterSameUuidOrTimestamp = [](const DatabaseVersion& v1) { const DatabaseVersion v2 = v1.makeUpdated(); @@ -138,8 +75,7 @@ TEST(ComparableDatabaseVersionTest, VersionGreaterSameUuidOrTimestamp) { ASSERT_FALSE(version2 < version1); }; - versionGreaterSameUuidOrTimestamp(DatabaseVersion(UUID::gen())); - versionGreaterSameUuidOrTimestamp(DatabaseVersion(UUID::gen(), Timestamp(1))); + versionGreaterSameUuidOrTimestamp(DatabaseVersion(UUID::gen(), Timestamp(0))); } TEST(ComparableDatabaseVersionTest, VersionLessSameUuidOrTimestamp) { @@ -152,7 +88,6 @@ TEST(ComparableDatabaseVersionTest, VersionLessSameUuidOrTimestamp) { ASSERT_FALSE(version1 > version2); }; - versionLessSameUuidOrTimestamp(DatabaseVersion(UUID::gen())); versionLessSameUuidOrTimestamp(DatabaseVersion(UUID::gen(), Timestamp(1))); } @@ -173,8 +108,7 @@ TEST(ComparableDatabaseVersionTest, DefaultConstructedVersionIsAlwaysLess) { ASSERT_FALSE(defaultVersion > version1); }; - defaultConstructedVersionIsAlwaysLess(DatabaseVersion(UUID::gen())); - defaultConstructedVersionIsAlwaysLess(DatabaseVersion(UUID::gen(), Timestamp(1))); + defaultConstructedVersionIsAlwaysLess(DatabaseVersion(UUID::gen(), Timestamp())); } TEST(ComparableDatabaseVersionTest, CompareForcedRefreshVersionVersusValidDatabaseVersion) { @@ -199,9 +133,8 @@ TEST(ComparableDatabaseVersionTest, CompareForcedRefreshVersionVersusValidDataba ASSERT(defaultVersionAfterForce < forcedRefreshVersion); }; - compareForcedRefreshVersionVersusValidDatabaseVersion(DatabaseVersion(UUID::gen())); compareForcedRefreshVersionVersusValidDatabaseVersion( - DatabaseVersion(UUID::gen(), Timestamp(1))); + DatabaseVersion(UUID::gen(), Timestamp())); } TEST(ComparableDatabaseVersionTest, CompareTwoForcedRefreshVersions) { diff --git a/src/mongo/s/database_version.cpp b/src/mongo/s/database_version.cpp index 7ca5de2f01b..3a0af40956a 100644 --- a/src/mongo/s/database_version.cpp +++ b/src/mongo/s/database_version.cpp @@ -37,9 +37,8 @@ AtomicWord<uint64_t> ComparableDatabaseVersion::_uuidDisambiguatingSequenceNumSo AtomicWord<uint64_t> ComparableDatabaseVersion::_forcedRefreshSequenceNumSource{1ULL}; DatabaseVersion DatabaseVersion::makeFixed() { - DatabaseVersion dbVersion; + DatabaseVersion dbVersion(UUID::gen(), Timestamp()); dbVersion.setLastMod(0); - dbVersion.setUuid(UUID::gen()); return dbVersion; } DatabaseVersion DatabaseVersion::makeUpdated() const { @@ -104,23 +103,17 @@ bool ComparableDatabaseVersion::operator<(const ComparableDatabaseVersion& other return false; // Only default constructed values have _forcedRefreshSequenceNum == 0 and // they are always equal - // 1. If both versions are valid and have timestamps - // 1.1. if their timestamps are the same -> rely on lastMod to define the order - // 1.2. Otherwise -> rely on the timestamps values to define order - // 2. If both versions are valid and have the same uuid -> rely on lastMod to define the order - // 3. Any other scenario -> rely on disambiguating sequence number + // 1. If both versions are valid + // 1.1. If both timestamps are the same -> rely on lastMod to define the order + // 1.2. Otherwise -> rely on the timestamps' values to define order + // 2. Any other scenario -> rely on disambiguating sequence number if (_dbVersion && other._dbVersion) { const auto timestamp = _dbVersion->getTimestamp(); const auto otherTimestamp = other._dbVersion->getTimestamp(); - if (timestamp && otherTimestamp) { - if (*timestamp == *otherTimestamp) - return _dbVersion->getLastMod() < other._dbVersion->getLastMod(); - else - return *timestamp < *otherTimestamp; - - } else if (_dbVersion->getUuid() == other._dbVersion->getUuid()) { + if (timestamp == otherTimestamp) return _dbVersion->getLastMod() < other._dbVersion->getLastMod(); - } + else + return timestamp < otherTimestamp; } return _uuidDisambiguatingSequenceNum < other._uuidDisambiguatingSequenceNum; diff --git a/src/mongo/s/database_version.h b/src/mongo/s/database_version.h index 2bfad7d883d..87ecdb6b371 100644 --- a/src/mongo/s/database_version.h +++ b/src/mongo/s/database_version.h @@ -47,8 +47,6 @@ class DatabaseVersion : public DatabaseVersionBase { public: using DatabaseVersionBase::getTimestamp; - DatabaseVersion() = default; - explicit DatabaseVersion(const BSONObj& obj) { DatabaseVersionBase::parseProtected(IDLParserErrorContext("DatabaseVersion"), obj); } @@ -56,18 +54,11 @@ public: explicit DatabaseVersion(const DatabaseVersionBase& dbv) : DatabaseVersionBase(dbv) {} /** - * Constructor of a DatabaseVersion based on epochs - */ - explicit DatabaseVersion(mongo::UUID uuid) - : DatabaseVersion(uuid, boost::none /* timestamp */) {} - - /** * Constructor of a DatabaseVersion based on epochs and timestamps */ - DatabaseVersion(mongo::UUID uuid, boost::optional<mongo::Timestamp> timestamp) - : DatabaseVersionBase(1 /* lastMod */) { + DatabaseVersion(mongo::UUID uuid, mongo::Timestamp timestamp) + : DatabaseVersionBase(timestamp, 1 /* lastMod */) { setUuid(uuid); - setTimestamp(timestamp); } // Returns a new hardcoded DatabaseVersion value, which is used to distinguish databases that do diff --git a/src/mongo/s/database_version.idl b/src/mongo/s/database_version.idl index 557c1d1d6b9..9b073f5a34e 100644 --- a/src/mongo/s/database_version.idl +++ b/src/mongo/s/database_version.idl @@ -48,10 +48,7 @@ structs: optional: true timestamp: type: timestamp - description: "Uniquely identifies to distinguish different incarnations of this database - It is optional for parsing purposes, because in versions of MongoDB - prior to 5.0, this value wasn't being written." - optional: true + description: "Uniquely identifies to distinguish different incarnations of this database." lastMod: type: int description: "an integer which is bumped whenever the database's primary shard changes" diff --git a/src/mongo/s/write_ops/batch_write_exec_test.cpp b/src/mongo/s/write_ops/batch_write_exec_test.cpp index ca3bf151737..6f8f077859d 100644 --- a/src/mongo/s/write_ops/batch_write_exec_test.cpp +++ b/src/mongo/s/write_ops/batch_write_exec_test.cpp @@ -140,7 +140,7 @@ BSONObj expectInsertsReturnStaleDbVersionErrorsBase(const NamespaceString& nss, errorBuilder.append("index", i); errorBuilder.append("code", int(ErrorCodes::StaleDbVersion)); - auto dbVersion = DatabaseVersion(UUID::gen()); + auto dbVersion = DatabaseVersion(UUID::gen(), Timestamp()); errorBuilder.append("db", nss.db()); errorBuilder.append("vReceived", dbVersion.toBSON()); errorBuilder.append("vWanted", dbVersion.makeUpdated().toBSON()); |