diff options
Diffstat (limited to 'src/mongo/executor/network_interface_impl.h')
-rw-r--r-- | src/mongo/executor/network_interface_impl.h | 230 |
1 files changed, 114 insertions, 116 deletions
diff --git a/src/mongo/executor/network_interface_impl.h b/src/mongo/executor/network_interface_impl.h index 3744bf808b9..6e29d09263f 100644 --- a/src/mongo/executor/network_interface_impl.h +++ b/src/mongo/executor/network_interface_impl.h @@ -41,123 +41,121 @@ namespace mongo { namespace executor { +/** + * Implementation of the network interface for use by classes implementing TaskExecutor + * inside mongod. + * + * This implementation manages a dynamically sized group of worker threads for performing + * network operations. The minimum and maximum number of threads is set at compile time, and + * the exact number of threads is adjusted dynamically, using the following two rules. + * + * 1.) If the number of worker threads is less than the maximum, there are no idle worker + * threads, and the client enqueues a new network operation via startCommand(), the network + * interface spins up a new worker thread. This decision is made on the assumption that + * spinning up a new thread is faster than the round-trip time for processing a remote command, + * and so this will minimize wait time. + * + * 2.) If the number of worker threads has exceeded the the peak number of scheduled outstanding + * network commands continuously for a period of time (kMaxIdleThreadAge), one thread is retired + * from the pool and the monitoring of idle threads is reset. This means that at most one + * thread retires every kMaxIdleThreadAge units of time. The value of kMaxIdleThreadAge is set + * to be much larger than the expected frequency of new requests, averaging out short-duration + * periods of idleness, as occur between heartbeats. + * + * The implementation also manages a pool of network connections to recently contacted remote + * nodes. The size of this pool is not bounded, but connections are retired unconditionally + * after they have been connected for a certain maximum period. + * TODO(spencer): Rename this to ThreadPoolNetworkInterface + */ +class NetworkInterfaceImpl : public NetworkInterface { +public: + NetworkInterfaceImpl(); + virtual ~NetworkInterfaceImpl(); + virtual std::string getDiagnosticString(); + virtual void startup(); + virtual void shutdown(); + virtual void waitForWork(); + virtual void waitForWorkUntil(Date_t when); + virtual void signalWorkAvailable(); + virtual Date_t now(); + virtual void startCommand(const TaskExecutor::CallbackHandle& cbHandle, + const RemoteCommandRequest& request, + const RemoteCommandCompletionFn& onFinish); + virtual void cancelCommand(const TaskExecutor::CallbackHandle& cbHandle); + +private: /** - * Implementation of the network interface for use by classes implementing TaskExecutor - * inside mongod. - * - * This implementation manages a dynamically sized group of worker threads for performing - * network operations. The minimum and maximum number of threads is set at compile time, and - * the exact number of threads is adjusted dynamically, using the following two rules. - * - * 1.) If the number of worker threads is less than the maximum, there are no idle worker - * threads, and the client enqueues a new network operation via startCommand(), the network - * interface spins up a new worker thread. This decision is made on the assumption that - * spinning up a new thread is faster than the round-trip time for processing a remote command, - * and so this will minimize wait time. - * - * 2.) If the number of worker threads has exceeded the the peak number of scheduled outstanding - * network commands continuously for a period of time (kMaxIdleThreadAge), one thread is retired - * from the pool and the monitoring of idle threads is reset. This means that at most one - * thread retires every kMaxIdleThreadAge units of time. The value of kMaxIdleThreadAge is set - * to be much larger than the expected frequency of new requests, averaging out short-duration - * periods of idleness, as occur between heartbeats. - * - * The implementation also manages a pool of network connections to recently contacted remote - * nodes. The size of this pool is not bounded, but connections are retired unconditionally - * after they have been connected for a certain maximum period. - * TODO(spencer): Rename this to ThreadPoolNetworkInterface + * Information describing an in-flight command. */ - class NetworkInterfaceImpl : public NetworkInterface { - public: - NetworkInterfaceImpl(); - virtual ~NetworkInterfaceImpl(); - virtual std::string getDiagnosticString(); - virtual void startup(); - virtual void shutdown(); - virtual void waitForWork(); - virtual void waitForWorkUntil(Date_t when); - virtual void signalWorkAvailable(); - virtual Date_t now(); - virtual void startCommand( - const TaskExecutor::CallbackHandle& cbHandle, - const RemoteCommandRequest& request, - const RemoteCommandCompletionFn& onFinish); - virtual void cancelCommand(const TaskExecutor::CallbackHandle& cbHandle); - - private: - - /** - * Information describing an in-flight command. - */ - struct CommandData { - TaskExecutor::CallbackHandle cbHandle; - RemoteCommandRequest request; - RemoteCommandCompletionFn onFinish; - }; - typedef stdx::list<CommandData> CommandDataList; - typedef std::vector<std::shared_ptr<stdx::thread> > ThreadList; - - /** - * Thread body for threads that synchronously perform network requests from - * the _pending list. - */ - static void _requestProcessorThreadBody(NetworkInterfaceImpl* net, - const std::string& threadName); - - /** - * Run loop that iteratively consumes network requests in a request processor thread. - */ - void _consumeNetworkRequests(); - - /** - * Notifies the network threads that there is work available. - */ - void _signalWorkAvailable_inlock(); - - /** - * Starts a new network thread. - */ - void _startNewNetworkThread_inlock(); - - // Mutex guarding the state of this network interface, except for the remote command - // executor, which has its own concurrency control. - stdx::mutex _mutex; - - // Condition signaled to indicate that there is work in the _pending queue. - stdx::condition_variable _hasPending; - - // Queue of yet-to-be-executed network operations. - CommandDataList _pending; - - // List of threads serving as the worker pool. - ThreadList _threads; - - // Count of idle threads. - size_t _numIdleThreads; - - // Id counter for assigning thread names - size_t _nextThreadId; - - // The last time that _pending.size() + _numActiveNetworkRequests grew to be at least - // _threads.size(). - Date_t _lastFullUtilizationDate; - - // Condition signaled to indicate that the executor, blocked in waitForWorkUntil or - // waitForWork, should wake up. - stdx::condition_variable _isExecutorRunnableCondition; - - // Flag indicating whether or not the executor associated with this interface is runnable. - bool _isExecutorRunnable; - - // Flag indicating when this interface is being shut down (because shutdown() has executed). - bool _inShutdown; - - // Interface for running remote commands - RemoteCommandRunnerImpl _commandRunner; - - // Number of active network requests - size_t _numActiveNetworkRequests; + struct CommandData { + TaskExecutor::CallbackHandle cbHandle; + RemoteCommandRequest request; + RemoteCommandCompletionFn onFinish; }; + typedef stdx::list<CommandData> CommandDataList; + typedef std::vector<std::shared_ptr<stdx::thread>> ThreadList; + + /** + * Thread body for threads that synchronously perform network requests from + * the _pending list. + */ + static void _requestProcessorThreadBody(NetworkInterfaceImpl* net, + const std::string& threadName); + + /** + * Run loop that iteratively consumes network requests in a request processor thread. + */ + void _consumeNetworkRequests(); + + /** + * Notifies the network threads that there is work available. + */ + void _signalWorkAvailable_inlock(); + + /** + * Starts a new network thread. + */ + void _startNewNetworkThread_inlock(); + + // Mutex guarding the state of this network interface, except for the remote command + // executor, which has its own concurrency control. + stdx::mutex _mutex; + + // Condition signaled to indicate that there is work in the _pending queue. + stdx::condition_variable _hasPending; + + // Queue of yet-to-be-executed network operations. + CommandDataList _pending; + + // List of threads serving as the worker pool. + ThreadList _threads; + + // Count of idle threads. + size_t _numIdleThreads; + + // Id counter for assigning thread names + size_t _nextThreadId; + + // The last time that _pending.size() + _numActiveNetworkRequests grew to be at least + // _threads.size(). + Date_t _lastFullUtilizationDate; + + // Condition signaled to indicate that the executor, blocked in waitForWorkUntil or + // waitForWork, should wake up. + stdx::condition_variable _isExecutorRunnableCondition; + + // Flag indicating whether or not the executor associated with this interface is runnable. + bool _isExecutorRunnable; + + // Flag indicating when this interface is being shut down (because shutdown() has executed). + bool _inShutdown; + + // Interface for running remote commands + RemoteCommandRunnerImpl _commandRunner; + + // Number of active network requests + size_t _numActiveNetworkRequests; +}; -} // namespace executor -} // namespace mongo +} // namespace executor +} // namespace mongo |