summaryrefslogtreecommitdiff
path: root/src/mongo/db
diff options
context:
space:
mode:
authorAbdul Qadeer <abdul.qadeer@mongodb.com>2023-04-14 20:35:47 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2023-04-14 21:27:36 +0000
commit526f2bd98356f8a570e6da0c6b5c3c0e033c32ef (patch)
tree8e6a6ca0a935ea80b08df7da78b7b212d950c3d2 /src/mongo/db
parent0d82998063157d5f24026a278026aa5009f981dd (diff)
downloadmongo-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.cpp26
-rw-r--r--src/mongo/db/s/move_primary/move_primary_recipient_service.h8
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.
*/