summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenety Goh <benety@mongodb.com>2016-11-12 15:29:47 -0500
committerBenety Goh <benety@mongodb.com>2016-11-14 11:20:51 -0500
commitf584ed50bc34db9ad0ac5fb79ecd6e1fe8ff88eb (patch)
treefbd39a56d54fa69cf394a6abef4c3a3ecdd6fdca
parent508aae2223da2390b7b22c9d04d7707af7e131a8 (diff)
downloadmongo-f584ed50bc34db9ad0ac5fb79ecd6e1fe8ff88eb.tar.gz
SERVER-27011 SyncSourceResolver::startup() should return ShutdownInProgress if shutting down
-rw-r--r--src/mongo/db/repl/sync_source_resolver.cpp13
-rw-r--r--src/mongo/db/repl/sync_source_resolver_test.cpp11
2 files changed, 20 insertions, 4 deletions
diff --git a/src/mongo/db/repl/sync_source_resolver.cpp b/src/mongo/db/repl/sync_source_resolver.cpp
index 3d63256b655..dced97cef3a 100644
--- a/src/mongo/db/repl/sync_source_resolver.cpp
+++ b/src/mongo/db/repl/sync_source_resolver.cpp
@@ -94,10 +94,17 @@ bool SyncSourceResolver::_isActive_inlock() const {
Status SyncSourceResolver::startup() {
{
stdx::lock_guard<stdx::mutex> lock(_mutex);
- if (State::kPreStart != _state) {
- return Status(ErrorCodes::IllegalOperation, "sync source resolver already started");
+ switch (_state) {
+ case State::kPreStart:
+ _state = State::kRunning;
+ break;
+ case State::kRunning:
+ return Status(ErrorCodes::IllegalOperation, "sync source resolver already started");
+ case State::kShuttingDown:
+ return Status(ErrorCodes::ShutdownInProgress, "sync source resolver shutting down");
+ case State::kComplete:
+ return Status(ErrorCodes::ShutdownInProgress, "sync source resolver completed");
}
- _state = State::kRunning;
}
return _chooseAndProbeNextSyncSource(OpTime());
diff --git a/src/mongo/db/repl/sync_source_resolver_test.cpp b/src/mongo/db/repl/sync_source_resolver_test.cpp
index 5e54a6e367f..4e94057031d 100644
--- a/src/mongo/db/repl/sync_source_resolver_test.cpp
+++ b/src/mongo/db/repl/sync_source_resolver_test.cpp
@@ -240,6 +240,15 @@ TEST_F(SyncSourceResolverTest, StartupReturnsIllegalOperationIfAlreadyActive) {
ASSERT_TRUE(_resolver->isActive());
}
+TEST_F(SyncSourceResolverTest, StartupReturnsShutdownInProgressIfResolverIsShuttingDown) {
+ _selector->syncSource = HostAndPort("node1", 12345);
+ ASSERT_OK(_resolver->startup());
+ ASSERT_TRUE(executor::NetworkInterfaceMock::InNetworkGuard(getNet())->hasReadyRequests());
+ _resolver->shutdown();
+ ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, _resolver->startup());
+ ASSERT_TRUE(_resolver->isActive());
+}
+
TEST_F(SyncSourceResolverTest, StartupReturnsShutdownInProgressIfExecutorIsShutdown) {
ASSERT_FALSE(_resolver->isActive());
getExecutor().shutdown();
@@ -258,7 +267,7 @@ TEST_F(SyncSourceResolverTest,
ASSERT_EQUALS(lastOpTimeFetched.getTimestamp(), _selector->lastTimestampFetched);
// Cannot restart a completed resolver.
- ASSERT_EQUALS(ErrorCodes::IllegalOperation, _resolver->startup());
+ ASSERT_EQUALS(ErrorCodes::ShutdownInProgress, _resolver->startup());
}
TEST_F(