summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuis Osta <luis.osta@mongodb.com>2020-07-14 21:19:11 +0000
committerLuis Osta <luis.osta@mongodb.com>2020-07-17 15:26:06 +0000
commite05dccf26ba6bd0362351cfff841ebdaae1ba23f (patch)
tree51c9805fe62155d078b3a2c277d7162272819b1b
parent4aa1a5d5d49e13d1080b1d73eb4ba79b49e1acb2 (diff)
downloadmongo-e05dccf26ba6bd0362351cfff841ebdaae1ba23f.tar.gz
WIP startBlockWrites
-rw-r--r--src/mongo/db/commands/migrate_tenant_cmds.cpp12
-rw-r--r--src/mongo/db/repl/migrating_tenant_donor_util.cpp18
-rw-r--r--src/mongo/db/repl/migrating_tenant_donor_util.h2
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