From b65f66e20f7ba380b2202947b68db89d42c45931 Mon Sep 17 00:00:00 2001 From: Misha Tyulenev Date: Wed, 8 Feb 2017 13:13:20 -0500 Subject: SERVER-27940: fix deadlock in ReplicaSetMonitorManager on shutdown --- src/mongo/client/replica_set_monitor_manager.cpp | 39 ++++++++++++++++-------- 1 file changed, 26 insertions(+), 13 deletions(-) (limited to 'src/mongo/client/replica_set_monitor_manager.cpp') diff --git a/src/mongo/client/replica_set_monitor_manager.cpp b/src/mongo/client/replica_set_monitor_manager.cpp index 773619086a4..561bcfded74 100644 --- a/src/mongo/client/replica_set_monitor_manager.cpp +++ b/src/mongo/client/replica_set_monitor_manager.cpp @@ -155,26 +155,39 @@ void ReplicaSetMonitorManager::removeMonitor(StringData setName) { } } - void ReplicaSetMonitorManager::shutdown() { - stdx::lock_guard lk(_mutex); - if (_taskExecutor && !_isShutdown) { - LOG(1) << "Shutting down task executor used for monitoring replica sets"; - _taskExecutor->shutdown(); - _taskExecutor->join(); + + { + stdx::lock_guard lk(_mutex); + if (!_taskExecutor || _isShutdown) { + return; + } _isShutdown = true; } + + LOG(1) << "Shutting down task executor used for monitoring replica sets"; + _taskExecutor->shutdown(); + _taskExecutor->join(); } void ReplicaSetMonitorManager::removeAllMonitors() { - stdx::lock_guard lk(_mutex); - _monitors = ReplicaSetMonitorsMap(); + { + stdx::lock_guard lk(_mutex); + _monitors = ReplicaSetMonitorsMap(); + if (!_taskExecutor || _isShutdown) { + return; + } + _isShutdown = true; + } + + LOG(1) << "Shutting down task executor used for monitoring replica sets"; + _taskExecutor->shutdown(); + _taskExecutor->join(); + _taskExecutor.reset(); - if (_taskExecutor) { - LOG(1) << "Shutting down task executor used for monitoring replica sets"; - _taskExecutor->shutdown(); - _taskExecutor->join(); - _taskExecutor.reset(); + { + stdx::lock_guard lk(_mutex); + _isShutdown = false; } } -- cgit v1.2.1