summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/resharding/resharding_donor_service.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/db/s/resharding/resharding_donor_service.cpp')
-rw-r--r--src/mongo/db/s/resharding/resharding_donor_service.cpp27
1 files changed, 22 insertions, 5 deletions
diff --git a/src/mongo/db/s/resharding/resharding_donor_service.cpp b/src/mongo/db/s/resharding/resharding_donor_service.cpp
index 469190a16ee..99ff6fea7c5 100644
--- a/src/mongo/db/s/resharding/resharding_donor_service.cpp
+++ b/src/mongo/db/s/resharding/resharding_donor_service.cpp
@@ -265,6 +265,20 @@ ExecutorFuture<void> ReshardingDonorService::DonorStateMachine::_runUntilBlockin
.onUnrecoverableError([](const Status& status) {})
.until([](const Status& status) { return status.isOK(); })
.on(**executor, abortToken);
+ })
+ .onCompletion([this, executor, abortToken](Status status) {
+ if (abortToken.isCanceled()) {
+ return ExecutorFuture<void>(**executor, status);
+ }
+
+ {
+ // The donor is done with all local transitions until the coordinator makes its
+ // decision.
+ stdx::lock_guard<Latch> lk(_mutex);
+ invariant(_donorCtx.getState() >= DonorStateEnum::kError);
+ ensureFulfilledPromise(lk, _inBlockingWritesOrError);
+ }
+ return ExecutorFuture<void>(**executor, status);
});
}
@@ -543,10 +557,13 @@ ExecutorFuture<void> ReshardingDonorService::DonorStateMachine::
.thenRunOn(**executor)
.then([this]() { _transitionState(DonorStateEnum::kDonatingOplogEntries); })
.onCompletion([=](Status s) {
- if (MONGO_unlikely(
- reshardingDonorFailsAfterTransitionToDonatingOplogEntries.shouldFail())) {
- uasserted(ErrorCodes::InternalError, "Failing for test");
- }
+ reshardingDonorFailsAfterTransitionToDonatingOplogEntries.execute(
+ [&](const BSONObj& data) {
+ auto errmsgElem = data["errmsg"];
+ StringData errmsg =
+ errmsgElem ? errmsgElem.checkAndGetStringData() : "Failing for test"_sd;
+ uasserted(ErrorCodes::InternalError, errmsg);
+ });
});
}
@@ -733,7 +750,7 @@ void ReshardingDonorService::DonorStateMachine::_transitionToDonatingInitialData
void ReshardingDonorService::DonorStateMachine::_transitionToError(Status abortReason) {
auto newDonorCtx = _donorCtx;
newDonorCtx.setState(DonorStateEnum::kError);
- emplaceAbortReasonIfExists(newDonorCtx, abortReason);
+ emplaceTruncatedAbortReasonIfExists(newDonorCtx, abortReason);
_transitionState(std::move(newDonorCtx));
}