diff options
author | Jason Carey <jcarey@argv.me> | 2019-05-13 18:24:36 -0400 |
---|---|---|
committer | Jason Carey <jcarey@argv.me> | 2019-06-06 09:00:28 -0400 |
commit | efa1ae064b9206f82136a8d14cbb86d47e8754b1 (patch) | |
tree | c4666fa197f837b5a0feaa8f980299a8eed7146a /src/mongo/executor/thread_pool_task_executor.cpp | |
parent | b1ff28c63836aa13112cf3499574160a5950c6ec (diff) | |
download | mongo-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.cpp | 25 |
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); |