diff options
author | Vesselina Ratcheva <vesselina.ratcheva@10gen.com> | 2020-08-29 00:15:36 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-09-04 02:40:53 +0000 |
commit | 1bb2d6e2943d24ed3eef9cc9123fdfdd60e63562 (patch) | |
tree | 536f2290dba3a1e96e8dd943c88b472cd6c1ec1e /src | |
parent | e703a72a49151fa782cfd83a654a6af55663ca38 (diff) | |
download | mongo-1bb2d6e2943d24ed3eef9cc9123fdfdd60e63562.tar.gz |
SERVER-50492 Move initial sync functionality out of ReplSyncSharedData
SERVER-50492 Split ClonerTestFixture into InitialSyncClonerTestFixture and TenantMigrationClonerTestFixture
SERVER-50492 Fix log component for tenant cloners
SERVER-50492 Fix tenant cloner naming
Diffstat (limited to 'src')
28 files changed, 433 insertions, 325 deletions
diff --git a/src/mongo/db/repl/SConscript b/src/mongo/db/repl/SConscript index 6bb2fc91044..63a2626d1b3 100644 --- a/src/mongo/db/repl/SConscript +++ b/src/mongo/db/repl/SConscript @@ -1012,7 +1012,7 @@ env.Library( 'tenant_all_database_cloner.cpp', 'tenant_collection_cloner.cpp', 'tenant_database_cloner.cpp', - 'tenant_migration_base_cloner.cpp', + 'tenant_base_cloner.cpp', ], LIBDEPS = [ '$BUILD_DIR/mongo/base', @@ -1533,10 +1533,12 @@ env.CppUnitTest( 'cloner_test_fixture.cpp', 'collection_cloner_test.cpp', 'database_cloner_test.cpp', + 'initial_sync_cloner_test_fixture.cpp', 'initial_sync_shared_data_test.cpp', 'tenant_all_database_cloner_test.cpp', 'tenant_collection_cloner_test.cpp', - 'tenant_database_cloner_test.cpp' + 'tenant_database_cloner_test.cpp', + 'tenant_cloner_test_fixture.cpp', ], LIBDEPS=[ '$BUILD_DIR/mongo/db/auth/authmocks', # Required for service context test fixture diff --git a/src/mongo/db/repl/all_database_cloner_test.cpp b/src/mongo/db/repl/all_database_cloner_test.cpp index 450ec40e477..eca18bb1753 100644 --- a/src/mongo/db/repl/all_database_cloner_test.cpp +++ b/src/mongo/db/repl/all_database_cloner_test.cpp @@ -32,7 +32,7 @@ #include "mongo/platform/basic.h" #include "mongo/db/repl/all_database_cloner.h" -#include "mongo/db/repl/cloner_test_fixture.h" +#include "mongo/db/repl/initial_sync_cloner_test_fixture.h" #include "mongo/db/repl/replication_consistency_markers_impl.h" #include "mongo/db/repl/storage_interface.h" #include "mongo/db/repl/storage_interface_mock.h" @@ -46,15 +46,11 @@ namespace mongo { namespace repl { -class AllDatabaseClonerTest : public ClonerTestFixture { +class AllDatabaseClonerTest : public InitialSyncClonerTestFixture { public: AllDatabaseClonerTest() {} protected: - void setUp() override { - ClonerTestFixture::setUp(); - _sharedData = std::make_unique<InitialSyncSharedData>(kInitialRollbackId, Days(1), &_clock); - } std::unique_ptr<AllDatabaseCloner> makeAllDatabaseCloner() { return std::make_unique<AllDatabaseCloner>(getSharedData(), _source, @@ -66,10 +62,6 @@ protected: std::vector<std::string> getDatabasesFromCloner(AllDatabaseCloner* cloner) { return cloner->_databases; } - - InitialSyncSharedData* getSharedData() { - return checked_cast<InitialSyncSharedData*>(_sharedData.get()); - } }; TEST_F(AllDatabaseClonerTest, RetriesConnect) { diff --git a/src/mongo/db/repl/base_cloner.cpp b/src/mongo/db/repl/base_cloner.cpp index 271b950c865..c5bfbd95077 100644 --- a/src/mongo/db/repl/base_cloner.cpp +++ b/src/mongo/db/repl/base_cloner.cpp @@ -27,7 +27,7 @@ * it in the license file. */ -#define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kReplicationInitialSync +#define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kReplication #include "mongo/platform/basic.h" @@ -87,11 +87,12 @@ Status BaseCloner::run() { } stdx::lock_guard<ReplSyncSharedData> lk(*_sharedData); if (!_sharedData->getStatus(lk).isOK()) { - LOGV2(21065, - "Failing data clone because of failure outside data clone: " - "{error}", - "Failing data clone because of failure outside data clone", - "error"_attr = _sharedData->getStatus(lk)); + LOGV2_OPTIONS(21065, + {getLogComponent()}, + "Failing data clone because of failure outside data clone: " + "{error}", + "Failing data clone because of failure outside data clone", + "error"_attr = _sharedData->getStatus(lk)); } return _sharedData->getStatus(lk); } @@ -101,23 +102,25 @@ bool BaseCloner::isMyFailPoint(const BSONObj& data) const { } BaseCloner::AfterStageBehavior BaseCloner::runStage(BaseClonerStage* stage) { - LOGV2_DEBUG(21069, - 1, - "Cloner {cloner} running stage {stage}", - "Cloner running stage", - "cloner"_attr = getClonerName(), - "stage"_attr = stage->getName()); + LOGV2_DEBUG_OPTIONS(21069, + 1, + {getLogComponent()}, + "Cloner {cloner} running stage {stage}", + "Cloner running stage", + "cloner"_attr = getClonerName(), + "stage"_attr = stage->getName()); pauseForFuzzer(stage); auto isThisStageFailPoint = [this, stage](const BSONObj& data) { return data["stage"].str() == stage->getName() && isMyFailPoint(data); }; hangBeforeClonerStage.executeIf( [&](const BSONObj& data) { - LOGV2(21070, - "Cloner {cloner} hanging before running stage {stage}", - "Cloner hanging before running stage", - "cloner"_attr = getClonerName(), - "stage"_attr = stage->getName()); + LOGV2_OPTIONS(21070, + {getLogComponent()}, + "Cloner {cloner} hanging before running stage {stage}", + "Cloner hanging before running stage", + "cloner"_attr = getClonerName(), + "stage"_attr = stage->getName()); while (!mustExit() && hangBeforeClonerStage.shouldFail(isThisStageFailPoint)) { sleepmillis(100); } @@ -126,22 +129,24 @@ BaseCloner::AfterStageBehavior BaseCloner::runStage(BaseClonerStage* stage) { auto afterStageBehavior = runStageWithRetries(stage); hangAfterClonerStage.executeIf( [&](const BSONObj& data) { - LOGV2(21071, - "Cloner {cloner} hanging after running stage {stage}", - "Cloner hanging after running stage", - "cloner"_attr = getClonerName(), - "stage"_attr = stage->getName()); + LOGV2_OPTIONS(21071, + {getLogComponent()}, + "Cloner {cloner} hanging after running stage {stage}", + "Cloner hanging after running stage", + "cloner"_attr = getClonerName(), + "stage"_attr = stage->getName()); while (!mustExit() && hangAfterClonerStage.shouldFail(isThisStageFailPoint)) { sleepmillis(100); } }, isThisStageFailPoint); - LOGV2_DEBUG(21072, - 1, - "Cloner {cloner} finished running stage {stage}", - "Cloner finished running stage", - "cloner"_attr = getClonerName(), - "stage"_attr = stage->getName()); + LOGV2_DEBUG_OPTIONS(21072, + 1, + {getLogComponent()}, + "Cloner {cloner} finished running stage {stage}", + "Cloner finished running stage", + "cloner"_attr = getClonerName(), + "stage"_attr = stage->getName()); return afterStageBehavior; } @@ -160,24 +165,26 @@ BaseCloner::AfterStageBehavior BaseCloner::runStageWithRetries(BaseClonerStage* // If lastError is set, this is a retry. hangBeforeRetryingClonerStage.executeIf( [&](const BSONObj& data) { - LOGV2(21074, - "Cloner {cloner} hanging before retrying stage {stage}", - "Cloner hanging before retrying stage", - "cloner"_attr = getClonerName(), - "stage"_attr = stage->getName()); + LOGV2_OPTIONS(21074, + {getLogComponent()}, + "Cloner {cloner} hanging before retrying stage {stage}", + "Cloner hanging before retrying stage", + "cloner"_attr = getClonerName(), + "stage"_attr = stage->getName()); while (!mustExit() && hangBeforeRetryingClonerStage.shouldFail(isThisStageFailPoint)) { sleepmillis(100); } }, isThisStageFailPoint); - LOGV2(21075, - "Sync process retrying {cloner} stage {stage} due to " - "{error}", - "Sync process retrying cloner stage due to error", - "cloner"_attr = getClonerName(), - "stage"_attr = stage->getName(), - "error"_attr = lastError); + LOGV2_OPTIONS(21075, + {getLogComponent()}, + "Sync process retrying {cloner} stage {stage} due to " + "{error}", + "Sync process retrying cloner stage due to error", + "cloner"_attr = getClonerName(), + "stage"_attr = stage->getName(), + "error"_attr = lastError); // Execute any per-retry logic needed by the cloner. handleStageAttemptFailed(stage, lastError); } @@ -185,23 +192,25 @@ BaseCloner::AfterStageBehavior BaseCloner::runStageWithRetries(BaseClonerStage* } catch (DBException& e) { lastError = e.toStatus(); if (!stage->isTransientError(lastError)) { - LOGV2(21077, - "Non-retryable error occurred during cloner " - "{cloner} stage {stage}: {error}", - "Non-retryable error occurred during cloner stage", - "cloner"_attr = getClonerName(), - "stage"_attr = stage->getName(), - "error"_attr = lastError); + LOGV2_OPTIONS(21077, + {getLogComponent()}, + "Non-retryable error occurred during cloner " + "{cloner} stage {stage}: {error}", + "Non-retryable error occurred during cloner stage", + "cloner"_attr = getClonerName(), + "stage"_attr = stage->getName(), + "error"_attr = lastError); throw; } - LOGV2_DEBUG(21078, - 1, - "Transient error occurred during cloner " - "{cloner} stage {stage}: {error}", - "Transient error occurred during cloner stage", - "cloner"_attr = getClonerName(), - "stage"_attr = stage->getName(), - "error"_attr = lastError); + LOGV2_DEBUG_OPTIONS(21078, + 1, + {getLogComponent()}, + "Transient error occurred during cloner " + "{cloner} stage {stage}: {error}", + "Transient error occurred during cloner stage", + "cloner"_attr = getClonerName(), + "stage"_attr = stage->getName(), + "error"_attr = lastError); } } } diff --git a/src/mongo/db/repl/base_cloner.h b/src/mongo/db/repl/base_cloner.h index 4ff4a5f7346..f6367d33126 100644 --- a/src/mongo/db/repl/base_cloner.h +++ b/src/mongo/db/repl/base_cloner.h @@ -43,6 +43,11 @@ #include "mongo/util/future.h" namespace mongo { + +namespace logv2 { +class LogComponent; +} + namespace repl { class BaseCloner { @@ -243,6 +248,11 @@ protected: return ""; } + /** + * Must override this to specify the log component for messages in this class. + */ + virtual logv2::LogComponent getLogComponent() = 0; + private: virtual ClonerStages getStages() = 0; diff --git a/src/mongo/db/repl/cloner_test_fixture.cpp b/src/mongo/db/repl/cloner_test_fixture.cpp index 305861a3eb6..f2dcf803d7b 100644 --- a/src/mongo/db/repl/cloner_test_fixture.cpp +++ b/src/mongo/db/repl/cloner_test_fixture.cpp @@ -71,11 +71,6 @@ void ClonerTestFixture::setUp() { // Required by CollectionCloner::listIndexesStage() and IndexBuildsCoordinator. getServiceContext()->setStorageEngine(std::make_unique<StorageEngineMock>()); - - // Set the initial sync ID on the mock server. - _mockServer->insert( - ReplicationConsistencyMarkersImpl::kDefaultInitialSyncIdNamespace.toString(), - BSON("_id" << _initialSyncId)); } void ClonerTestFixture::tearDown() { @@ -84,11 +79,5 @@ void ClonerTestFixture::tearDown() { unittest::Test::tearDown(); } -void ClonerTestFixture::setInitialSyncId() { - stdx::lock_guard<ReplSyncSharedData> lk(*_sharedData); - _sharedData->setSyncSourceWireVersion(lk, WireVersion::RESUMABLE_INITIAL_SYNC); - _sharedData->setInitialSyncSourceId(lk, _initialSyncId); -} - } // namespace repl } // namespace mongo diff --git a/src/mongo/db/repl/cloner_test_fixture.h b/src/mongo/db/repl/cloner_test_fixture.h index ca458b8e100..0da9dc95d0c 100644 --- a/src/mongo/db/repl/cloner_test_fixture.h +++ b/src/mongo/db/repl/cloner_test_fixture.h @@ -59,8 +59,6 @@ protected: void tearDown() override; - void setInitialSyncId(); - StorageInterfaceMock _storageInterface; HostAndPort _source; std::unique_ptr<ThreadPool> _dbWorkThreadPool; @@ -68,8 +66,6 @@ protected: std::unique_ptr<DBClientConnection> _mockClient; std::unique_ptr<ReplSyncSharedData> _sharedData; ClockSourceMock _clock; - UUID _initialSyncId = UUID::gen(); - static constexpr int kInitialRollbackId = 1; private: unittest::MinimumLoggedSeverityGuard _verboseGuard{logv2::LogComponent::kReplicationInitialSync, diff --git a/src/mongo/db/repl/collection_cloner_test.cpp b/src/mongo/db/repl/collection_cloner_test.cpp index 62c9dfe2274..8792b0e80f0 100644 --- a/src/mongo/db/repl/collection_cloner_test.cpp +++ b/src/mongo/db/repl/collection_cloner_test.cpp @@ -31,10 +31,9 @@ #include <vector> -#include "mongo/base/checked_cast.h" #include "mongo/bson/bsonmisc.h" -#include "mongo/db/repl/cloner_test_fixture.h" #include "mongo/db/repl/collection_cloner.h" +#include "mongo/db/repl/initial_sync_cloner_test_fixture.h" #include "mongo/db/repl/repl_server_parameters_gen.h" #include "mongo/db/repl/storage_interface.h" #include "mongo/db/repl/storage_interface_mock.h" @@ -56,14 +55,13 @@ public: } }; -class CollectionClonerTest : public ClonerTestFixture { +class CollectionClonerTest : public InitialSyncClonerTestFixture { public: CollectionClonerTest() {} protected: void setUp() override { - ClonerTestFixture::setUp(); - _sharedData = std::make_unique<InitialSyncSharedData>(kInitialRollbackId, Days(1), &_clock); + InitialSyncClonerTestFixture::setUp(); _collectionStats = std::make_shared<CollectionMockStats>(); _standardCreateCollectionFn = [this](const NamespaceString& nss, const CollectionOptions& options, @@ -117,10 +115,6 @@ protected: return cloner->_idIndexSpec; } - InitialSyncSharedData* getSharedData() { - return checked_cast<InitialSyncSharedData*>(_sharedData.get()); - } - std::shared_ptr<CollectionMockStats> _collectionStats; // Used by the _loader. StorageInterfaceMock::CreateCollectionForBulkFn _standardCreateCollectionFn; CollectionBulkLoaderMock* _loader = nullptr; // Owned by CollectionCloner. diff --git a/src/mongo/db/repl/database_cloner_test.cpp b/src/mongo/db/repl/database_cloner_test.cpp index 1d767d4396e..7dc72b24592 100644 --- a/src/mongo/db/repl/database_cloner_test.cpp +++ b/src/mongo/db/repl/database_cloner_test.cpp @@ -29,10 +29,9 @@ #include "mongo/platform/basic.h" -#include "mongo/base/checked_cast.h" #include "mongo/db/clientcursor.h" -#include "mongo/db/repl/cloner_test_fixture.h" #include "mongo/db/repl/database_cloner.h" +#include "mongo/db/repl/initial_sync_cloner_test_fixture.h" #include "mongo/db/repl/storage_interface.h" #include "mongo/db/repl/storage_interface_mock.h" #include "mongo/db/service_context_test_fixture.h" @@ -49,14 +48,13 @@ struct CollectionCloneInfo { CollectionBulkLoaderMock* loader = nullptr; }; -class DatabaseClonerTest : public ClonerTestFixture { +class DatabaseClonerTest : public InitialSyncClonerTestFixture { public: DatabaseClonerTest() {} protected: void setUp() override { - ClonerTestFixture::setUp(); - _sharedData = std::make_unique<InitialSyncSharedData>(kInitialRollbackId, Days(1), &_clock); + InitialSyncClonerTestFixture::setUp(); _storageInterface.createCollectionForBulkFn = [this](const NamespaceString& nss, const CollectionOptions& options, @@ -107,10 +105,6 @@ protected: return cloner->_collections; } - InitialSyncSharedData* getSharedData() { - return checked_cast<InitialSyncSharedData*>(_sharedData.get()); - } - std::map<NamespaceString, CollectionCloneInfo> _collections; static std::string _dbName; diff --git a/src/mongo/db/repl/initial_sync_base_cloner.cpp b/src/mongo/db/repl/initial_sync_base_cloner.cpp index 2840191d985..acc6d41d89d 100644 --- a/src/mongo/db/repl/initial_sync_base_cloner.cpp +++ b/src/mongo/db/repl/initial_sync_base_cloner.cpp @@ -205,5 +205,9 @@ void InitialSyncBaseCloner::pauseForFuzzer(BaseClonerStage* stage) { } } +logv2::LogComponent InitialSyncBaseCloner::getLogComponent() { + return logv2::LogComponent::kReplicationInitialSync; +} + } // namespace repl } // namespace mongo
\ No newline at end of file diff --git a/src/mongo/db/repl/initial_sync_base_cloner.h b/src/mongo/db/repl/initial_sync_base_cloner.h index ff1f28142a9..f5eb9882725 100644 --- a/src/mongo/db/repl/initial_sync_base_cloner.h +++ b/src/mongo/db/repl/initial_sync_base_cloner.h @@ -87,8 +87,21 @@ private: */ void pauseForFuzzer(BaseClonerStage* stage) final; + /** + * Provides part of a log message for the initial sync describing the namespace the + * cloner is operating on. It must start with the database name, followed by the + * string ' db: { ', followed by the stage name, followed by ': ' and the collection UUID + * if known. + */ + virtual std::string describeForFuzzer(BaseClonerStage*) const = 0; + + /** + * Overriden to allow the BaseCloner to use the initial sync log component. + */ + virtual logv2::LogComponent getLogComponent() final; + // Operation that may currently be retrying. - ReplSyncSharedData::RetryableOperation _retryableOp; + InitialSyncSharedData::RetryableOperation _retryableOp; }; } // namespace repl diff --git a/src/mongo/db/repl/initial_sync_cloner_test_fixture.cpp b/src/mongo/db/repl/initial_sync_cloner_test_fixture.cpp new file mode 100644 index 00000000000..fb2c60e7378 --- /dev/null +++ b/src/mongo/db/repl/initial_sync_cloner_test_fixture.cpp @@ -0,0 +1,61 @@ +/** + * Copyright (C) 2019-present MongoDB, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * <http://www.mongodb.com/licensing/server-side-public-license>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the Server Side Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ + +#include "mongo/platform/basic.h" + +#include "mongo/base/checked_cast.h" +#include "mongo/db/repl/initial_sync_cloner_test_fixture.h" +#include "mongo/db/repl/replication_consistency_markers_impl.h" + +namespace mongo { +namespace repl { + +void InitialSyncClonerTestFixture::setUp() { + ClonerTestFixture::setUp(); + + _sharedData = std::make_unique<InitialSyncSharedData>(kInitialRollbackId, Days(1), &_clock); + + // Set the initial sync ID on the mock server. + _mockServer->insert( + ReplicationConsistencyMarkersImpl::kDefaultInitialSyncIdNamespace.toString(), + BSON("_id" << _initialSyncId)); +} + +InitialSyncSharedData* InitialSyncClonerTestFixture::getSharedData() { + return checked_cast<InitialSyncSharedData*>(_sharedData.get()); +} + +void InitialSyncClonerTestFixture::setInitialSyncId() { + stdx::lock_guard<InitialSyncSharedData> lk(*getSharedData()); + getSharedData()->setSyncSourceWireVersion(lk, WireVersion::RESUMABLE_INITIAL_SYNC); + getSharedData()->setInitialSyncSourceId(lk, _initialSyncId); +} + +} // namespace repl +} // namespace mongo
\ No newline at end of file diff --git a/src/mongo/db/repl/initial_sync_cloner_test_fixture.h b/src/mongo/db/repl/initial_sync_cloner_test_fixture.h new file mode 100644 index 00000000000..f51f9204435 --- /dev/null +++ b/src/mongo/db/repl/initial_sync_cloner_test_fixture.h @@ -0,0 +1,52 @@ +/** + * Copyright (C) 2019-present MongoDB, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * <http://www.mongodb.com/licensing/server-side-public-license>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the Server Side Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ + +#pragma once + +#include "mongo/db/repl/cloner_test_fixture.h" +#include "mongo/db/repl/initial_sync_shared_data.h" + +namespace mongo { +namespace repl { + +class InitialSyncClonerTestFixture : public ClonerTestFixture { +protected: + void setUp() override; + + InitialSyncSharedData* getSharedData(); + + // Updates the initial sync id stored in InitialSyncSharedData. + void setInitialSyncId(); + + UUID _initialSyncId = UUID::gen(); + static constexpr int kInitialRollbackId = 1; +}; + +} // namespace repl +} // namespace mongo
\ No newline at end of file diff --git a/src/mongo/db/repl/initial_sync_shared_data.h b/src/mongo/db/repl/initial_sync_shared_data.h index 45f76338350..0644f151997 100644 --- a/src/mongo/db/repl/initial_sync_shared_data.h +++ b/src/mongo/db/repl/initial_sync_shared_data.h @@ -41,8 +41,16 @@ private: class RetryingOperation; public: + typedef boost::optional<RetryingOperation> RetryableOperation; + InitialSyncSharedData(int rollBackId, Milliseconds allowedOutageDuration, ClockSource* clock) - : ReplSyncSharedData(rollBackId, allowedOutageDuration, clock) {} + : ReplSyncSharedData(clock), + _rollBackId(rollBackId), + _allowedOutageDuration(allowedOutageDuration) {} + + int getRollBackId() const { + return _rollBackId; + } int getRetryingOperationsCount(WithLock lk) { return _retryingOperationsCount; @@ -55,28 +63,28 @@ public: /** * Sets the wire version of the sync source. */ - void setSyncSourceWireVersion(WithLock, WireVersion wireVersion) final { + void setSyncSourceWireVersion(WithLock, WireVersion wireVersion) { _syncSourceWireVersion = wireVersion; } /** * Returns the wire version of the sync source, if previously set. */ - boost::optional<WireVersion> getSyncSourceWireVersion(WithLock) final { + boost::optional<WireVersion> getSyncSourceWireVersion(WithLock) { return _syncSourceWireVersion; } /** * Sets the initial sync ID of the sync source. */ - void setInitialSyncSourceId(WithLock, boost::optional<UUID> syncSourceId) final { + void setInitialSyncSourceId(WithLock, boost::optional<UUID> syncSourceId) { _initialSyncSourceId = syncSourceId; } /** * Gets the previously-set initial sync ID of the sync source. */ - boost::optional<UUID> getInitialSyncSourceId(WithLock) final { + boost::optional<UUID> getInitialSyncSourceId(WithLock) { return _initialSyncSourceId; } @@ -106,9 +114,54 @@ public: * * Returns true if the operation should be retried, false if it has timed out. */ - bool shouldRetryOperation(WithLock lk, RetryableOperation* retryableOp) override; + bool shouldRetryOperation(WithLock lk, RetryableOperation* retryableOp); + + /** + * Returns the total time the sync source may be unreachable in a single outage before + * shouldRetryOperation() returns false. + */ + Milliseconds getAllowedOutageDuration(WithLock lk) { + return _allowedOutageDuration; + } + + void setAllowedOutageDuration_forTest(WithLock, Milliseconds allowedOutageDuration) { + _allowedOutageDuration = allowedOutageDuration; + } private: + class RetryingOperation { + public: + RetryingOperation(InitialSyncSharedData* sharedData) : _sharedData(sharedData) {} + // This class is a non-copyable RAII class. + RetryingOperation(const RetryingOperation&) = delete; + RetryingOperation(RetryingOperation&&) = delete; + ~RetryingOperation() { + if (_sharedData) { + stdx::lock_guard<InitialSyncSharedData> lk(*_sharedData); + release(lk); + } + } + + RetryingOperation& operator=(const RetryingOperation&) = delete; + RetryingOperation& operator=(RetryingOperation&&) = default; + + /** + * release() is used by shouldRetryOperation to allow destroying a RetryingOperation + * while holding the lock. + */ + void release(WithLock lk) { + _sharedData->decrementRetryingOperations(lk); + _sharedData = nullptr; + } + + InitialSyncSharedData* getSharedData() { + return _sharedData; + } + + private: + InitialSyncSharedData* _sharedData; + }; + /** * Increment the number of retrying operations, set syncSourceUnreachableSince if this is the * only retrying operation. This is used when an operation starts retrying. @@ -122,12 +175,15 @@ private: * and update _totalTimeUnreachable. * Returns the new number of retrying operations. */ - int decrementRetryingOperations(WithLock lk) override; + int decrementRetryingOperations(WithLock lk); void incrementTotalRetries(WithLock lk) { _totalRetries++; } + // Rollback ID at start of initial sync. + const int _rollBackId; + /** * This object must be locked when accessing the members below. */ @@ -147,6 +203,9 @@ private: // outage, that we were retrying because we were unable to reach the sync source. Milliseconds _totalTimeUnreachable; + // Time allowed for an outage before "shouldRetryOperation" returns false. + Milliseconds _allowedOutageDuration; + // Operation that may currently be retrying. RetryableOperation _retryableOp; diff --git a/src/mongo/db/repl/repl_sync_shared_data.h b/src/mongo/db/repl/repl_sync_shared_data.h index a3c8f262aba..1c9ab2e9d2e 100644 --- a/src/mongo/db/repl/repl_sync_shared_data.h +++ b/src/mongo/db/repl/repl_sync_shared_data.h @@ -42,21 +42,10 @@ namespace mongo { namespace repl { class ReplSyncSharedData { -protected: - class RetryingOperation; - public: - typedef boost::optional<RetryingOperation> RetryableOperation; - - ReplSyncSharedData(int rollBackId, Milliseconds allowedOutageDuration, ClockSource* clock) - : _rollBackId(rollBackId), _clock(clock), _allowedOutageDuration(allowedOutageDuration) {} + ReplSyncSharedData(ClockSource* clock) : _clock(clock) {} virtual ~ReplSyncSharedData() {} - // TODO(SERVER-50492): Move this into InitialSyncSharedData once the base cloner has been split. - int getRollBackId() const { - return _rollBackId; - } - ClockSource* getClock() const { return _clock; } @@ -83,107 +72,12 @@ public: */ void setStatusIfOK(WithLock lk, Status newStatus); - /** - * Sets the wire version of the sync source. - * TODO(SERVER-50492): Move this into InitialSyncSharedData once the base cloner has been split. - */ - virtual void setSyncSourceWireVersion(WithLock, WireVersion wireVersion) = 0; - - /** - * Returns the wire version of the sync source, if previously set. - * TODO(SERVER-50492): Move this into InitialSyncSharedData once the base cloner has been split. - */ - virtual boost::optional<WireVersion> getSyncSourceWireVersion(WithLock) = 0; - - /** - * Sets the initial sync ID of the sync source. - * TODO(SERVER-50492): Move this into InitialSyncSharedData once the base cloner has been split. - */ - virtual void setInitialSyncSourceId(WithLock, boost::optional<UUID> syncSourceId) = 0; - - /** - * Gets the previously-set initial sync ID of the sync source. - * TODO(SERVER-50492): Move this into InitialSyncSharedData once the base cloner has been split. - */ - virtual boost::optional<UUID> getInitialSyncSourceId(WithLock) = 0; - - /** - * Returns true if the operation should be retried, false if it has timed out. - * TODO(SERVER-50492): Move this into InitialSyncSharedData once the base cloner has been split. - */ - virtual bool shouldRetryOperation(WithLock lk, RetryableOperation* retryableOp) = 0; - - /** - * Decrements the number of retrying operations. If now zero, clear syncSourceUnreachableSince - * and update _totalTimeUnreachable. - * Returns the new number of retrying operations. - * TODO(SERVER-50492): Move this into InitialSyncSharedData once the base cloner has been split. - */ - virtual int decrementRetryingOperations(WithLock lk) = 0; - - /** - * Returns the total time the sync source may be unreachable in a single outage before - * shouldRetryOperation() returns false. - * TODO(SERVER-50492): Move this into InitialSyncSharedData once the base cloner has been split. - */ - Milliseconds getAllowedOutageDuration(WithLock lk) { - return _allowedOutageDuration; - } - - // TODO(SERVER-50492): Move this into InitialSyncSharedData once the base cloner has been split. - void setAllowedOutageDuration_forTest(WithLock, Milliseconds allowedOutageDuration) { - _allowedOutageDuration = allowedOutageDuration; - } - -protected: - // TODO(SERVER-50492): Move this into InitialSyncSharedData once the base cloner has been split. - class RetryingOperation { - public: - RetryingOperation(ReplSyncSharedData* sharedData) : _sharedData(sharedData) {} - // This class is a non-copyable RAII class. - RetryingOperation(const RetryingOperation&) = delete; - RetryingOperation(RetryingOperation&&) = delete; - ~RetryingOperation() { - if (_sharedData) { - stdx::lock_guard<ReplSyncSharedData> lk(*_sharedData); - release(lk); - } - } - - RetryingOperation& operator=(const RetryingOperation&) = delete; - RetryingOperation& operator=(RetryingOperation&&) = default; - - /** - * release() is used by shouldRetryOperation to allow destroying a RetryingOperation - * while holding the lock. - */ - void release(WithLock lk) { - _sharedData->decrementRetryingOperations(lk); - _sharedData = nullptr; - } - - ReplSyncSharedData* getSharedData() { - return _sharedData; - } - - private: - ReplSyncSharedData* _sharedData; - }; - private: - // Rollback ID at start of initial sync. - // TODO(SERVER-50492): Move this into InitialSyncSharedData once the base cloner has been split. - const int _rollBackId; - // Clock source used for timing outages and recording stats. ClockSource* const _clock; mutable Mutex _mutex = MONGO_MAKE_LATCH("ReplSyncSharedData::_mutex"_sd); - // Time allowed for an outage before "shouldRetryOperation" returns false. - // TODO(SERVER-50492): Move this into InitialSyncSharedData once the base cloner has been split. - Milliseconds _allowedOutageDuration; - // Status of the entire sync process. All syncing tasks should exit if this becomes non-OK. Status _status = Status::OK(); }; diff --git a/src/mongo/db/repl/tenant_all_database_cloner.cpp b/src/mongo/db/repl/tenant_all_database_cloner.cpp index 5aaf3a116c7..a1f1728ba2f 100644 --- a/src/mongo/db/repl/tenant_all_database_cloner.cpp +++ b/src/mongo/db/repl/tenant_all_database_cloner.cpp @@ -53,7 +53,7 @@ TenantAllDatabaseCloner::TenantAllDatabaseCloner(TenantMigrationSharedData* shar StorageInterface* storageInterface, ThreadPool* dbPool, StringData tenantId) - : TenantMigrationBaseCloner( + : TenantBaseCloner( "TenantAllDatabaseCloner"_sd, sharedData, source, client, storageInterface, dbPool), _tenantId(tenantId), _listDatabasesStage("listDatabases", this, &TenantAllDatabaseCloner::listDatabasesStage) {} diff --git a/src/mongo/db/repl/tenant_all_database_cloner.h b/src/mongo/db/repl/tenant_all_database_cloner.h index 681e7a2bf4e..300c3f54d16 100644 --- a/src/mongo/db/repl/tenant_all_database_cloner.h +++ b/src/mongo/db/repl/tenant_all_database_cloner.h @@ -32,14 +32,14 @@ #include <vector> #include "mongo/db/repl/base_cloner.h" +#include "mongo/db/repl/tenant_base_cloner.h" #include "mongo/db/repl/tenant_database_cloner.h" -#include "mongo/db/repl/tenant_migration_base_cloner.h" #include "mongo/db/repl/tenant_migration_shared_data.h" namespace mongo { namespace repl { -class TenantAllDatabaseCloner final : public TenantMigrationBaseCloner { +class TenantAllDatabaseCloner final : public TenantBaseCloner { public: struct Stats { size_t databasesCloned{0}; diff --git a/src/mongo/db/repl/tenant_all_database_cloner_test.cpp b/src/mongo/db/repl/tenant_all_database_cloner_test.cpp index 823e7ec27ca..71e4ecbf964 100644 --- a/src/mongo/db/repl/tenant_all_database_cloner_test.cpp +++ b/src/mongo/db/repl/tenant_all_database_cloner_test.cpp @@ -31,11 +31,10 @@ #include "mongo/platform/basic.h" -#include "mongo/base/checked_cast.h" -#include "mongo/db/repl/cloner_test_fixture.h" #include "mongo/db/repl/storage_interface.h" #include "mongo/db/repl/storage_interface_mock.h" #include "mongo/db/repl/tenant_all_database_cloner.h" +#include "mongo/db/repl/tenant_cloner_test_fixture.h" #include "mongo/db/service_context_test_fixture.h" #include "mongo/dbtests/mock/mock_dbclient_connection.h" #include "mongo/logv2/log.h" @@ -46,17 +45,11 @@ namespace mongo { namespace repl { -class TenantAllDatabaseClonerTest : public ClonerTestFixture { +class TenantAllDatabaseClonerTest : public TenantClonerTestFixture { public: TenantAllDatabaseClonerTest() {} protected: - void setUp() override { - ClonerTestFixture::setUp(); - _sharedData = std::make_unique<TenantMigrationSharedData>(kInitialRollbackId, &_clock); - _mockClient->setOperationTime(_operationTime); - } - std::unique_ptr<TenantAllDatabaseCloner> makeAllDatabaseCloner() { return std::make_unique<TenantAllDatabaseCloner>(getSharedData(), _source, @@ -81,26 +74,12 @@ protected: return bob.obj(); } - TenantMigrationSharedData* getSharedData() { - return checked_cast<TenantMigrationSharedData*>(_sharedData.get()); - } - - static Timestamp _operationTime; - static std::string _tenantId; - static std::string _tenantDbA; - static std::string _tenantDbAAB; - static std::string _tenantDbABC; - static std::string _tenantDbB; + const std::string _tenantDbA = _tenantId + "_a"; + const std::string _tenantDbAAB = _tenantId + "_aab"; + const std::string _tenantDbABC = _tenantId + "_abc"; + const std::string _tenantDbB = _tenantId + "_b"; }; -/* static */ -Timestamp TenantAllDatabaseClonerTest::_operationTime = Timestamp(12345, 67); -std::string TenantAllDatabaseClonerTest::_tenantId = "tenant42"; -std::string TenantAllDatabaseClonerTest::_tenantDbA = _tenantId + "_a"; -std::string TenantAllDatabaseClonerTest::_tenantDbAAB = _tenantId + "_aab"; -std::string TenantAllDatabaseClonerTest::_tenantDbABC = _tenantId + "_abc"; -std::string TenantAllDatabaseClonerTest::_tenantDbB = _tenantId + "_b"; - TEST_F(TenantAllDatabaseClonerTest, FailsOnListDatabases) { Status expectedResult{ErrorCodes::BadValue, "foo"}; _mockServer->setCommandReply("listDatabases", expectedResult); diff --git a/src/mongo/db/repl/tenant_migration_base_cloner.cpp b/src/mongo/db/repl/tenant_base_cloner.cpp index 977ddb5247f..9ac68eddbe0 100644 --- a/src/mongo/db/repl/tenant_migration_base_cloner.cpp +++ b/src/mongo/db/repl/tenant_base_cloner.cpp @@ -27,23 +27,27 @@ * it in the license file. */ -#define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kReplicationInitialSync +#define MONGO_LOGV2_DEFAULT_COMPONENT ::mongo::logv2::LogComponent::kTenantMigration #include "mongo/platform/basic.h" -#include "mongo/db/repl/tenant_migration_base_cloner.h" +#include "mongo/db/repl/tenant_base_cloner.h" #include "mongo/logv2/log.h" namespace mongo { namespace repl { -TenantMigrationBaseCloner::TenantMigrationBaseCloner(StringData clonerName, - TenantMigrationSharedData* sharedData, - const HostAndPort& source, - DBClientConnection* client, - StorageInterface* storageInterface, - ThreadPool* dbPool) +TenantBaseCloner::TenantBaseCloner(StringData clonerName, + TenantMigrationSharedData* sharedData, + const HostAndPort& source, + DBClientConnection* client, + StorageInterface* storageInterface, + ThreadPool* dbPool) : BaseCloner(clonerName, sharedData, source, client, storageInterface, dbPool) {} +logv2::LogComponent TenantBaseCloner::getLogComponent() { + return logv2::LogComponent::kTenantMigration; +} + } // namespace repl } // namespace mongo
\ No newline at end of file diff --git a/src/mongo/db/repl/tenant_migration_base_cloner.h b/src/mongo/db/repl/tenant_base_cloner.h index 9f9d6509a75..c5ccdba93f9 100644 --- a/src/mongo/db/repl/tenant_migration_base_cloner.h +++ b/src/mongo/db/repl/tenant_base_cloner.h @@ -36,20 +36,26 @@ namespace mongo { namespace repl { -class TenantMigrationBaseCloner : public BaseCloner { +class TenantBaseCloner : public BaseCloner { public: - TenantMigrationBaseCloner(StringData clonerName, - TenantMigrationSharedData* sharedData, - const HostAndPort& source, - DBClientConnection* client, - StorageInterface* storageInterface, - ThreadPool* dbPool); - virtual ~TenantMigrationBaseCloner() = default; + TenantBaseCloner(StringData clonerName, + TenantMigrationSharedData* sharedData, + const HostAndPort& source, + DBClientConnection* client, + StorageInterface* storageInterface, + ThreadPool* dbPool); + virtual ~TenantBaseCloner() = default; protected: TenantMigrationSharedData* getSharedData() const override { return checked_cast<TenantMigrationSharedData*>(BaseCloner::getSharedData()); } + +private: + /** + * Overriden to allow the BaseCloner to use the tenant migration log component. + */ + virtual logv2::LogComponent getLogComponent() final; }; } // namespace repl diff --git a/src/mongo/db/repl/tenant_cloner_test_fixture.cpp b/src/mongo/db/repl/tenant_cloner_test_fixture.cpp new file mode 100644 index 00000000000..b1323a23229 --- /dev/null +++ b/src/mongo/db/repl/tenant_cloner_test_fixture.cpp @@ -0,0 +1,50 @@ +/** + * Copyright (C) 2019-present MongoDB, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * <http://www.mongodb.com/licensing/server-side-public-license>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the Server Side Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ + +#include "mongo/platform/basic.h" + +#include "mongo/base/checked_cast.h" +#include "mongo/db/repl/tenant_cloner_test_fixture.h" + +namespace mongo { +namespace repl { + +void TenantClonerTestFixture::setUp() { + ClonerTestFixture::setUp(); + + _sharedData = std::make_unique<TenantMigrationSharedData>(&_clock); + + _mockClient->setOperationTime(_operationTime); +} + +TenantMigrationSharedData* TenantClonerTestFixture::getSharedData() { + return checked_cast<TenantMigrationSharedData*>(_sharedData.get()); +} +} // namespace repl +} // namespace mongo
\ No newline at end of file diff --git a/src/mongo/db/repl/tenant_cloner_test_fixture.h b/src/mongo/db/repl/tenant_cloner_test_fixture.h new file mode 100644 index 00000000000..3233485057d --- /dev/null +++ b/src/mongo/db/repl/tenant_cloner_test_fixture.h @@ -0,0 +1,49 @@ +/** + * Copyright (C) 2019-present MongoDB, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Server Side Public License, version 1, + * as published by MongoDB, Inc. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Server Side Public License for more details. + * + * You should have received a copy of the Server Side Public License + * along with this program. If not, see + * <http://www.mongodb.com/licensing/server-side-public-license>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the Server Side Public License in all respects for + * all of the code used other than as permitted herein. If you modify file(s) + * with this exception, you may extend this exception to your version of the + * file(s), but you are not obligated to do so. If you do not wish to do so, + * delete this exception statement from your version. If you delete this + * exception statement from all source files in the program, then also delete + * it in the license file. + */ + +#pragma once + +#include "mongo/db/repl/cloner_test_fixture.h" +#include "mongo/db/repl/tenant_migration_shared_data.h" + +namespace mongo { +namespace repl { + +class TenantClonerTestFixture : public ClonerTestFixture { +protected: + void setUp() override; + + TenantMigrationSharedData* getSharedData(); + + const Timestamp _operationTime = Timestamp(12345, 67); + const std::string _tenantId = "tenant42"; +}; + +} // namespace repl +} // namespace mongo
\ No newline at end of file diff --git a/src/mongo/db/repl/tenant_collection_cloner.cpp b/src/mongo/db/repl/tenant_collection_cloner.cpp index 8d90c77a2d3..43251eb6294 100644 --- a/src/mongo/db/repl/tenant_collection_cloner.cpp +++ b/src/mongo/db/repl/tenant_collection_cloner.cpp @@ -71,7 +71,7 @@ TenantCollectionCloner::TenantCollectionCloner(const NamespaceString& sourceNss, StorageInterface* storageInterface, ThreadPool* dbPool, StringData tenantId) - : TenantMigrationBaseCloner( + : TenantBaseCloner( "TenantCollectionCloner"_sd, sharedData, source, client, storageInterface, dbPool), _sourceNss(sourceNss), _collectionOptions(collectionOptions), diff --git a/src/mongo/db/repl/tenant_collection_cloner.h b/src/mongo/db/repl/tenant_collection_cloner.h index 76b44cbfca3..45d0ba022f7 100644 --- a/src/mongo/db/repl/tenant_collection_cloner.h +++ b/src/mongo/db/repl/tenant_collection_cloner.h @@ -34,14 +34,14 @@ #include "mongo/db/repl/base_cloner.h" #include "mongo/db/repl/task_runner.h" -#include "mongo/db/repl/tenant_migration_base_cloner.h" +#include "mongo/db/repl/tenant_base_cloner.h" #include "mongo/db/repl/tenant_migration_shared_data.h" #include "mongo/util/progress_meter.h" namespace mongo { namespace repl { -class TenantCollectionCloner : public TenantMigrationBaseCloner { +class TenantCollectionCloner : public TenantBaseCloner { public: struct Stats { static constexpr StringData kDocumentsToCopyFieldName = "documentsToCopy"_sd; @@ -229,11 +229,9 @@ private: TaskRunner _dbWorkTaskRunner; // (R) // The database name prefix of the tenant associated with this migration. - // TODO(SERVER-50492): Consider moving this into TenantMigrationSharedData. std::string _tenantId; // (R) // The operationTime returned with the listIndexes result. - // TODO(SERVER-50492): Consider moving this into TenantMigrationSharedData. Timestamp _operationTime; // (X) }; diff --git a/src/mongo/db/repl/tenant_collection_cloner_test.cpp b/src/mongo/db/repl/tenant_collection_cloner_test.cpp index 2c2e3f56983..9c0cfdf73fb 100644 --- a/src/mongo/db/repl/tenant_collection_cloner_test.cpp +++ b/src/mongo/db/repl/tenant_collection_cloner_test.cpp @@ -31,12 +31,11 @@ #include <vector> -#include "mongo/base/checked_cast.h" #include "mongo/bson/bsonmisc.h" -#include "mongo/db/repl/cloner_test_fixture.h" #include "mongo/db/repl/repl_server_parameters_gen.h" #include "mongo/db/repl/storage_interface.h" #include "mongo/db/repl/storage_interface_mock.h" +#include "mongo/db/repl/tenant_cloner_test_fixture.h" #include "mongo/db/repl/tenant_collection_cloner.h" #include "mongo/db/service_context_test_fixture.h" #include "mongo/dbtests/mock/mock_dbclient_connection.h" @@ -56,14 +55,13 @@ public: } }; -class TenantCollectionClonerTest : public ClonerTestFixture { +class TenantCollectionClonerTest : public TenantClonerTestFixture { public: TenantCollectionClonerTest() {} protected: void setUp() override { - ClonerTestFixture::setUp(); - _sharedData = std::make_unique<TenantMigrationSharedData>(kInitialRollbackId, &_clock); + TenantClonerTestFixture::setUp(); _standardCreateCollectionFn = [this](OperationContext* opCtx, const NamespaceString& nss, const CollectionOptions& options) -> Status { @@ -87,8 +85,6 @@ protected: }; _mockServer->assignCollectionUuid(_nss.ns(), _collUuid); - _mockServer->setCommandReply("replSetGetRBID", - BSON("ok" << 1 << "rbid" << getSharedData()->getRollBackId())); _mockClient->setOperationTime(_operationTime); } std::unique_ptr<TenantCollectionCloner> makeCollectionCloner( @@ -128,10 +124,6 @@ protected: return cloner->_idIndexSpec; } - TenantMigrationSharedData* getSharedData() { - return checked_cast<TenantMigrationSharedData*>(_sharedData.get()); - } - StorageInterfaceMock::CreateCollectionFn _standardCreateCollectionFn; StorageInterfaceMock::CreateIndexesOnEmptyCollectionFn _standardCreateIndexesOnEmptyCollectionFn; @@ -148,17 +140,9 @@ protected: << "a_1"), BSON("v" << 1 << "key" << BSON("b" << 1) << "name" << "b_1")}; - static std::string _tenantId; - static NamespaceString _nss; - static Timestamp _operationTime; + const NamespaceString _nss = {_tenantId + "_testDb", "testcoll"}; }; -/* static */ -std::string TenantCollectionClonerTest::_tenantId = "tenant42"; -NamespaceString TenantCollectionClonerTest::_nss = {_tenantId + "_testDb", "testcoll"}; -Timestamp TenantCollectionClonerTest::_operationTime = Timestamp(12345, 42); - - TEST_F(TenantCollectionClonerTest, CountStage) { auto cloner = makeCollectionCloner(); cloner->setStopAfterStage_forTest("count"); diff --git a/src/mongo/db/repl/tenant_database_cloner.cpp b/src/mongo/db/repl/tenant_database_cloner.cpp index 2d83fa28018..4294020a281 100644 --- a/src/mongo/db/repl/tenant_database_cloner.cpp +++ b/src/mongo/db/repl/tenant_database_cloner.cpp @@ -55,7 +55,7 @@ TenantDatabaseCloner::TenantDatabaseCloner(const std::string& dbName, StorageInterface* storageInterface, ThreadPool* dbPool, StringData tenantId) - : TenantMigrationBaseCloner( + : TenantBaseCloner( "TenantDatabaseCloner"_sd, sharedData, source, client, storageInterface, dbPool), _dbName(dbName), _listCollectionsStage("listCollections", this, &TenantDatabaseCloner::listCollectionsStage), diff --git a/src/mongo/db/repl/tenant_database_cloner.h b/src/mongo/db/repl/tenant_database_cloner.h index 87ba04ea3a5..899593d9930 100644 --- a/src/mongo/db/repl/tenant_database_cloner.h +++ b/src/mongo/db/repl/tenant_database_cloner.h @@ -32,14 +32,14 @@ #include <vector> #include "mongo/db/repl/base_cloner.h" +#include "mongo/db/repl/tenant_base_cloner.h" #include "mongo/db/repl/tenant_collection_cloner.h" -#include "mongo/db/repl/tenant_migration_base_cloner.h" #include "mongo/db/repl/tenant_migration_shared_data.h" namespace mongo { namespace repl { -class TenantDatabaseCloner final : public TenantMigrationBaseCloner { +class TenantDatabaseCloner final : public TenantBaseCloner { public: struct Stats { std::string dbname; diff --git a/src/mongo/db/repl/tenant_database_cloner_test.cpp b/src/mongo/db/repl/tenant_database_cloner_test.cpp index 9c3290a36a6..50385e8fd2f 100644 --- a/src/mongo/db/repl/tenant_database_cloner_test.cpp +++ b/src/mongo/db/repl/tenant_database_cloner_test.cpp @@ -29,11 +29,10 @@ #include "mongo/platform/basic.h" -#include "mongo/base/checked_cast.h" #include "mongo/db/clientcursor.h" -#include "mongo/db/repl/cloner_test_fixture.h" #include "mongo/db/repl/storage_interface.h" #include "mongo/db/repl/storage_interface_mock.h" +#include "mongo/db/repl/tenant_cloner_test_fixture.h" #include "mongo/db/repl/tenant_database_cloner.h" #include "mongo/db/service_context_test_fixture.h" #include "mongo/dbtests/mock/mock_dbclient_connection.h" @@ -49,14 +48,13 @@ struct TenantCollectionCloneInfo { bool collCreated = false; }; -class TenantDatabaseClonerTest : public ClonerTestFixture { +class TenantDatabaseClonerTest : public TenantClonerTestFixture { public: TenantDatabaseClonerTest() {} protected: void setUp() override { - ClonerTestFixture::setUp(); - _sharedData = std::make_unique<TenantMigrationSharedData>(kInitialRollbackId, &_clock); + TenantClonerTestFixture::setUp(); _storageInterface.createCollFn = [this](OperationContext* opCtx, const NamespaceString& nss, const CollectionOptions& options) -> Status { @@ -78,7 +76,6 @@ protected: collInfo->numDocsInserted += ops.size(); return Status::OK(); }; - setInitialSyncId(); _mockClient->setOperationTime(_operationTime); } @@ -127,22 +124,11 @@ protected: return cloner->_collections; } - TenantMigrationSharedData* getSharedData() { - return checked_cast<TenantMigrationSharedData*>(_sharedData.get()); - } - std::map<NamespaceString, TenantCollectionCloneInfo> _collections; - static std::string _tenantId; - static std::string _dbName; - static Timestamp _operationTime; + const std::string _dbName = _tenantId + "_testDb"; }; -/* static */ -std::string TenantDatabaseClonerTest::_tenantId = "tenant42"; -std::string TenantDatabaseClonerTest::_dbName = _tenantId + "_testDb"; -Timestamp TenantDatabaseClonerTest::_operationTime = Timestamp(12345, 42); - // A database may have no collections. Nothing to do for the tenant database cloner. TEST_F(TenantDatabaseClonerTest, ListCollectionsReturnedNoCollections) { _mockServer->setCommandReply("listCollections", createListCollectionsResponse({})); diff --git a/src/mongo/db/repl/tenant_migration_shared_data.h b/src/mongo/db/repl/tenant_migration_shared_data.h index aa343545378..63c8283b637 100644 --- a/src/mongo/db/repl/tenant_migration_shared_data.h +++ b/src/mongo/db/repl/tenant_migration_shared_data.h @@ -36,29 +36,12 @@ namespace mongo { namespace repl { class TenantMigrationSharedData final : public ReplSyncSharedData { public: - TenantMigrationSharedData(int rollBackId, ClockSource* clock) - : ReplSyncSharedData(rollBackId, Days(1) /* allowedOutageDuration */, clock) {} + TenantMigrationSharedData(ClockSource* clock) : ReplSyncSharedData(clock) {} void setLastVisibleOpTime(WithLock, OpTime opTime); OpTime getLastVisibleOpTime(WithLock); - // These are all dummy implementations. - void setSyncSourceWireVersion(WithLock, WireVersion wireVersion) override {} - boost::optional<WireVersion> getSyncSourceWireVersion(WithLock) override { - return boost::none; - } - void setInitialSyncSourceId(WithLock, boost::optional<UUID> syncSourceId) override {} - boost::optional<UUID> getInitialSyncSourceId(WithLock) override { - return boost::none; - } - bool shouldRetryOperation(WithLock lk, RetryableOperation* retryableOp) override { - return false; - }; - int decrementRetryingOperations(WithLock lk) override { - return 0; - } - private: // Must hold mutex (in base class) to access this. OpTime _lastVisibleOpTime; |