summaryrefslogtreecommitdiff
path: root/src/mongo/db/s/drop_collection_coordinator.cpp
diff options
context:
space:
mode:
authorEnrico Golfieri <enrico.golfieri@mongodb.com>2022-05-10 12:26:21 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-05-10 13:29:23 +0000
commitc4522f8d57ded742ff66a303fb264f517c06502a (patch)
tree4e7f113d074592ee67ea9b1b150ea35d3ac986f4 /src/mongo/db/s/drop_collection_coordinator.cpp
parentc6e976d9f67a1b50826784e7a0eda9bfe212dd73 (diff)
downloadmongo-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.cpp19
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(