From 38cd69968a54a3a72b9c83f0bcdbc5acac03785a Mon Sep 17 00:00:00 2001 From: Benety Goh Date: Fri, 5 Feb 2016 17:06:03 -0500 Subject: SERVER-22287 check heartbeat message instead of logs for inconsistent replica set id error --- ...lication_coordinator_impl_heartbeat_v1_test.cpp | 90 +++++++++++++--------- 1 file changed, 54 insertions(+), 36 deletions(-) diff --git a/src/mongo/db/repl/replication_coordinator_impl_heartbeat_v1_test.cpp b/src/mongo/db/repl/replication_coordinator_impl_heartbeat_v1_test.cpp index 40ccee44392..2233e21cc21 100644 --- a/src/mongo/db/repl/replication_coordinator_impl_heartbeat_v1_test.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl_heartbeat_v1_test.cpp @@ -362,7 +362,6 @@ TEST_F(ReplCoordHBV1Test, ArbiterRecordsCommittedOpTimeFromHeartbeatMetadata) { test(olderOpTime, committedOpTime); } -/* TEST_F(ReplCoordHBV1Test, IgnoreTheContentsOfMetadataWhenItsReplicaSetIdDoesNotMatchOurs) { // Tests that a secondary node will not update its committed optime from the heartbeat metadata // if the replica set ID is inconsistent with the existing configuration. @@ -380,50 +379,69 @@ TEST_F(ReplCoordHBV1Test, IgnoreTheContentsOfMetadataWhenItsReplicaSetIdDoesNotM auto rsConfig = getReplCoord()->getConfig(); - // process heartbeat - enterNetwork(); - auto net = getNet(); - const NetworkInterfaceMock::NetworkOperationIterator noi = net->getNextReadyRequest(); - const RemoteCommandRequest& request = noi->getRequest(); - log() << request.target.toString() << " processing " << request.cmdObj; - ASSERT_EQUALS(host2, request.target); - - ReplSetHeartbeatResponse hbResp; - hbResp.setSetName(rsConfig.getReplSetName()); - hbResp.setState(MemberState::RS_PRIMARY); - hbResp.setConfigVersion(rsConfig.getConfigVersion()); - - BSONObjBuilder responseBuilder; - responseBuilder << "ok" << 1; - hbResp.addToBSON(&responseBuilder, true); - + // Prepare heartbeat response. OID unexpectedId = OID::gen(); OpTime opTime{Timestamp{10, 10}, 10}; - rpc::ReplSetMetadata metadata( - opTime.getTerm(), opTime, opTime, rsConfig.getConfigVersion(), unexpectedId, 1, -1); - BSONObjBuilder metadataBuilder; - metadata.writeToMetadata(&metadataBuilder); - - net->scheduleResponse( - noi, net->now(), makeResponseStatus(responseBuilder.obj(), metadataBuilder.obj())); - - startCapturingLogMessages(); - net->runReadyNetworkOperations(); - stopCapturingLogMessages(); + ReplicationExecutor::ResponseStatus heartbeatResponse(ErrorCodes::InternalError, + "not initialized"); + { + ReplSetHeartbeatResponse hbResp; + hbResp.setSetName(rsConfig.getReplSetName()); + hbResp.setState(MemberState::RS_PRIMARY); + hbResp.setConfigVersion(rsConfig.getConfigVersion()); + + BSONObjBuilder responseBuilder; + responseBuilder << "ok" << 1; + hbResp.addToBSON(&responseBuilder, true); + + rpc::ReplSetMetadata metadata( + opTime.getTerm(), opTime, opTime, rsConfig.getConfigVersion(), unexpectedId, 1, -1); + BSONObjBuilder metadataBuilder; + metadata.writeToMetadata(&metadataBuilder); + + heartbeatResponse = makeResponseStatus(responseBuilder.obj(), metadataBuilder.obj()); + } + // process heartbeat + enterNetwork(); + auto net = getNet(); + while (net->hasReadyRequests()) { + const NetworkInterfaceMock::NetworkOperationIterator noi = net->getNextReadyRequest(); + const RemoteCommandRequest& request = noi->getRequest(); + if (request.target == host2 && + request.cmdObj.firstElement().fieldNameStringData() == "replSetHeartbeat") { + log() << request.target.toString() << " processing " << request.cmdObj; + net->scheduleResponse(noi, net->now(), heartbeatResponse); + } else { + log() << "blackholing request to " << request.target.toString() << ": " + << request.cmdObj; + net->blackHole(noi); + } + net->runReadyNetworkOperations(); + } exitNetwork(); ASSERT_NOT_EQUALS(opTime, getReplCoord()->getLastCommittedOpTime()); ASSERT_NOT_EQUALS(opTime.getTerm(), getTopoCoord().getTerm()); - ASSERT_EQUALS(1, - countLogLinesContaining( - str::stream() - << "Error in heartbeat request to node2:12345; InvalidReplicaSetConfig: " - "replica set IDs do not match, ours: " << rsConfig.getReplicaSetId() - << "; remote node's: " << unexpectedId)); + BSONObjBuilder statusBuilder; + ASSERT_OK(getReplCoord()->processReplSetGetStatus(&statusBuilder)); + auto statusObj = statusBuilder.obj(); + unittest::log() << "replica set status = " << statusObj; + + ASSERT_EQ(mongo::Array, statusObj["members"].type()); + auto members = statusObj["members"].Array(); + ASSERT_EQ(2U, members.size()); + ASSERT_TRUE(members[1].isABSONObj()); + auto member = members[1].Obj(); + ASSERT_EQ(host2, HostAndPort(member["name"].String())); + ASSERT_EQ(MemberState(MemberState::RS_DOWN).toString(), + MemberState(member["state"].numberInt()).toString()); + ASSERT_EQ(member["lastHeartbeatMessage"].String(), + std::string(str::stream() + << "replica set IDs do not match, ours: " << rsConfig.getReplicaSetId() + << "; remote node's: " << unexpectedId)); } -*/ } // namespace } // namespace repl -- cgit v1.2.1