diff options
author | Enrico Golfieri <enrico.golfieri@mongodb.com> | 2022-05-10 12:26:21 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-05-10 13:29:23 +0000 |
commit | c4522f8d57ded742ff66a303fb264f517c06502a (patch) | |
tree | 4e7f113d074592ee67ea9b1b150ea35d3ac986f4 /src/mongo/db/s/drop_collection_coordinator.cpp | |
parent | c6e976d9f67a1b50826784e7a0eda9bfe212dd73 (diff) | |
download | mongo-c4522f8d57ded742ff66a303fb264f517c06502a.tar.gz |
SERVER-62432 Ensure safe access to ShardingDDLCoordinator instance state documents
Diffstat (limited to 'src/mongo/db/s/drop_collection_coordinator.cpp')
-rw-r--r-- | src/mongo/db/s/drop_collection_coordinator.cpp | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/src/mongo/db/s/drop_collection_coordinator.cpp b/src/mongo/db/s/drop_collection_coordinator.cpp index f14fb6305e9..7dabcae0f16 100644 --- a/src/mongo/db/s/drop_collection_coordinator.cpp +++ b/src/mongo/db/s/drop_collection_coordinator.cpp @@ -61,13 +61,19 @@ boost::optional<BSONObj> DropCollectionCoordinator::reportForCurrentOp( if (const auto& optComment = getForwardableOpMetadata().getComment()) { cmdBob.append(optComment.get().firstElement()); } + + const auto currPhase = [&]() { + stdx::lock_guard l{_docMutex}; + return _doc.getPhase(); + }(); + BSONObjBuilder bob; bob.append("type", "op"); bob.append("desc", "DropCollectionCoordinator"); bob.append("op", "command"); bob.append("ns", nss().toString()); bob.append("command", cmdBob.obj()); - bob.append("currentPhase", _doc.getPhase()); + bob.append("currentPhase", currPhase); bob.append("active", true); return bob.obj(); } @@ -107,10 +113,15 @@ void DropCollectionCoordinator::_enterPhase(Phase newPhase) { "oldPhase"_attr = DropCollectionCoordinatorPhase_serializer(_doc.getPhase())); if (_doc.getPhase() == Phase::kUnset) { - _doc = _insertStateDocument(std::move(newDoc)); - return; + newDoc = _insertStateDocument(std::move(newDoc)); + } else { + newDoc = _updateStateDocument(cc().makeOperationContext().get(), std::move(newDoc)); + } + + { + stdx::unique_lock ul{_docMutex}; + _doc = std::move(newDoc); } - _doc = _updateStateDocument(cc().makeOperationContext().get(), std::move(newDoc)); } ExecutorFuture<void> DropCollectionCoordinator::_runImpl( |