diff options
Diffstat (limited to 'src/mongo/db/repl/scatter_gather_runner.h')
-rw-r--r-- | src/mongo/db/repl/scatter_gather_runner.h | 154 |
1 files changed, 78 insertions, 76 deletions
diff --git a/src/mongo/db/repl/scatter_gather_runner.h b/src/mongo/db/repl/scatter_gather_runner.h index 089fa178dde..ad7b8d93aa5 100644 --- a/src/mongo/db/repl/scatter_gather_runner.h +++ b/src/mongo/db/repl/scatter_gather_runner.h @@ -36,88 +36,90 @@ namespace mongo { - template <typename T> class StatusWith; +template <typename T> +class StatusWith; namespace repl { - class ScatterGatherAlgorithm; +class ScatterGatherAlgorithm; + +/** + * Implementation of a scatter-gather behavior using a ReplicationExecutor. + */ +class ScatterGatherRunner { + MONGO_DISALLOW_COPYING(ScatterGatherRunner); + +public: + /** + * Constructs a new runner whose underlying algorithm is "algorithm". + * + * "algorithm" must remain in scope until the runner's destructor completes. + */ + explicit ScatterGatherRunner(ScatterGatherAlgorithm* algorithm); + + ~ScatterGatherRunner(); + + /** + * Runs the scatter-gather process using "executor", and blocks until it completes. + * + * Must _not_ be run from inside the executor context. + * + * Returns ErrorCodes::ShutdownInProgress if the executor enters or is already in + * the shutdown state before run() can schedule execution of the scatter-gather + * in the executor. Note that if the executor is shut down after the algorithm + * is scheduled but before it completes, this method will return Status::OK(), + * just as it does when it runs successfully to completion. + */ + Status run(ReplicationExecutor* executor); + + /** + * Starts executing the scatter-gather process using "executor". + * + * On success, returns an event handle that will be signaled when the runner has + * finished executing the scatter-gather process. After that event has been + * signaled, it is safe for the caller to examine any state on "algorithm". + * + * This method must be called inside the executor context. + * + * onCompletion is an optional callback that will be executed in executor context + * immediately prior to signaling the event handle returned here. It must never + * throw exceptions. It may examine the state of the algorithm object. + * + * NOTE: If the executor starts to shut down before onCompletion executes, onCompletion may + * never execute, even though the returned event will eventually be signaled. + */ + StatusWith<ReplicationExecutor::EventHandle> start( + ReplicationExecutor* executor, + const stdx::function<void()>& onCompletion = stdx::function<void()>()); + + /** + * Informs the runner to cancel further processing. The "executor" argument + * must point to the same executor passed to "start()". + * + * Like start, this method must be called from within the executor context. + */ + void cancel(ReplicationExecutor* executor); + +private: + /** + * Callback invoked once for every response from the network. + */ + static void _processResponse(const ReplicationExecutor::RemoteCommandCallbackArgs& cbData, + ScatterGatherRunner* runner); /** - * Implementation of a scatter-gather behavior using a ReplicationExecutor. + * Method that performs all actions required when _algorithm indicates a sufficient + * number of respones have been received. */ - class ScatterGatherRunner { - MONGO_DISALLOW_COPYING(ScatterGatherRunner); - public: - /** - * Constructs a new runner whose underlying algorithm is "algorithm". - * - * "algorithm" must remain in scope until the runner's destructor completes. - */ - explicit ScatterGatherRunner(ScatterGatherAlgorithm* algorithm); - - ~ScatterGatherRunner(); - - /** - * Runs the scatter-gather process using "executor", and blocks until it completes. - * - * Must _not_ be run from inside the executor context. - * - * Returns ErrorCodes::ShutdownInProgress if the executor enters or is already in - * the shutdown state before run() can schedule execution of the scatter-gather - * in the executor. Note that if the executor is shut down after the algorithm - * is scheduled but before it completes, this method will return Status::OK(), - * just as it does when it runs successfully to completion. - */ - Status run(ReplicationExecutor* executor); - - /** - * Starts executing the scatter-gather process using "executor". - * - * On success, returns an event handle that will be signaled when the runner has - * finished executing the scatter-gather process. After that event has been - * signaled, it is safe for the caller to examine any state on "algorithm". - * - * This method must be called inside the executor context. - * - * onCompletion is an optional callback that will be executed in executor context - * immediately prior to signaling the event handle returned here. It must never - * throw exceptions. It may examine the state of the algorithm object. - * - * NOTE: If the executor starts to shut down before onCompletion executes, onCompletion may - * never execute, even though the returned event will eventually be signaled. - */ - StatusWith<ReplicationExecutor::EventHandle> start( - ReplicationExecutor* executor, - const stdx::function<void ()>& onCompletion = stdx::function<void ()>()); - - /** - * Informs the runner to cancel further processing. The "executor" argument - * must point to the same executor passed to "start()". - * - * Like start, this method must be called from within the executor context. - */ - void cancel(ReplicationExecutor* executor); - - private: - /** - * Callback invoked once for every response from the network. - */ - static void _processResponse(const ReplicationExecutor::RemoteCommandCallbackArgs& cbData, - ScatterGatherRunner* runner); - - /** - * Method that performs all actions required when _algorithm indicates a sufficient - * number of respones have been received. - */ - void _signalSufficientResponsesReceived(ReplicationExecutor* executor); - - ScatterGatherAlgorithm* _algorithm; - stdx::function<void ()> _onCompletion; - ReplicationExecutor::EventHandle _sufficientResponsesReceived; - std::vector<ReplicationExecutor::CallbackHandle> _callbacks; - size_t _actualResponses; - bool _started; - }; + void _signalSufficientResponsesReceived(ReplicationExecutor* executor); + + ScatterGatherAlgorithm* _algorithm; + stdx::function<void()> _onCompletion; + ReplicationExecutor::EventHandle _sufficientResponsesReceived; + std::vector<ReplicationExecutor::CallbackHandle> _callbacks; + size_t _actualResponses; + bool _started; +}; } // namespace repl } // namespace mongo |