summaryrefslogtreecommitdiff
path: root/src/mongo/db/repl
diff options
context:
space:
mode:
authorMatthew Russotto <matthew.russotto@mongodb.com>2019-11-04 16:24:35 +0000
committerevergreen <evergreen@mongodb.com>2019-11-04 16:24:35 +0000
commit3ee34d4b15bb263106427688b7915bb8571eaecd (patch)
tree904f161a2509e88e04a3ae83c1edb44ef1a56483 /src/mongo/db/repl
parentbe045feaf3ba4af8037c5baceda2b15cd2498a24 (diff)
downloadmongo-3ee34d4b15bb263106427688b7915bb8571eaecd.tar.gz
SERVER-44374 Base cloner must not hold locks when fulfilling promise
Diffstat (limited to 'src/mongo/db/repl')
-rw-r--r--src/mongo/db/repl/base_cloner.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/mongo/db/repl/base_cloner.cpp b/src/mongo/db/repl/base_cloner.cpp
index 6af5995a4ae..9aca6c4350a 100644
--- a/src/mongo/db/repl/base_cloner.cpp
+++ b/src/mongo/db/repl/base_cloner.cpp
@@ -177,8 +177,12 @@ Future<void> BaseCloner::runOnExecutor(TaskExecutor* executor) {
_promise = std::move(pf.promise);
auto callback = [this](const TaskExecutor::CallbackArgs& args) mutable {
if (!args.status.isOK()) {
- stdx::lock_guard<Latch> lk(_mutex);
- _startedAsync = false;
+ {
+ stdx::lock_guard<Latch> lk(_mutex);
+ _startedAsync = false;
+ }
+ // The _promise can run the error callback on this thread, so we must not hold the lock
+ // when we set it.
_promise.setError(args.status);
return;
}