diff options
author | Matthew Russotto <matthew.russotto@mongodb.com> | 2019-11-04 16:24:35 +0000 |
---|---|---|
committer | evergreen <evergreen@mongodb.com> | 2019-11-04 16:24:35 +0000 |
commit | 3ee34d4b15bb263106427688b7915bb8571eaecd (patch) | |
tree | 904f161a2509e88e04a3ae83c1edb44ef1a56483 /src/mongo | |
parent | be045feaf3ba4af8037c5baceda2b15cd2498a24 (diff) | |
download | mongo-3ee34d4b15bb263106427688b7915bb8571eaecd.tar.gz |
SERVER-44374 Base cloner must not hold locks when fulfilling promise
Diffstat (limited to 'src/mongo')
-rw-r--r-- | src/mongo/db/repl/base_cloner.cpp | 8 |
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; } |