diff options
author | smani87 <suganthi.mani@mongodb.com> | 2018-06-12 09:30:05 -0400 |
---|---|---|
committer | smani87 <suganthi.mani@mongodb.com> | 2018-06-13 15:06:58 -0400 |
commit | 26706cb04de995a2d7252da936ba815217239a60 (patch) | |
tree | aa68ba914ebcf771cadf72e9a617e737018027ce | |
parent | 4ef027f98d5c00a0f4e507cbe39a22cab4c7a44c (diff) | |
download | mongo-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.cpp | 14 |
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(); } } |