diff options
author | Andy Schwerin <schwerin@mongodb.com> | 2014-10-21 16:04:12 -0400 |
---|---|---|
committer | Andy Schwerin <schwerin@mongodb.com> | 2014-10-21 18:28:56 -0400 |
commit | ede05b3fc832e015241702fa19a92d63f2f00481 (patch) | |
tree | 8418f84f32708bb4a8de3db3bc4ea1deec46774c | |
parent | 11ad1edebfafea650ff00912bdf7a3a48dede144 (diff) | |
download | mongo-ede05b3fc832e015241702fa19a92d63f2f00481.tar.gz |
SERVER-15763 Report issecondary:true while newly elected primary drains unapplied oplog entries.
Such nodes already report ismaster:false, so need to report issecondary:true to
indicate that they are ready to accept reads.
-rw-r--r-- | src/mongo/db/repl/repl_coordinator_impl.cpp | 3 | ||||
-rw-r--r-- | src/mongo/db/repl/repl_coordinator_impl_elect_test.cpp | 12 | ||||
-rw-r--r-- | src/mongo/db/repl/repl_coordinator_test_fixture.cpp | 13 |
3 files changed, 27 insertions, 1 deletions
diff --git a/src/mongo/db/repl/repl_coordinator_impl.cpp b/src/mongo/db/repl/repl_coordinator_impl.cpp index ebf97645121..0a7fef26e76 100644 --- a/src/mongo/db/repl/repl_coordinator_impl.cpp +++ b/src/mongo/db/repl/repl_coordinator_impl.cpp @@ -1216,8 +1216,9 @@ namespace { response)); _replExecutor.wait(cbh.getValue()); if (isWaitingForApplierToDrain()) { - // Report NotMaster when draining the applier. + // Report that we are secondary to ismaster callers until drain completes. response->setIsMaster(false); + response->setIsSecondary(true); } } diff --git a/src/mongo/db/repl/repl_coordinator_impl_elect_test.cpp b/src/mongo/db/repl/repl_coordinator_impl_elect_test.cpp index 312792cde42..7c039315bef 100644 --- a/src/mongo/db/repl/repl_coordinator_impl_elect_test.cpp +++ b/src/mongo/db/repl/repl_coordinator_impl_elect_test.cpp @@ -32,6 +32,7 @@ #include "mongo/db/jsobj.h" #include "mongo/db/operation_context_noop.h" +#include "mongo/db/repl/is_master_response.h" #include "mongo/db/repl/network_interface_mock.h" #include "mongo/db/repl/repl_coordinator_impl.h" #include "mongo/db/repl/repl_coordinator_test_fixture.h" @@ -138,6 +139,17 @@ namespace { ASSERT(getReplCoord()->getCurrentMemberState().primary()) << getReplCoord()->getCurrentMemberState().toString(); + ASSERT(getReplCoord()->isWaitingForApplierToDrain()); + + // Since we're still in drain mode, expect that we report ismaster: false, issecondary:true. + IsMasterResponse imResponse; + getReplCoord()->fillIsMasterForReplSet(&imResponse); + ASSERT_FALSE(imResponse.isMaster()) << imResponse.toBSON().toString(); + ASSERT_TRUE(imResponse.isSecondary()) << imResponse.toBSON().toString(); + getReplCoord()->signalDrainComplete(); + getReplCoord()->fillIsMasterForReplSet(&imResponse); + ASSERT_TRUE(imResponse.isMaster()) << imResponse.toBSON().toString(); + ASSERT_FALSE(imResponse.isSecondary()) << imResponse.toBSON().toString(); } TEST_F(ReplCoordElectTest, ElectManyNodesSuccess) { diff --git a/src/mongo/db/repl/repl_coordinator_test_fixture.cpp b/src/mongo/db/repl/repl_coordinator_test_fixture.cpp index bd614f15b34..5d6195ef7d0 100644 --- a/src/mongo/db/repl/repl_coordinator_test_fixture.cpp +++ b/src/mongo/db/repl/repl_coordinator_test_fixture.cpp @@ -33,6 +33,7 @@ #include "mongo/db/repl/repl_coordinator_test_fixture.h" #include "mongo/db/operation_context_noop.h" +#include "mongo/db/repl/is_master_response.h" #include "mongo/db/repl/network_interface_mock.h" #include "mongo/db/repl/repl_coordinator_external_state_mock.h" #include "mongo/db/repl/repl_coordinator_impl.h" @@ -207,7 +208,19 @@ namespace { net->runReadyNetworkOperations(); getNet()->exitNetwork(); } + ASSERT(replCoord->isWaitingForApplierToDrain()); + ASSERT(replCoord->getCurrentMemberState().primary()) << + replCoord->getCurrentMemberState().toString(); + + IsMasterResponse imResponse; + replCoord->fillIsMasterForReplSet(&imResponse); + ASSERT_FALSE(imResponse.isMaster()) << imResponse.toBSON().toString(); + ASSERT_TRUE(imResponse.isSecondary()) << imResponse.toBSON().toString(); replCoord->signalDrainComplete(); + replCoord->fillIsMasterForReplSet(&imResponse); + ASSERT_TRUE(imResponse.isMaster()) << imResponse.toBSON().toString(); + ASSERT_FALSE(imResponse.isSecondary()) << imResponse.toBSON().toString(); + ASSERT(replCoord->getCurrentMemberState().primary()) << replCoord->getCurrentMemberState().toString(); } |