diff options
Diffstat (limited to 'src/mongo/db/repl/check_quorum_for_config_change.h')
-rw-r--r-- | src/mongo/db/repl/check_quorum_for_config_change.h | 200 |
1 files changed, 101 insertions, 99 deletions
diff --git a/src/mongo/db/repl/check_quorum_for_config_change.h b/src/mongo/db/repl/check_quorum_for_config_change.h index c38a49106be..5d33c01f4c1 100644 --- a/src/mongo/db/repl/check_quorum_for_config_change.h +++ b/src/mongo/db/repl/check_quorum_for_config_change.h @@ -35,116 +35,118 @@ namespace mongo { namespace repl { - class ReplicaSetConfig; +class ReplicaSetConfig; +/** + * Quorum checking state machine. + * + * Usage: Construct a QuorumChecker, pass in a pointer to the configuration for which you're + * checking quorum, and the integer index of the member config representing the "executing" + * node. Use ScatterGatherRunner or otherwise execute a scatter-gather procedure as described + * in the class comment for the ScatterGatherAlgorithm class. After + * hasReceivedSufficientResponses() returns true, you may call getFinalStatus() to get the + * result of the quorum check. + */ +class QuorumChecker : public ScatterGatherAlgorithm { + MONGO_DISALLOW_COPYING(QuorumChecker); + +public: /** - * Quorum checking state machine. + * Constructs a QuorumChecker that is used to confirm that sufficient nodes are up to accept + * "rsConfig". "myIndex" is the index of the local node, which is assumed to be up. * - * Usage: Construct a QuorumChecker, pass in a pointer to the configuration for which you're - * checking quorum, and the integer index of the member config representing the "executing" - * node. Use ScatterGatherRunner or otherwise execute a scatter-gather procedure as described - * in the class comment for the ScatterGatherAlgorithm class. After - * hasReceivedSufficientResponses() returns true, you may call getFinalStatus() to get the - * result of the quorum check. + * "rsConfig" must stay in scope until QuorumChecker's destructor completes. */ - class QuorumChecker : public ScatterGatherAlgorithm { - MONGO_DISALLOW_COPYING(QuorumChecker); - public: - /** - * Constructs a QuorumChecker that is used to confirm that sufficient nodes are up to accept - * "rsConfig". "myIndex" is the index of the local node, which is assumed to be up. - * - * "rsConfig" must stay in scope until QuorumChecker's destructor completes. - */ - QuorumChecker(const ReplicaSetConfig* rsConfig, int myIndex); - virtual ~QuorumChecker(); - - virtual std::vector<RemoteCommandRequest> getRequests() const; - virtual void processResponse( - const RemoteCommandRequest& request, - const ResponseStatus& response); - - virtual bool hasReceivedSufficientResponses() const; - - Status getFinalStatus() const { return _finalStatus; } - - private: - /** - * Callback that executes after _haveReceivedSufficientReplies() becomes true. - * - * Computes the quorum result based on responses received so far, stores it into - * _finalStatus, and enables QuorumChecker::run() to return. - */ - void _onQuorumCheckComplete(); - - /** - * Updates the QuorumChecker state based on the data from a single heartbeat response. - */ - void _tabulateHeartbeatResponse(const RemoteCommandRequest& request, - const ResponseStatus& response); - - // Pointer to the replica set configuration for which we're checking quorum. - const ReplicaSetConfig* const _rsConfig; - - // Index of the local node's member configuration in _rsConfig. - const int _myIndex; - - // List of voting nodes that have responded affirmatively. - std::vector<HostAndPort> _voters; - - // List of nodes with bad responses and the bad response status they returned. - std::vector<std::pair<HostAndPort, Status> > _badResponses; - - // Total number of responses and timeouts processed. - int _numResponses; - - // Number of electable nodes that have responded affirmatively. - int _numElectable; - - // Set to a non-OK status if a response from a remote node indicates - // that the quorum check should definitely fail, such as because of - // a replica set name mismatch. - Status _vetoStatus; - - // Final status of the quorum check, returned by run(). - Status _finalStatus; - }; + QuorumChecker(const ReplicaSetConfig* rsConfig, int myIndex); + virtual ~QuorumChecker(); + + virtual std::vector<RemoteCommandRequest> getRequests() const; + virtual void processResponse(const RemoteCommandRequest& request, + const ResponseStatus& response); + + virtual bool hasReceivedSufficientResponses() const; + + Status getFinalStatus() const { + return _finalStatus; + } +private: /** - * Performs a quorum call to determine if a sufficient number of nodes are up - * to initiate a replica set with configuration "rsConfig". + * Callback that executes after _haveReceivedSufficientReplies() becomes true. * - * "myIndex" is the index of this node's member configuration in "rsConfig". - * "executor" is the event loop in which to schedule network/aysnchronous processing. - * - * For purposes of initiate, a quorum is only met if all of the following conditions - * are met: - * - All nodes respond. - * - No nodes other than the node running the quorum check have data. - * - No nodes are already joined to a replica set. - * - No node reports a replica set name other than the one in "rsConfig". + * Computes the quorum result based on responses received so far, stores it into + * _finalStatus, and enables QuorumChecker::run() to return. */ - Status checkQuorumForInitiate(ReplicationExecutor* executor, - const ReplicaSetConfig& rsConfig, - const int myIndex); + void _onQuorumCheckComplete(); /** - * Performs a quorum call to determine if a sufficient number of nodes are up - * to replace the current replica set configuration with "rsConfig". - * - * "myIndex" is the index of this node's member configuration in "rsConfig". - * "executor" is the event loop in which to schedule network/aysnchronous processing. - * - * For purposes of reconfig, a quorum is only met if all of the following conditions - * are met: - * - A majority of voting nodes respond. - * - At least one electable node responds. - * - No responding node reports a replica set name other than the one in "rsConfig". - * - All responding nodes report a config version less than the one in "rsConfig". + * Updates the QuorumChecker state based on the data from a single heartbeat response. */ - Status checkQuorumForReconfig(ReplicationExecutor* executor, - const ReplicaSetConfig& rsConfig, - const int myIndex); + void _tabulateHeartbeatResponse(const RemoteCommandRequest& request, + const ResponseStatus& response); + + // Pointer to the replica set configuration for which we're checking quorum. + const ReplicaSetConfig* const _rsConfig; + + // Index of the local node's member configuration in _rsConfig. + const int _myIndex; + + // List of voting nodes that have responded affirmatively. + std::vector<HostAndPort> _voters; + + // List of nodes with bad responses and the bad response status they returned. + std::vector<std::pair<HostAndPort, Status>> _badResponses; + + // Total number of responses and timeouts processed. + int _numResponses; + + // Number of electable nodes that have responded affirmatively. + int _numElectable; + + // Set to a non-OK status if a response from a remote node indicates + // that the quorum check should definitely fail, such as because of + // a replica set name mismatch. + Status _vetoStatus; + + // Final status of the quorum check, returned by run(). + Status _finalStatus; +}; + +/** + * Performs a quorum call to determine if a sufficient number of nodes are up + * to initiate a replica set with configuration "rsConfig". + * + * "myIndex" is the index of this node's member configuration in "rsConfig". + * "executor" is the event loop in which to schedule network/aysnchronous processing. + * + * For purposes of initiate, a quorum is only met if all of the following conditions + * are met: + * - All nodes respond. + * - No nodes other than the node running the quorum check have data. + * - No nodes are already joined to a replica set. + * - No node reports a replica set name other than the one in "rsConfig". + */ +Status checkQuorumForInitiate(ReplicationExecutor* executor, + const ReplicaSetConfig& rsConfig, + const int myIndex); + +/** + * Performs a quorum call to determine if a sufficient number of nodes are up + * to replace the current replica set configuration with "rsConfig". + * + * "myIndex" is the index of this node's member configuration in "rsConfig". + * "executor" is the event loop in which to schedule network/aysnchronous processing. + * + * For purposes of reconfig, a quorum is only met if all of the following conditions + * are met: + * - A majority of voting nodes respond. + * - At least one electable node responds. + * - No responding node reports a replica set name other than the one in "rsConfig". + * - All responding nodes report a config version less than the one in "rsConfig". + */ +Status checkQuorumForReconfig(ReplicationExecutor* executor, + const ReplicaSetConfig& rsConfig, + const int myIndex); } // namespace repl } // namespace mongo |