summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsmani87 <suganthi.mani@mongodb.com>2018-06-12 09:30:05 -0400
committersmani87 <suganthi.mani@mongodb.com>2018-06-13 15:06:58 -0400
commit26706cb04de995a2d7252da936ba815217239a60 (patch)
treeaa68ba914ebcf771cadf72e9a617e737018027ce
parent4ef027f98d5c00a0f4e507cbe39a22cab4c7a44c (diff)
downloadmongo-26706cb04de995a2d7252da936ba815217239a60.tar.gz
SERVER-34758 Fix to prevent deadlock between initial sync and replSetGetStatus cmd when called along with initialSync:1.
(cherry picked from commit 3c6d6969752ad4322594dab171ca7dd26b854bc8)
-rw-r--r--src/mongo/db/repl/replication_coordinator_impl.cpp14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/mongo/db/repl/replication_coordinator_impl.cpp b/src/mongo/db/repl/replication_coordinator_impl.cpp
index ad1a9fd93ba..10b60b7a205 100644
--- a/src/mongo/db/repl/replication_coordinator_impl.cpp
+++ b/src/mongo/db/repl/replication_coordinator_impl.cpp
@@ -2077,9 +2077,17 @@ Status ReplicationCoordinatorImpl::processReplSetGetStatus(
BSONObj initialSyncProgress;
if (responseStyle == ReplSetGetStatusResponseStyle::kInitialSync) {
- LockGuard lk(_mutex);
- if (_initialSyncer) {
- initialSyncProgress = _initialSyncer->getInitialSyncProgress();
+ std::shared_ptr<InitialSyncer> initialSyncerCopy;
+ {
+ LockGuard lk(_mutex);
+ initialSyncerCopy = _initialSyncer;
+ }
+
+ // getInitialSyncProgress must be called outside the ReplicationCoordinatorImpl::_mutex
+ // lock. Else it might deadlock with InitialSyncer::_multiApplierCallback where it first
+ // acquires InitialSyncer::_mutex and then ReplicationCoordinatorImpl::_mutex.
+ if (initialSyncerCopy) {
+ initialSyncProgress = initialSyncerCopy->getInitialSyncProgress();
}
}