summaryrefslogtreecommitdiff
path: root/src/mongo
diff options
context:
space:
mode:
authorBen Caimano <ben.caimano@10gen.com>2020-04-13 12:36:17 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-04-23 16:48:40 +0000
commit93551f663ca09e9993a1be92d18396ca1c7bca03 (patch)
tree25f4218e069b02ff4a66b2549d680ada48eadb77 /src/mongo
parent2335687a9331a16b15fe25ac07a2433853b52f97 (diff)
downloadmongo-93551f663ca09e9993a1be92d18396ca1c7bca03.tar.gz
SERVER-47507 Cancel all remaining egress commands on shutdown
Diffstat (limited to 'src/mongo')
-rw-r--r--src/mongo/executor/network_interface_tl.cpp19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/mongo/executor/network_interface_tl.cpp b/src/mongo/executor/network_interface_tl.cpp
index b72eb334920..91289e3e61c 100644
--- a/src/mongo/executor/network_interface_tl.cpp
+++ b/src/mongo/executor/network_interface_tl.cpp
@@ -201,6 +201,25 @@ void NetworkInterfaceTL::shutdown() {
LOGV2_DEBUG(22594, 2, "Shutting down network interface.");
+ // Cancel any remaining commands. Any attempt to register new commands will throw.
+ auto inProgress = [&] {
+ stdx::lock_guard lk(_inProgressMutex);
+ return std::exchange(_inProgress, {});
+ }();
+
+ for (auto& [_, weakCmdState] : inProgress) {
+ auto cmdState = weakCmdState.lock();
+ if (!cmdState) {
+ continue;
+ }
+
+ if (!cmdState->finishLine.arriveStrongly()) {
+ continue;
+ }
+
+ cmdState->fulfillFinalPromise(kNetworkInterfaceShutdownInProgress);
+ }
+
// Stop the reactor/thread first so that nothing runs on a partially dtor'd pool.
_reactor->stop();