diff options
author | Adam Midvidy <amidvidy@gmail.com> | 2015-10-02 17:16:45 -0400 |
---|---|---|
committer | Adam Midvidy <amidvidy@gmail.com> | 2015-10-02 17:50:12 -0400 |
commit | 375f918358956a11b977b3fb7dc60079ce8f0218 (patch) | |
tree | 8fda2777d6a523d710243533fbcc76e9b2522ab4 | |
parent | b8cc9df055c727e4afbb730d61e73420954db85a (diff) | |
download | mongo-375f918358956a11b977b3fb7dc60079ce8f0218.tar.gz |
SERVER-20689 onFinish should be set when ConnectionPool refreshes a connection
-rw-r--r-- | src/mongo/executor/connection_pool_asio.cpp | 8 | ||||
-rw-r--r-- | src/mongo/executor/network_interface_asio.cpp | 1 | ||||
-rw-r--r-- | src/mongo/executor/network_interface_asio.h | 2 | ||||
-rw-r--r-- | src/mongo/executor/network_interface_asio_operation.cpp | 4 |
4 files changed, 15 insertions, 0 deletions
diff --git a/src/mongo/executor/connection_pool_asio.cpp b/src/mongo/executor/connection_pool_asio.cpp index 180a85d7f69..89d418c0a43 100644 --- a/src/mongo/executor/connection_pool_asio.cpp +++ b/src/mongo/executor/connection_pool_asio.cpp @@ -185,6 +185,14 @@ void ASIOConnection::refresh(Milliseconds timeout, RefreshCallback cb) { return; } + // If we fail during refresh, the _onFinish function of the AsyncOp will get called. As such we + // need to intercept those calls so we can capture them. This will get cleared out when we fill + // in the real onFinish in startCommand. + op->setOnFinish([this, cb](StatusWith<RemoteCommandResponse> failedResponse) { + invariant(!failedResponse.isOK()); + cb(this, failedResponse.getStatus()); + }); + _global->_impl->_asyncRunCommand( op, [this, op](std::error_code ec, size_t bytes) { diff --git a/src/mongo/executor/network_interface_asio.cpp b/src/mongo/executor/network_interface_asio.cpp index 3de99bfaf1c..fe999ef8ff0 100644 --- a/src/mongo/executor/network_interface_asio.cpp +++ b/src/mongo/executor/network_interface_asio.cpp @@ -154,6 +154,7 @@ Date_t NetworkInterfaceASIO::now() { void NetworkInterfaceASIO::startCommand(const TaskExecutor::CallbackHandle& cbHandle, const RemoteCommandRequest& request, const RemoteCommandCompletionFn& onFinish) { + invariant(onFinish); { stdx::lock_guard<stdx::mutex> lk(_inProgressMutex); const auto insertResult = _inGetConnection.emplace(cbHandle); diff --git a/src/mongo/executor/network_interface_asio.h b/src/mongo/executor/network_interface_asio.h index 864e5402052..2c44039b48c 100644 --- a/src/mongo/executor/network_interface_asio.h +++ b/src/mongo/executor/network_interface_asio.h @@ -275,6 +275,8 @@ private: void reset(); + void setOnFinish(RemoteCommandCompletionFn&& onFinish); + private: NetworkInterfaceASIO* const _owner; // Information describing a task enqueued on the NetworkInterface diff --git a/src/mongo/executor/network_interface_asio_operation.cpp b/src/mongo/executor/network_interface_asio_operation.cpp index 6903d784efb..d5ca86d8cc8 100644 --- a/src/mongo/executor/network_interface_asio_operation.cpp +++ b/src/mongo/executor/network_interface_asio_operation.cpp @@ -242,5 +242,9 @@ void NetworkInterfaceASIO::AsyncOp::reset() { // _inSetup should always be false at this point. } +void NetworkInterfaceASIO::AsyncOp::setOnFinish(RemoteCommandCompletionFn&& onFinish) { + _onFinish = std::move(onFinish); +} + } // namespace executor } // namespace mongo |