summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Shuvalov <andrew.shuvalov@mongodb.com>2020-11-24 16:09:04 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-11-24 22:24:17 +0000
commitc50282b539308d1578465fa0819e228a47d3421e (patch)
tree79e122ba3d3ecd4b025608ac666c0e97f646d6a0
parent091d7cbe42c8a635e1950e597aac68f1feed88c1 (diff)
downloadmongo-c50282b539308d1578465fa0819e228a47d3421e.tar.gz
SERVER-50467: StreamableReplicaSetMonitor should call drop on itself from destructor
-rw-r--r--src/mongo/client/replica_set_monitor.h2
-rw-r--r--src/mongo/client/scanning_replica_set_monitor.cpp3
-rw-r--r--src/mongo/client/scanning_replica_set_monitor.h2
-rw-r--r--src/mongo/client/server_ping_monitor.cpp4
-rw-r--r--src/mongo/client/streamable_replica_set_monitor.cpp6
-rw-r--r--src/mongo/client/streamable_replica_set_monitor.h6
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,