diff options
-rw-r--r-- | src/mongo/client/replica_set_monitor.h | 2 | ||||
-rw-r--r-- | src/mongo/client/scanning_replica_set_monitor.cpp | 3 | ||||
-rw-r--r-- | src/mongo/client/scanning_replica_set_monitor.h | 2 | ||||
-rw-r--r-- | src/mongo/client/server_ping_monitor.cpp | 4 | ||||
-rw-r--r-- | src/mongo/client/streamable_replica_set_monitor.cpp | 6 | ||||
-rw-r--r-- | src/mongo/client/streamable_replica_set_monitor.h | 6 |
6 files changed, 18 insertions, 5 deletions
diff --git a/src/mongo/client/replica_set_monitor.h b/src/mongo/client/replica_set_monitor.h index 325dff90169..9472ae2d241 100644 --- a/src/mongo/client/replica_set_monitor.h +++ b/src/mongo/client/replica_set_monitor.h @@ -52,7 +52,7 @@ namespace mongo { */ class ReplicaSetMonitor : public ReplicaSetMonitorInterface { public: - virtual ~ReplicaSetMonitor() = default; + ~ReplicaSetMonitor() override = default; /** * Creates a new ReplicaSetMonitor, if it doesn't already exist. diff --git a/src/mongo/client/scanning_replica_set_monitor.cpp b/src/mongo/client/scanning_replica_set_monitor.cpp index be7cc455344..651c3459c02 100644 --- a/src/mongo/client/scanning_replica_set_monitor.cpp +++ b/src/mongo/client/scanning_replica_set_monitor.cpp @@ -201,6 +201,8 @@ void ScanningReplicaSetMonitor::drop() { } ScanningReplicaSetMonitor::~ScanningReplicaSetMonitor() { + // `drop` is idempotent and a duplicate call from ReplicaSetMonitorManager::removeMonitor() is + // safe. drop(); } @@ -1434,6 +1436,7 @@ void SetState::init() { } void SetState::drop() { + // This is invoked from ScanningReplicaSetMonitor::drop() under lock. if (std::exchange(isDropped, true)) { // If a SetState calls drop() from destruction after the RSMM calls shutdown(), then the // RSMM's executor may no longer exist. Thus, only drop once. diff --git a/src/mongo/client/scanning_replica_set_monitor.h b/src/mongo/client/scanning_replica_set_monitor.h index 40119cb894e..573b052fb53 100644 --- a/src/mongo/client/scanning_replica_set_monitor.h +++ b/src/mongo/client/scanning_replica_set_monitor.h @@ -133,7 +133,7 @@ public: * Allows tests to set initial conditions and introspect the current state. */ explicit ScanningReplicaSetMonitor(const SetStatePtr& initialState); - ~ScanningReplicaSetMonitor(); + ~ScanningReplicaSetMonitor() override; /** * This is for use in tests using MockReplicaSet to ensure that a full scan completes before diff --git a/src/mongo/client/server_ping_monitor.cpp b/src/mongo/client/server_ping_monitor.cpp index 65a8ae90c63..ae3527eb152 100644 --- a/src/mongo/client/server_ping_monitor.cpp +++ b/src/mongo/client/server_ping_monitor.cpp @@ -71,7 +71,9 @@ void SingleServerPingMonitor::init() { void SingleServerPingMonitor::drop() { stdx::lock_guard lk(_mutex); - _isDropped = true; + if (std::exchange(_isDropped, true)) { + return; + } if (auto handle = std::exchange(_pingHandle, {})) { _executor->cancel(handle); } diff --git a/src/mongo/client/streamable_replica_set_monitor.cpp b/src/mongo/client/streamable_replica_set_monitor.cpp index 37437203958..76cbfbedba6 100644 --- a/src/mongo/client/streamable_replica_set_monitor.cpp +++ b/src/mongo/client/streamable_replica_set_monitor.cpp @@ -170,6 +170,12 @@ StreamableReplicaSetMonitor::StreamableReplicaSetMonitor( _serverSelector = std::make_unique<SdamServerSelector>(_sdamConfig); } +StreamableReplicaSetMonitor::~StreamableReplicaSetMonitor() { + // `drop` is idempotent and a duplicate call from ReplicaSetMonitorManager::removeMonitor() is + // safe. + drop(); +} + ReplicaSetMonitorPtr StreamableReplicaSetMonitor::make( const MongoURI& uri, std::shared_ptr<TaskExecutor> executor, diff --git a/src/mongo/client/streamable_replica_set_monitor.h b/src/mongo/client/streamable_replica_set_monitor.h index cace2c7c051..fab0bc591fa 100644 --- a/src/mongo/client/streamable_replica_set_monitor.h +++ b/src/mongo/client/streamable_replica_set_monitor.h @@ -81,9 +81,11 @@ public: std::shared_ptr<executor::TaskExecutor> executor, std::shared_ptr<executor::EgressTagCloser> connectionManager); - void init(); + ~StreamableReplicaSetMonitor() override; - void drop(); + void init() override; + + void drop() override; static ReplicaSetMonitorPtr make(const MongoURI& uri, std::shared_ptr<executor::TaskExecutor> executor, |