From ca9f854ac4b7f9197a0574f72e450a8317696286 Mon Sep 17 00:00:00 2001 From: Cheahuychou Mao Date: Fri, 22 Jan 2021 19:54:31 +0000 Subject: SERVER-53981 Make TenantMigrationAccessBlocker::setCommitOpTime and setAbortOpTime not try to set completion promise if it is already set --- src/mongo/db/repl/tenant_migration_access_blocker.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/mongo/db/repl/tenant_migration_access_blocker.cpp b/src/mongo/db/repl/tenant_migration_access_blocker.cpp index a601ddd6d8f..a145c40cbad 100644 --- a/src/mongo/db/repl/tenant_migration_access_blocker.cpp +++ b/src/mongo/db/repl/tenant_migration_access_blocker.cpp @@ -243,6 +243,11 @@ void TenantMigrationAccessBlocker::setCommitOpTime(OperationContext* opCtx, repl } stdx::unique_lock lk(_mutex); + if (_completionPromise.getFuture().isReady()) { + // onMajorityCommitPointUpdate() was called during the time that this thread is not holding + // the lock. + return; + } _onMajorityCommitCommitOpTime(lk); } @@ -266,6 +271,11 @@ void TenantMigrationAccessBlocker::setAbortOpTime(OperationContext* opCtx, repl: } stdx::unique_lock lk(_mutex); + if (_completionPromise.getFuture().isReady()) { + // onMajorityCommitPointUpdate() was called during the time that this thread is not holding + // the lock. + return; + } _onMajorityCommitAbortOpTime(lk); } @@ -305,7 +315,9 @@ void TenantMigrationAccessBlocker::_onMajorityCommitCommitOpTime(stdx::unique_lo } void TenantMigrationAccessBlocker::_onMajorityCommitAbortOpTime(stdx::unique_lock& lk) { + invariant(_state != State::kReject); invariant(!_commitOpTime); + invariant(_state != State::kAborted); invariant(_abortOpTime); _state = State::kAborted; -- cgit v1.2.1