diff options
Diffstat (limited to 'src/mongo/db/s/sharding_ddl_coordinator.h')
-rw-r--r-- | src/mongo/db/s/sharding_ddl_coordinator.h | 77 |
1 files changed, 41 insertions, 36 deletions
diff --git a/src/mongo/db/s/sharding_ddl_coordinator.h b/src/mongo/db/s/sharding_ddl_coordinator.h index db0827d1142..267b3161b04 100644 --- a/src/mongo/db/s/sharding_ddl_coordinator.h +++ b/src/mongo/db/s/sharding_ddl_coordinator.h @@ -372,6 +372,47 @@ protected: } } + /** + * Advances and persists the `txnNumber` to ensure causality between requests, then returns the + * updated operation session information (OSI). + */ + OperationSessionInfo getNewSession(OperationContext* opCtx) { + _updateSession(opCtx); + return getCurrentSession(); + } + + virtual boost::optional<Status> getAbortReason() const override { + const auto& status = _doc.getAbortReason(); + invariant(!status || !status->isOK(), "when persisted, status must be an error"); + return status; + } + + /** + * Persists the abort reason and throws it as an exception. This causes the coordinator to fail, + * and triggers the cleanup future chain since there is a the persisted reason. + */ + void triggerCleanup(OperationContext* opCtx, const Status& status) { + LOGV2_INFO(7418502, + "Coordinator failed, persisting abort reason", + "coordinatorId"_attr = _doc.getId(), + "phase"_attr = serializePhase(_doc.getPhase()), + "reason"_attr = redact(status)); + + auto newDoc = [&] { + stdx::lock_guard lk{_docMutex}; + return _doc; + }(); + + auto coordinatorMetadata = newDoc.getShardingDDLCoordinatorMetadata(); + coordinatorMetadata.setAbortReason(status); + newDoc.setShardingDDLCoordinatorMetadata(std::move(coordinatorMetadata)); + + _updateStateDocument(opCtx, std::move(newDoc)); + + uassertStatusOK(status); + } + +private: // lazily acquire Logical Session ID and a txn number void _updateSession(OperationContext* opCtx) { auto newDoc = [&] { @@ -408,42 +449,6 @@ protected: osi.setTxnNumber(optSession->getTxnNumber()); return osi; } - - OperationSessionInfo getNewSession(OperationContext* opCtx) { - _updateSession(opCtx); - return getCurrentSession(); - } - - virtual boost::optional<Status> getAbortReason() const override { - const auto& status = _doc.getAbortReason(); - invariant(!status || !status->isOK(), "when persisted, status must be an error"); - return status; - } - - /** - * Persists the abort reason and throws it as an exception. This causes the coordinator to fail, - * and triggers the cleanup future chain since there is a the persisted reason. - */ - void triggerCleanup(OperationContext* opCtx, const Status& status) { - LOGV2_INFO(7418502, - "Coordinator failed, persisting abort reason", - "coordinatorId"_attr = _doc.getId(), - "phase"_attr = serializePhase(_doc.getPhase()), - "reason"_attr = redact(status)); - - auto newDoc = [&] { - stdx::lock_guard lk{_docMutex}; - return _doc; - }(); - - auto coordinatorMetadata = newDoc.getShardingDDLCoordinatorMetadata(); - coordinatorMetadata.setAbortReason(status); - newDoc.setShardingDDLCoordinatorMetadata(std::move(coordinatorMetadata)); - - _updateStateDocument(opCtx, std::move(newDoc)); - - uassertStatusOK(status); - } }; #undef MONGO_LOGV2_DEFAULT_COMPONENT |