summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Schwerin <schwerin@mongodb.com>2014-10-21 16:04:12 -0400
committerAndy Schwerin <schwerin@mongodb.com>2014-10-21 18:28:56 -0400
commitede05b3fc832e015241702fa19a92d63f2f00481 (patch)
tree8418f84f32708bb4a8de3db3bc4ea1deec46774c
parent11ad1edebfafea650ff00912bdf7a3a48dede144 (diff)
downloadmongo-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.cpp3
-rw-r--r--src/mongo/db/repl/repl_coordinator_impl_elect_test.cpp12
-rw-r--r--src/mongo/db/repl/repl_coordinator_test_fixture.cpp13
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();
}