summaryrefslogtreecommitdiff
path: root/src/mongo/executor/thread_pool_task_executor.cpp
diff options
context:
space:
mode:
authorJason Carey <jcarey@argv.me>2019-05-13 18:24:36 -0400
committerJason Carey <jcarey@argv.me>2019-06-06 09:00:28 -0400
commitefa1ae064b9206f82136a8d14cbb86d47e8754b1 (patch)
treec4666fa197f837b5a0feaa8f980299a8eed7146a /src/mongo/executor/thread_pool_task_executor.cpp
parentb1ff28c63836aa13112cf3499574160a5950c6ec (diff)
downloadmongo-efa1ae064b9206f82136a8d14cbb86d47e8754b1.tar.gz
SERVER-41133 Add TE::scheduleRemoteCommandOnAny
Add support for a mode for the task executor where rather than targetting a single host, we target any of a set of hosts. This should behave identically to scheduleRemoteCommand, except that we concurrently get() connections from the connection pool for each host, preferring the first which is available
Diffstat (limited to 'src/mongo/executor/thread_pool_task_executor.cpp')
-rw-r--r--src/mongo/executor/thread_pool_task_executor.cpp25
1 files changed, 12 insertions, 13 deletions
diff --git a/src/mongo/executor/thread_pool_task_executor.cpp b/src/mongo/executor/thread_pool_task_executor.cpp
index 73fca1533d9..7ef0669aea0 100644
--- a/src/mongo/executor/thread_pool_task_executor.cpp
+++ b/src/mongo/executor/thread_pool_task_executor.cpp
@@ -391,10 +391,10 @@ using ResponseStatus = TaskExecutor::ResponseStatus;
// which expects a RemoteCommandResponse as part of RemoteCommandCallbackArgs,
// can be run despite a RemoteCommandResponse never having been created.
void remoteCommandFinished(const TaskExecutor::CallbackArgs& cbData,
- const TaskExecutor::RemoteCommandCallbackFn& cb,
- const RemoteCommandRequest& request,
- const ResponseStatus& rs) {
- cb(TaskExecutor::RemoteCommandCallbackArgs(cbData.executor, cbData.myHandle, request, rs));
+ const TaskExecutor::RemoteCommandOnAnyCallbackFn& cb,
+ const RemoteCommandRequestOnAny& request,
+ const TaskExecutor::ResponseOnAnyStatus& rs) {
+ cb({cbData.executor, cbData.myHandle, request, rs});
}
// If the request failed to receive a connection from the pool,
@@ -402,11 +402,10 @@ void remoteCommandFinished(const TaskExecutor::CallbackArgs& cbData,
// which expects a RemoteCommandResponse as part of RemoteCommandCallbackArgs,
// can be run despite a RemoteCommandResponse never having been created.
void remoteCommandFailedEarly(const TaskExecutor::CallbackArgs& cbData,
- const TaskExecutor::RemoteCommandCallbackFn& cb,
- const RemoteCommandRequest& request) {
+ const TaskExecutor::RemoteCommandOnAnyCallbackFn& cb,
+ const RemoteCommandRequestOnAny& request) {
invariant(!cbData.status.isOK());
- cb(TaskExecutor::RemoteCommandCallbackArgs(
- cbData.executor, cbData.myHandle, request, {cbData.status}));
+ cb({cbData.executor, cbData.myHandle, request, {boost::none, cbData.status}});
}
// The command names that the initial sync test fixture pauses on during the collection cloning
@@ -416,9 +415,9 @@ const auto initialSyncPauseCmds =
} // namespace
-StatusWith<TaskExecutor::CallbackHandle> ThreadPoolTaskExecutor::scheduleRemoteCommand(
- const RemoteCommandRequest& request,
- const RemoteCommandCallbackFn& cb,
+StatusWith<TaskExecutor::CallbackHandle> ThreadPoolTaskExecutor::scheduleRemoteCommandOnAny(
+ const RemoteCommandRequestOnAny& request,
+ const RemoteCommandOnAnyCallbackFn& cb,
const BatonHandle& baton) {
if (MONGO_FAIL_POINT(initialSyncFuzzerSynchronizationPoint1)) {
@@ -441,7 +440,7 @@ StatusWith<TaskExecutor::CallbackHandle> ThreadPoolTaskExecutor::scheduleRemoteC
}
}
- RemoteCommandRequest scheduledRequest = request;
+ RemoteCommandRequestOnAny scheduledRequest = request;
if (request.timeout == RemoteCommandRequest::kNoTimeout) {
scheduledRequest.expirationDate = RemoteCommandRequest::kNoExpirationDate;
} else {
@@ -467,7 +466,7 @@ StatusWith<TaskExecutor::CallbackHandle> ThreadPoolTaskExecutor::scheduleRemoteC
auto commandStatus = _net->startCommand(
swCbHandle.getValue(),
scheduledRequest,
- [this, scheduledRequest, cbState, cb](const ResponseStatus& response) {
+ [this, scheduledRequest, cbState, cb](const ResponseOnAnyStatus& response) {
using std::swap;
CallbackFn newCb = [cb, scheduledRequest, response](const CallbackArgs& cbData) {
remoteCommandFinished(cbData, cb, scheduledRequest, response);