diff options
author | Abdul Qadeer <abdul.qadeer@mongodb.com> | 2023-04-14 20:35:47 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2023-04-14 21:27:36 +0000 |
commit | 526f2bd98356f8a570e6da0c6b5c3c0e033c32ef (patch) | |
tree | 8e6a6ca0a935ea80b08df7da78b7b212d950c3d2 /src/mongo/db | |
parent | 0d82998063157d5f24026a278026aa5009f981dd (diff) | |
download | mongo-526f2bd98356f8a570e6da0c6b5c3c0e033c32ef.tar.gz |
SERVER-75870 Add internal abort in unrecoverable error code paths
Diffstat (limited to 'src/mongo/db')
-rw-r--r-- | src/mongo/db/s/move_primary/move_primary_recipient_service.cpp | 26 | ||||
-rw-r--r-- | src/mongo/db/s/move_primary/move_primary_recipient_service.h | 8 |
2 files changed, 26 insertions, 8 deletions
diff --git a/src/mongo/db/s/move_primary/move_primary_recipient_service.cpp b/src/mongo/db/s/move_primary/move_primary_recipient_service.cpp index 08b73e844ba..07f4e78e5d6 100644 --- a/src/mongo/db/s/move_primary/move_primary_recipient_service.cpp +++ b/src/mongo/db/s/move_primary/move_primary_recipient_service.cpp @@ -208,7 +208,11 @@ SemiFuture<void> MovePrimaryRecipientService::MovePrimaryRecipient::run( return _abortCalled; }(); - if (abortCalled || shouldAbort) { + if (shouldAbort) { + _internalAbort(); + } + + if (abortCalled) { abort(); } @@ -288,6 +292,14 @@ void MovePrimaryRecipientService::MovePrimaryRecipient::abort() { } } +void MovePrimaryRecipientService::MovePrimaryRecipient::_internalAbort() { + { + stdx::lock_guard<Latch> lg(_mutex); + invariant(_state < MovePrimaryRecipientStateEnum::kPrepared); + } + abort(); +} + void MovePrimaryRecipientService::MovePrimaryRecipient::_cloneDataFromDonor( OperationContext* opCtx) { // Enable write blocking bypass to allow cloning of catalog data even if writes are disallowed. @@ -332,7 +344,7 @@ MovePrimaryRecipientService::MovePrimaryRecipient::_transitionToCloningStateAndC "MovePrimaryRecipient encountered unrecoverable error in _transitionToCloningState", "_metadata"_attr = _metadata, "_error"_attr = status); - abort(); + _internalAbort(); }) .until<Status>([](const Status& status) { return status.isOK(); }) .on(**executor, _ctHolder->getAbortToken()) @@ -372,7 +384,7 @@ ExecutorFuture<void> MovePrimaryRecipientService::MovePrimaryRecipient::_transit "_transitionToApplyingState", "_metadata"_attr = _metadata, "_error"_attr = status); - abort(); + _internalAbort(); }) .until<Status>([](const Status& status) { return status.isOK(); }) .on(**executor, _ctHolder->getAbortToken()) @@ -426,7 +438,7 @@ ExecutorFuture<void> MovePrimaryRecipientService::MovePrimaryRecipient:: "_transitionToBlockingStateAndAcquireCriticalSection", "_metadata"_attr = _metadata, "_error"_attr = status); - abort(); + _internalAbort(); }) .until<Status>([](const Status& status) { return status.isOK(); }) .on(**executor, _ctHolder->getAbortToken()) @@ -461,7 +473,7 @@ ExecutorFuture<void> MovePrimaryRecipientService::MovePrimaryRecipient::_transit "_transitionToPreparedState", "_metadata"_attr = _metadata, "_error"_attr = status); - abort(); + _internalAbort(); }) .until<Status>([](const Status& status) { return status.isOK(); }) .on(**executor, _ctHolder->getAbortToken()) @@ -791,7 +803,7 @@ MovePrimaryRecipientService::MovePrimaryRecipient::_transitionToInitializingStat "MovePrimaryRecipient received unrecoverable error in " "_transitionToInitializingState", "error"_attr = status); - abort(); + _internalAbort(); }) .until<Status>([](const Status& status) { return status.isOK(); }) .on(**executor, _ctHolder->getAbortToken()) @@ -830,7 +842,7 @@ ExecutorFuture<void> MovePrimaryRecipientService::MovePrimaryRecipient::_initial LOGV2(7306801, "Received unrecoverable error while initializing for cloning state", "error"_attr = status); - abort(); + _internalAbort(); }) .until<Status>([](const Status& status) { return status.isOK(); }) .on(**executor, _ctHolder->getAbortToken()); diff --git a/src/mongo/db/s/move_primary/move_primary_recipient_service.h b/src/mongo/db/s/move_primary/move_primary_recipient_service.h index 8ea0c74a790..7e1b99a8a02 100644 --- a/src/mongo/db/s/move_primary/move_primary_recipient_service.h +++ b/src/mongo/db/s/move_primary/move_primary_recipient_service.h @@ -186,7 +186,7 @@ public: void interrupt(Status status) override{}; /** - * Aborts the ongoing movePrimary operation which may be user initiated. + * Aborts the ongoing movePrimary operation which should be user initiated. */ void abort(); @@ -261,6 +261,12 @@ public: const std::shared_ptr<executor::ScopedTaskExecutor>& executor); /** + * This function is called if the recipient service decides to abort due to unrecoverable + * errors. + */ + void _internalAbort(); + + /** * Clears cached database info on recipient shard to trigger a refresh on next request with * DB version. This is done before releasing critical section. */ |