From a2eeeedb3e358f9a71042a2ff752b67844d4dcf7 Mon Sep 17 00:00:00 2001 From: William Schultz Date: Wed, 4 Mar 2020 16:03:47 -0500 Subject: SERVER-46571 Give initial replica set configs a term of -1 --- src/mongo/db/repl/optime.h | 2 +- src/mongo/db/repl/repl_set_config.cpp | 2 +- src/mongo/db/repl/repl_set_config_checks.cpp | 11 ++++++----- src/mongo/db/repl/repl_set_config_checks_test.cpp | 18 +++++++++--------- .../db/repl/replication_coordinator_impl_test.cpp | 4 ++-- 5 files changed, 19 insertions(+), 18 deletions(-) (limited to 'src') diff --git a/src/mongo/db/repl/optime.h b/src/mongo/db/repl/optime.h index 9d045da574e..9cead491d25 100644 --- a/src/mongo/db/repl/optime.h +++ b/src/mongo/db/repl/optime.h @@ -56,7 +56,7 @@ public: static const char kTermFieldName[]; // The term of an OpTime generated by old protocol version. - static const long long kUninitializedTerm = -1; + static constexpr long long kUninitializedTerm = -1; // The initial term after the first time upgrading from protocol version 0. // diff --git a/src/mongo/db/repl/repl_set_config.cpp b/src/mongo/db/repl/repl_set_config.cpp index fe0c5ad1511..b1df2c829fb 100644 --- a/src/mongo/db/repl/repl_set_config.cpp +++ b/src/mongo/db/repl/repl_set_config.cpp @@ -101,7 +101,7 @@ Status ReplSetConfig::initialize(const BSONObj& cfg, } Status ReplSetConfig::initializeForInitiate(const BSONObj& cfg) { - return _initialize(cfg, true, OpTime::kInitialTerm, OID()); + return _initialize(cfg, true, OpTime::kUninitializedTerm, OID()); } Status ReplSetConfig::_initialize(const BSONObj& cfg, diff --git a/src/mongo/db/repl/repl_set_config_checks.cpp b/src/mongo/db/repl/repl_set_config_checks.cpp index 384cabfc125..e55ab04f905 100644 --- a/src/mongo/db/repl/repl_set_config_checks.cpp +++ b/src/mongo/db/repl/repl_set_config_checks.cpp @@ -330,11 +330,12 @@ StatusWith validateConfigForInitiate(ReplicationCoordinatorExternalState* e << newConfig.getConfigVersion()); } - if (newConfig.getConfigTerm() != OpTime::kInitialTerm) { - return StatusWith( - ErrorCodes::NewReplicaSetConfigurationIncompatible, - str::stream() << "Configuration used to initiate a replica set must have term " - << OpTime::kInitialTerm << ", but found " << newConfig.getConfigTerm()); + if (newConfig.getConfigTerm() != OpTime::kUninitializedTerm) { + return StatusWith(ErrorCodes::NewReplicaSetConfigurationIncompatible, + str::stream() + << "Configuration used to initiate a replica set must have term " + << OpTime::kUninitializedTerm << ", but found " + << newConfig.getConfigTerm()); } return findSelfInConfigIfElectable(externalState, newConfig, ctx); } diff --git a/src/mongo/db/repl/repl_set_config_checks_test.cpp b/src/mongo/db/repl/repl_set_config_checks_test.cpp index 63c33f7c1de..9654e9217e0 100644 --- a/src/mongo/db/repl/repl_set_config_checks_test.cpp +++ b/src/mongo/db/repl/repl_set_config_checks_test.cpp @@ -31,6 +31,7 @@ #include "mongo/base/status.h" #include "mongo/db/jsobj.h" +#include "mongo/db/repl/optime.h" #include "mongo/db/repl/repl_set_config.h" #include "mongo/db/repl/repl_set_config_checks.h" #include "mongo/db/repl/replication_coordinator_external_state.h" @@ -62,20 +63,19 @@ TEST_F(ServiceContextTest, ValidateConfigForInitiate_VersionMustBe1) { validateConfigForInitiate(&rses, config, getGlobalServiceContext()).getStatus()); } -TEST_F(ServiceContextTest, ValidateConfigForInitiate_TermIsAlwaysInitialTerm) { +TEST_F(ServiceContextTest, ValidateConfigForInitiate_TermIsAlwaysUninitializedTerm) { ReplicationCoordinatorExternalStateMock rses; rses.addSelf(HostAndPort("h1")); ReplSetConfig config; - ASSERT_OK( - config.initializeForInitiate(BSON("_id" - << "rs0" - << "version" << 1 << "term" << (OpTime::kInitialTerm + 1) - << "protocolVersion" << 1 << "members" - << BSON_ARRAY(BSON("_id" << 1 << "host" - << "h1"))))); + ASSERT_OK(config.initializeForInitiate(BSON("_id" + << "rs0" + << "version" << 1 << "term" << 999 + << "protocolVersion" << 1 << "members" + << BSON_ARRAY(BSON("_id" << 1 << "host" + << "h1"))))); ASSERT_OK(validateConfigForInitiate(&rses, config, getGlobalServiceContext()).getStatus()); - ASSERT_EQUALS(config.getConfigTerm(), OpTime::kInitialTerm); + ASSERT_EQUALS(config.getConfigTerm(), OpTime::kUninitializedTerm); } TEST_F(ServiceContextTest, ValidateConfigForInitiate_MustFindSelf) { diff --git a/src/mongo/db/repl/replication_coordinator_impl_test.cpp b/src/mongo/db/repl/replication_coordinator_impl_test.cpp index 3eed301094a..4b76331c0e2 100644 --- a/src/mongo/db/repl/replication_coordinator_impl_test.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl_test.cpp @@ -358,7 +358,7 @@ TEST_F(ReplCoordTest, NodeReturnsNodeNotFoundWhenQuorumCheckFailsWhileInitiating ReplSetHeartbeatArgsV1 hbArgs; hbArgs.setSetName("mySet"); hbArgs.setConfigVersion(1); - hbArgs.setConfigTerm(0); + hbArgs.setConfigTerm(OpTime::kUninitializedTerm); hbArgs.setCheckEmpty(); hbArgs.setSenderHost(HostAndPort("node1", 12345)); hbArgs.setSenderId(0); @@ -392,7 +392,7 @@ TEST_F(ReplCoordTest, InitiateSucceedsWhenQuorumCheckPasses) { ReplSetHeartbeatArgsV1 hbArgs; hbArgs.setSetName("mySet"); hbArgs.setConfigVersion(1); - hbArgs.setConfigTerm(0); + hbArgs.setConfigTerm(OpTime::kUninitializedTerm); hbArgs.setCheckEmpty(); hbArgs.setSenderHost(HostAndPort("node1", 12345)); hbArgs.setSenderId(0); -- cgit v1.2.1