summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSpencer T Brody <spencer@mongodb.com>2014-09-24 18:43:15 -0400
committerSpencer T Brody <spencer@mongodb.com>2014-09-25 17:07:38 -0400
commit5da5d98e114e4a024be242b0baea4115bea9e56c (patch)
tree5e7d432a7045b7fc00c2f4b804202a0c25f3b407
parent60d379f9e0c3eaf85850e768328d94c49170a7d7 (diff)
downloadmongo-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.cpp22
-rw-r--r--src/mongo/db/repl/repl_coordinator_impl.h31
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);
/**