diff options
-rw-r--r-- | src/mongo/db/commands/migrate_tenant_cmds.cpp | 12 | ||||
-rw-r--r-- | src/mongo/db/repl/migrating_tenant_donor_util.cpp | 18 | ||||
-rw-r--r-- | src/mongo/db/repl/migrating_tenant_donor_util.h | 2 |
3 files changed, 30 insertions, 2 deletions
diff --git a/src/mongo/db/commands/migrate_tenant_cmds.cpp b/src/mongo/db/commands/migrate_tenant_cmds.cpp index a313b42f8ad..15e8a522a89 100644 --- a/src/mongo/db/commands/migrate_tenant_cmds.cpp +++ b/src/mongo/db/commands/migrate_tenant_cmds.cpp @@ -30,6 +30,8 @@ #include "mongo/db/commands.h" #include "mongo/db/commands/migrate_tenant_cmds_gen.h" +#include "mongo/db/repl/migrate_tenant_state_machine_gen.h" +#include "mongo/db/repl/migrating_tenant_donor_util.h" namespace mongo { namespace { @@ -75,7 +77,15 @@ public: using ParentInvocation = MigrationDonorCmdBase<DonorStartMigration>::Invocation; class Invocation final : public ParentInvocation { public: - void typedRun(OperationContext* opCtx) {} + void typedRun(OperationContext* opCtx) { + const auto requestBody = request(); + StringData dbPrefix = requestBody.getDatabasePrefix(); + auto donorStartState = TenantMigrationDonorStateEnum::kDataSync; + + const TenantMigrationDonorDocument donorDocument( + OID::gen(), dbPrefix.toString(), donorStartState); + migrating_tenant_donor_util::dataSync(opCtx, donorDocument); + } private: void doCheckAuthorization(OperationContext* opCtx) const override {} diff --git a/src/mongo/db/repl/migrating_tenant_donor_util.cpp b/src/mongo/db/repl/migrating_tenant_donor_util.cpp index 8e1501fc5ae..6925c391f5f 100644 --- a/src/mongo/db/repl/migrating_tenant_donor_util.cpp +++ b/src/mongo/db/repl/migrating_tenant_donor_util.cpp @@ -85,11 +85,14 @@ void onTransitionToBlocking(OperationContext* opCtx, TenantMigrationDonorDocumen } // namespace +/** + * TODO - Implement recipientSyncData command + */ void dataSync(OperationContext* opCtx, const TenantMigrationDonorDocument& originalDoc) { // Send recipientSyncData. // Call startBlockingWrites. - + startTenantMigrationBlockOnPrimary(opCtx, originalDoc); // Update the on-disk state of the migration to "blocking" state. invariant(originalDoc.getState() == TenantMigrationDonorStateEnum::kDataSync); @@ -143,6 +146,19 @@ void dataSync(OperationContext* opCtx, const TenantMigrationDonorDocument& origi })); } +void startTenantMigrationBlockOnPrimary(OperationContext* opCtx, + const TenantMigrationDonorDocument& donorDoc) { + invariant(donorDoc.getState() == TenantMigrationDonorStateEnum::kDataSync); + auto serviceContext = opCtx->getServiceContext(); + + executor::TaskExecutor* mtabExecutor = getTenantMigrationExecutor(serviceContext).get(); + auto mtab = std::make_shared<MigratingTenantAccessBlocker>(serviceContext, mtabExecutor); + + mtab->startBlockingWrites(); + + auto& mtabByPrefix = MigratingTenantAccessBlockerByPrefix::get(serviceContext); + mtabByPrefix.add(donorDoc.getDatabasePrefix(), mtab); +} std::shared_ptr<executor::TaskExecutor> getTenantMigrationExecutor(ServiceContext* serviceContext) { ThreadPool::Options tpOptions; tpOptions.threadNamePrefix = kThreadNamePrefix; diff --git a/src/mongo/db/repl/migrating_tenant_donor_util.h b/src/mongo/db/repl/migrating_tenant_donor_util.h index 49db3fce5c1..da87e083100 100644 --- a/src/mongo/db/repl/migrating_tenant_donor_util.h +++ b/src/mongo/db/repl/migrating_tenant_donor_util.h @@ -54,6 +54,8 @@ std::shared_ptr<executor::TaskExecutor> getTenantMigrationExecutor(ServiceContex */ void onTenantMigrationDonorStateTransition(OperationContext* opCtx, const BSONObj& doc); +void startTenantMigrationBlockOnPrimary(OperationContext* opCtx, const TenantMigrationDonorDocument& donorDoc); + } // namespace migrating_tenant_donor_util } // namespace mongo |