diff options
author | Spencer T Brody <spencer@mongodb.com> | 2014-09-24 18:43:15 -0400 |
---|---|---|
committer | Spencer T Brody <spencer@mongodb.com> | 2014-09-25 17:07:38 -0400 |
commit | 5da5d98e114e4a024be242b0baea4115bea9e56c (patch) | |
tree | 5e7d432a7045b7fc00c2f4b804202a0c25f3b407 | |
parent | 60d379f9e0c3eaf85850e768328d94c49170a7d7 (diff) | |
download | mongo-5da5d98e114e4a024be242b0baea4115bea9e56c.tar.gz |
SERVER-15381 Allow shutdown() to be called on the ReplicationCoordinator before startReplication()
-rw-r--r-- | src/mongo/db/repl/repl_coordinator_impl.cpp | 22 | ||||
-rw-r--r-- | src/mongo/db/repl/repl_coordinator_impl.h | 31 |
2 files changed, 32 insertions, 21 deletions
diff --git a/src/mongo/db/repl/repl_coordinator_impl.cpp b/src/mongo/db/repl/repl_coordinator_impl.cpp index f39702f7002..77be9c92a2c 100644 --- a/src/mongo/db/repl/repl_coordinator_impl.cpp +++ b/src/mongo/db/repl/repl_coordinator_impl.cpp @@ -117,7 +117,7 @@ namespace { _inShutdown(false), _currentState(MemberState::RS_STARTUP), _isWaitingForDrainToComplete(false), - _rsConfigState(kConfigStartingUp), + _rsConfigState(kConfigPreStart), _thisMembersConfigIndex(-1), _sleptLastElection(false) { @@ -134,7 +134,7 @@ namespace { void ReplicationCoordinatorImpl::waitForStartUpComplete() { boost::unique_lock<boost::mutex> lk(_mutex); - while (_rsConfigState == kConfigStartingUp) { + while (_rsConfigState == kConfigPreStart || _rsConfigState == kConfigStartingUp) { _rsConfigStateChange.wait(lk); } } @@ -193,7 +193,7 @@ namespace { LOG(1) << "Loading local replica set configuration failed due to " << cbData.status; return; } - _finishLoadLocalConfig_helper(cbData, localConfig, lastOpTime); + _finishLoadLocalConfig_helper(localConfig, lastOpTime); // Make sure that no matter how _finishLoadLocalConfig_helper terminates (short of // throwing an exception, which it shouldn't do and would cause the process to terminate), @@ -210,7 +210,6 @@ namespace { } void ReplicationCoordinatorImpl::_finishLoadLocalConfig_helper( - const ReplicationExecutor::CallbackData& cbData, const ReplicaSetConfig& localConfig, OpTime lastOpTime) { @@ -239,6 +238,8 @@ namespace { { boost::lock_guard<boost::mutex> lk(_mutex); + fassert(18822, !_inShutdown); + _setConfigState_inlock(kConfigStartingUp); _myRID = _externalState->ensureMe(txn); } @@ -273,6 +274,13 @@ namespace { { boost::lock_guard<boost::mutex> lk(_mutex); _inShutdown = true; + if (_rsConfigState == kConfigPreStart) { + warning() << "ReplicationCoordinatorImpl::shutdown() called before " + "startReplication() finished. Shutting down without cleaning up the " + "replication system"; + return; + } + fassert(18823, _rsConfigState != kConfigStartingUp); for (std::vector<WaiterInfo*>::iterator it = _replicationWaiterList.begin(); it != _replicationWaiterList.end(); ++it) { WaiterInfo* waiter = *it; @@ -1082,7 +1090,7 @@ namespace { ReplSetHeartbeatResponse* response) { { boost::lock_guard<boost::mutex> lock(_mutex); - if (_rsConfigState == kConfigStartingUp) { + if (_rsConfigState == kConfigPreStart || _rsConfigState == kConfigStartingUp) { return Status(ErrorCodes::NotYetInitialized, "Received heartbeat while still initializing replication system"); } @@ -1126,7 +1134,7 @@ namespace { "server is not running with --replSet"); } - while (_rsConfigState == kConfigStartingUp) { + while (_rsConfigState == kConfigPreStart || _rsConfigState == kConfigStartingUp) { _rsConfigStateChange.wait(lk); } @@ -1329,7 +1337,7 @@ namespace { // Wait until we're done loading our local config boost::unique_lock<boost::mutex> lock(_mutex); - while (_rsConfigState == kConfigStartingUp) { + while (_rsConfigState == kConfigPreStart || _rsConfigState == kConfigStartingUp) { _rsConfigStateChange.wait(lock); } lock.unlock(); diff --git a/src/mongo/db/repl/repl_coordinator_impl.h b/src/mongo/db/repl/repl_coordinator_impl.h index c92c82f103c..870c79ebbba 100644 --- a/src/mongo/db/repl/repl_coordinator_impl.h +++ b/src/mongo/db/repl/repl_coordinator_impl.h @@ -273,20 +273,24 @@ namespace repl { * * Transition diagram: * - * ReplicationDisabled +----------> HBReconfig - * ^ | \ - * | v | - * StartingUp -> Uninitialized <-> Initiating | - * \ / | - * \ __________/ / - * v v / - * Steady <----------------------- - * ^ - * | - * v - * Reconfig + * PreStart ------------------> ReplicationDisabled + * | + * | + * v + * StartingUp -------> Uninitialized <------> Initiating + * \ ^ | + * ------- | | + * | | | + * v v | + * Reconfig <---> Steady <----> HBReconfig | + * ^ / + * | / + * \ / + * ----------------------- + * */ enum ConfigState { + kConfigPreStart, kConfigStartingUp, kConfigReplicationDisabled, kConfigUninitialized, @@ -469,8 +473,7 @@ namespace repl { * Helper method that does most of the work of _finishLoadLocalConfig, minus setting * _isStartupComplete to true. */ - void _finishLoadLocalConfig_helper(const ReplicationExecutor::CallbackData& cbData, - const ReplicaSetConfig& localConfig, + void _finishLoadLocalConfig_helper(const ReplicaSetConfig& localConfig, OpTime lastOpTime); /** |