diff options
author | matt dannenberg <matt.dannenberg@10gen.com> | 2015-08-07 06:36:44 -0400 |
---|---|---|
committer | matt dannenberg <matt.dannenberg@10gen.com> | 2015-08-12 04:22:28 -0400 |
commit | 86a3e6352eb27fd2e6115299bcec5103a830fe36 (patch) | |
tree | 7f7f42491808e8c487e47a710deb445448d18a58 | |
parent | 7bb09c0377f5160857617c38ab07955f8f4b03f6 (diff) | |
download | mongo-86a3e6352eb27fd2e6115299bcec5103a830fe36.tar.gz |
SERVER-19554 merge ReplSetMetadata and ReplicationMetadata
36 files changed, 390 insertions, 497 deletions
diff --git a/src/mongo/bson/util/SConscript b/src/mongo/bson/util/SConscript index 6c8ce51e012..6aa6c1476c8 100644 --- a/src/mongo/bson/util/SConscript +++ b/src/mongo/bson/util/SConscript @@ -9,6 +9,7 @@ env.Library( ], LIBDEPS=[ '$BUILD_DIR/mongo/base', + '$BUILD_DIR/mongo/db/repl/optime', ], ) @@ -19,6 +20,7 @@ env.CppUnitTest( ], LIBDEPS=[ '$BUILD_DIR/mongo/base', + '$BUILD_DIR/mongo/db/repl/optime', 'bson_extract', ], ) diff --git a/src/mongo/bson/util/bson_extract.cpp b/src/mongo/bson/util/bson_extract.cpp index d5b5b83e6da..4906d0897a5 100644 --- a/src/mongo/bson/util/bson_extract.cpp +++ b/src/mongo/bson/util/bson_extract.cpp @@ -32,6 +32,13 @@ namespace mongo { +namespace { + +const char kTermFieldName[] = "term"; +const char kTimestampFieldName[] = "ts"; + +} // namespace + Status bsonExtractField(const BSONObj& object, StringData fieldName, BSONElement* outElement) { BSONElement element = object.getField(fieldName); if (element.eoo()) @@ -98,6 +105,25 @@ Status bsonExtractStringField(const BSONObj& object, StringData fieldName, std:: return Status::OK(); } +Status bsonExtractOpTimeField(const BSONObj& object, StringData fieldName, repl::OpTime* out) { + BSONElement element; + Status status = bsonExtractTypedField(object, fieldName, Object, &element); + if (!status.isOK()) + return status; + + BSONObj opTimeObj = element.Obj(); + Timestamp ts; + status = bsonExtractTimestampField(opTimeObj, kTimestampFieldName, &ts); + if (!status.isOK()) + return status; + long long term; + status = bsonExtractIntegerField(opTimeObj, kTermFieldName, &term); + if (!status.isOK()) + return status; + *out = repl::OpTime(ts, term); + return Status::OK(); +} + Status bsonExtractTimestampField(const BSONObj& object, StringData fieldName, Timestamp* out) { BSONElement element; Status status = bsonExtractTypedField(object, fieldName, bsonTimestamp, &element); diff --git a/src/mongo/bson/util/bson_extract.h b/src/mongo/bson/util/bson_extract.h index fa7e3bbc9ab..c5e34d3e3ba 100644 --- a/src/mongo/bson/util/bson_extract.h +++ b/src/mongo/bson/util/bson_extract.h @@ -33,6 +33,7 @@ #include "mongo/base/status.h" #include "mongo/base/string_data.h" #include "mongo/bson/bsontypes.h" +#include "mongo/db/repl/optime.h" namespace mongo { @@ -94,6 +95,20 @@ Status bsonExtractIntegerField(const BSONObj& object, StringData fieldName, long */ Status bsonExtractStringField(const BSONObj& object, StringData fieldName, std::string* out); + +/** + * Finds an object-typed field named "fieldName" in "object" that represents an OpTime. + * + * The OpTime objects have two fields, a Timestamp ts and numeric term. + * + * Returns Status::OK() and sets *out to the found element's OpTime value on success. Returns + * ErrorCodes::NoSuchKey if there are no matches for "fieldName" or either subobject field is + * missing, and ErrorCodes::TypeMismatch if the type of the matching element is not Object, the ts + * subfield is not Timestamp, or the term subfield is not numeric. For return values other than + * Status::OK(), the resulting value of "*out" is undefined. + */ +Status bsonExtractOpTimeField(const BSONObj& object, StringData fieldName, repl::OpTime* out); + /** * Finds an Timestamp-typed element named "fieldName" in "object" and stores its value in "out". * diff --git a/src/mongo/bson/util/bson_extract_test.cpp b/src/mongo/bson/util/bson_extract_test.cpp index dc4b97f8a8f..1c7261d1301 100644 --- a/src/mongo/bson/util/bson_extract_test.cpp +++ b/src/mongo/bson/util/bson_extract_test.cpp @@ -30,6 +30,7 @@ #include "mongo/bson/util/bson_extract.h" #include "mongo/db/jsobj.h" +#include "mongo/db/repl/optime.h" #include "mongo/unittest/unittest.h" using namespace mongo; @@ -83,6 +84,33 @@ TEST(ExtractBSON, ExtractStringFieldWithDefault) { ASSERT_EQUALS(std::string("default"), s); } +TEST(ExtractBSON, ExtractOpTimeField) { + // Outer object cases. + BSONObj obj = BSON("a" << BSON("ts" << Timestamp(10, 0) << "term" << 2) << "b" + << "notAnObj"); + repl::OpTime opTime; + ASSERT_OK(bsonExtractOpTimeField(obj, "a", &opTime)); + ASSERT(repl::OpTime(Timestamp(10, 0), 2) == opTime); + ASSERT_EQUALS(ErrorCodes::TypeMismatch, bsonExtractOpTimeField(obj, "b", &opTime)); + ASSERT_EQUALS(ErrorCodes::NoSuchKey, bsonExtractOpTimeField(obj, "c", &opTime)); + + // Missing timestamp field. + obj = BSON("a" << BSON("ts" + << "notATimestamp" + << "term" << 2)); + ASSERT_EQUALS(ErrorCodes::TypeMismatch, bsonExtractOpTimeField(obj, "a", &opTime)); + // Wrong typed timestamp field. + obj = BSON("a" << BSON("term" << 2)); + ASSERT_EQUALS(ErrorCodes::NoSuchKey, bsonExtractOpTimeField(obj, "a", &opTime)); + // Missing term field. + obj = BSON("a" << BSON("ts" << Timestamp(10, 0) << "term" + << "notANumber")); + ASSERT_EQUALS(ErrorCodes::TypeMismatch, bsonExtractOpTimeField(obj, "a", &opTime)); + // Wrong typed term field. + obj = BSON("a" << BSON("ts" << Timestamp(10, 0))); + ASSERT_EQUALS(ErrorCodes::NoSuchKey, bsonExtractOpTimeField(obj, "a", &opTime)); +} + TEST(ExtractBSON, ExtractBooleanFieldWithDefault) { BSONObj obj1 = BSON("a" << 1 << "b" << "hello" diff --git a/src/mongo/db/repl/SConscript b/src/mongo/db/repl/SConscript index 239153b0114..92215f50d65 100644 --- a/src/mongo/db/repl/SConscript +++ b/src/mongo/db/repl/SConscript @@ -247,12 +247,13 @@ env.Library('repl_coordinator_impl', ], LIBDEPS=[ '$BUILD_DIR/mongo/db/common', - '$BUILD_DIR/mongo/db/index/index_descriptor', - '$BUILD_DIR/mongo/util/fail_point', '$BUILD_DIR/mongo/db/global_timestamp', - '$BUILD_DIR/mongo/rpc/command_status', + '$BUILD_DIR/mongo/db/index/index_descriptor', '$BUILD_DIR/mongo/db/server_options_core', '$BUILD_DIR/mongo/db/service_context', + '$BUILD_DIR/mongo/rpc/command_status', + '$BUILD_DIR/mongo/rpc/metadata', + '$BUILD_DIR/mongo/util/fail_point', 'data_replicator', 'repl_coordinator_global', 'repl_coordinator_interface', @@ -397,7 +398,6 @@ env.Library('replica_set_messages', 'repl_set_request_votes_args.cpp', 'replica_set_config.cpp', 'replica_set_tag.cpp', - 'replication_metadata.cpp', 'update_position_args.cpp', 'last_vote.cpp', ], @@ -405,7 +405,6 @@ env.Library('replica_set_messages', '$BUILD_DIR/mongo/base', '$BUILD_DIR/mongo/bson/util/bson_extract', '$BUILD_DIR/mongo/db/common', - '$BUILD_DIR/mongo/rpc/metadata', '$BUILD_DIR/mongo/util/net/hostandport', 'optime', 'read_concern_args', diff --git a/src/mongo/db/repl/data_replicator.cpp b/src/mongo/db/repl/data_replicator.cpp index 459bcdeaeaa..7caa57a29f0 100644 --- a/src/mongo/db/repl/data_replicator.cpp +++ b/src/mongo/db/repl/data_replicator.cpp @@ -44,6 +44,7 @@ #include "mongo/db/repl/member_state.h" #include "mongo/db/repl/optime.h" #include "mongo/db/repl/sync_source_selector.h" +#include "mongo/rpc/metadata/repl_set_metadata.h" #include "mongo/stdx/functional.h" #include "mongo/stdx/thread.h" #include "mongo/util/assert_util.h" @@ -133,7 +134,7 @@ OplogFetcher::OplogFetcher(ReplicationExecutor* exec, BSON("find" << oplogNSS.coll() << "filter" << BSON("ts" << BSON("$gte" << startTS))), work, - BSON(rpc::kReplicationMetadataFieldName << 1)), + BSON(rpc::kReplSetMetadataFieldName << 1)), _startTS(startTS) {} std::string OplogFetcher::toString() const { diff --git a/src/mongo/db/repl/read_concern_args.cpp b/src/mongo/db/repl/read_concern_args.cpp index 54cac6b3bc4..42c7dab7361 100644 --- a/src/mongo/db/repl/read_concern_args.cpp +++ b/src/mongo/db/repl/read_concern_args.cpp @@ -82,32 +82,14 @@ Status ReadConcernArgs::initialize(const BSONObj& cmdObj) { } BSONObj readConcernObj = readConcernElem.Obj(); - BSONElement opTimeElem; - auto opTimeStatus = - bsonExtractTypedField(readConcernObj, kOpTimeFieldName, Object, &opTimeElem); - if (opTimeStatus.isOK()) { - BSONObj opTimeObj = opTimeElem.Obj(); - BSONElement timestampElem; - - Timestamp timestamp; - auto timestampStatus = - bsonExtractTimestampField(opTimeObj, kOpTimestampFieldName, ×tamp); - - if (!timestampStatus.isOK()) { - return timestampStatus; - } - - long long termNumber; - auto termStatus = bsonExtractIntegerField(opTimeObj, kOpTermFieldName, &termNumber); - - if (!termStatus.isOK()) { - return termStatus; + if (readConcernObj.hasField(kOpTimeFieldName)) { + OpTime opTime; + auto opTimeStatus = bsonExtractOpTimeField(readConcernObj, kOpTimeFieldName, &opTime); + if (!opTimeStatus.isOK()) { + return opTimeStatus; } - - _opTime = OpTime(timestamp, termNumber); - } else if (opTimeStatus != ErrorCodes::NoSuchKey) { - return opTimeStatus; + _opTime = opTime; } std::string levelString; diff --git a/src/mongo/db/repl/read_concern_args_test.cpp b/src/mongo/db/repl/read_concern_args_test.cpp index 4c7dbd05dde..96077da684c 100644 --- a/src/mongo/db/repl/read_concern_args_test.cpp +++ b/src/mongo/db/repl/read_concern_args_test.cpp @@ -112,7 +112,8 @@ TEST(ReadAfterParse, NoOpTimeTS) { readAfterOpTime.initialize(BSON("find" << "test" << ReadConcernArgs::kReadConcernFieldName << BSON(ReadConcernArgs::kOpTimeFieldName - << BSON(ReadConcernArgs::kOpTermFieldName << 2))))); + << BSON(ReadConcernArgs::kOpTimestampFieldName + << 2))))); } TEST(ReadAfterParse, NoOpTimeTerm) { diff --git a/src/mongo/db/repl/repl_set_heartbeat_response.cpp b/src/mongo/db/repl/repl_set_heartbeat_response.cpp index d2a77c58a5f..1acccd49d03 100644 --- a/src/mongo/db/repl/repl_set_heartbeat_response.cpp +++ b/src/mongo/db/repl/repl_set_heartbeat_response.cpp @@ -221,18 +221,8 @@ Status ReplSetHeartbeatResponse::initialize(const BSONObj& doc, long long term) _opTimeSet = true; _opTime = OpTime(Timestamp(opTimeElement.date()), term); } else if (opTimeElement.type() == Object) { - BSONObj opTime = opTimeElement.Obj(); - Timestamp ts; - Status status = bsonExtractTimestampField(opTime, kTimestampFieldName, &ts); - if (!status.isOK()) - return status; - long long extractedTerm; - status = bsonExtractIntegerField(opTime, kTermFieldName, &extractedTerm); - if (!status.isOK()) - return status; - + Status status = bsonExtractOpTimeField(doc, kOpTimeFieldName, &_opTime); _opTimeSet = true; - _opTime = OpTime(ts, extractedTerm); // since a v1 OpTime was in the response, the member must be part of a replset _isReplSet = true; } else { diff --git a/src/mongo/db/repl/repl_set_request_votes_args.cpp b/src/mongo/db/repl/repl_set_request_votes_args.cpp index 8a119ff0013..51a049131a2 100644 --- a/src/mongo/db/repl/repl_set_request_votes_args.cpp +++ b/src/mongo/db/repl/repl_set_request_votes_args.cpp @@ -91,18 +91,9 @@ Status ReplSetRequestVotesArgs::initialize(const BSONObj& argsObj) { if (!status.isOK()) return status; - // extracting the lastCommittedOp is a bit of a process - BSONObj lastCommittedOp = argsObj[kLastCommittedOpFieldName].Obj(); - Timestamp ts; - status = bsonExtractTimestampField(lastCommittedOp, kOpTimeFieldName, &ts); + status = bsonExtractOpTimeField(argsObj, kLastCommittedOpFieldName, &_lastCommittedOp); if (!status.isOK()) return status; - long long term; - status = bsonExtractIntegerField(lastCommittedOp, kTermFieldName, &term); - if (!status.isOK()) - return status; - _lastCommittedOp = OpTime(lastCommittedOp[kOpTimeFieldName].timestamp(), - lastCommittedOp[kTermFieldName].Long()); return Status::OK(); } diff --git a/src/mongo/db/repl/replication_coordinator.h b/src/mongo/db/repl/replication_coordinator.h index 5c3df0b527c..39e5a6972d8 100644 --- a/src/mongo/db/repl/replication_coordinator.h +++ b/src/mongo/db/repl/replication_coordinator.h @@ -54,6 +54,7 @@ namespace rpc { class ReplSetMetadata; class RequestInterface; +class ReplSetMetadata; } // namespace rpc @@ -75,7 +76,6 @@ class ReplSetHtmlSummary; class ReplSetRequestVotesArgs; class ReplSetRequestVotesResponse; class ReplicaSetConfig; -class ReplicationMetadata; class UpdatePositionArgs; /** @@ -413,14 +413,14 @@ public: virtual void processReplSetGetConfig(BSONObjBuilder* result) = 0; /** - * Processes the ReplicationMetadata returned from a command run against another replica set + * Processes the ReplSetMetadata returned from a command run against another replica set * member and updates protocol version 1 information (most recent optime that is committed, * member id of the current PRIMARY, the current config version and the current term). * * TODO(dannenberg): Move this method to be testing only if it does not end up being used * to process the find and getmore metadata responses from the DataReplicator. */ - virtual void processReplicationMetadata(const ReplicationMetadata& replMetadata) = 0; + virtual void processReplSetMetadata(const rpc::ReplSetMetadata& replMetadata) = 0; /** * Toggles maintenanceMode to the value expressed by 'activate' diff --git a/src/mongo/db/repl/replication_coordinator_impl.cpp b/src/mongo/db/repl/replication_coordinator_impl.cpp index 06fc4f3ed4f..3ce0aab069b 100644 --- a/src/mongo/db/repl/replication_coordinator_impl.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl.cpp @@ -59,7 +59,6 @@ #include "mongo/db/repl/repl_settings.h" #include "mongo/db/repl/replica_set_config_checks.h" #include "mongo/db/repl/replication_executor.h" -#include "mongo/db/repl/replication_metadata.h" #include "mongo/db/repl/rslog.h" #include "mongo/db/repl/topology_coordinator.h" #include "mongo/db/repl/update_position_args.h" @@ -1604,10 +1603,9 @@ void ReplicationCoordinatorImpl::processReplSetGetConfig(BSONObjBuilder* result) result->append("config", _rsConfig.toBSON()); } -void ReplicationCoordinatorImpl::processReplicationMetadata( - const ReplicationMetadata& replMetadata) { +void ReplicationCoordinatorImpl::processReplSetMetadata(const rpc::ReplSetMetadata& replMetadata) { CBHStatus cbh = _replExecutor.scheduleWork( - stdx::bind(&ReplicationCoordinatorImpl::_processReplicationMetadata_helper, + stdx::bind(&ReplicationCoordinatorImpl::_processReplSetMetadata_helper, this, stdx::placeholders::_1, replMetadata)); @@ -1618,17 +1616,17 @@ void ReplicationCoordinatorImpl::processReplicationMetadata( _replExecutor.wait(cbh.getValue()); } -void ReplicationCoordinatorImpl::_processReplicationMetadata_helper( - const ReplicationExecutor::CallbackArgs& cbData, const ReplicationMetadata& replMetadata) { +void ReplicationCoordinatorImpl::_processReplSetMetadata_helper( + const ReplicationExecutor::CallbackArgs& cbData, const rpc::ReplSetMetadata& replMetadata) { if (cbData.status == ErrorCodes::CallbackCanceled) { return; } - _processReplicationMetadata_incallback(replMetadata); + _processReplSetMetadata_incallback(replMetadata); } -void ReplicationCoordinatorImpl::_processReplicationMetadata_incallback( - const ReplicationMetadata& replMetadata) { +void ReplicationCoordinatorImpl::_processReplSetMetadata_incallback( + const rpc::ReplSetMetadata& replMetadata) { if (replMetadata.getConfigVersion() != _rsConfig.getConfigVersion()) { return; } @@ -2748,7 +2746,7 @@ void ReplicationCoordinatorImpl::_processReplSetDeclareElectionWinner_finish( void ReplicationCoordinatorImpl::prepareReplResponseMetadata(const rpc::RequestInterface& request, BSONObjBuilder* builder) { - if (request.getMetadata().hasField(rpc::kReplicationMetadataFieldName)) { + if (request.getMetadata().hasField(rpc::kReplSetMetadataFieldName)) { rpc::ReplSetMetadata metadata; CBHStatus cbh = _replExecutor.scheduleWork( @@ -2764,9 +2762,7 @@ void ReplicationCoordinatorImpl::prepareReplResponseMetadata(const rpc::RequestI fassert(28709, cbh.getStatus()); _replExecutor.wait(cbh.getValue()); - BSONObjBuilder metadataBuilder(builder->subobjStart(rpc::kReplicationMetadataFieldName)); metadata.writeToMetadata(builder); - metadataBuilder.doneFast(); } } diff --git a/src/mongo/db/repl/replication_coordinator_impl.h b/src/mongo/db/repl/replication_coordinator_impl.h index 41e39ee5c14..ed4fc4358f4 100644 --- a/src/mongo/db/repl/replication_coordinator_impl.h +++ b/src/mongo/db/repl/replication_coordinator_impl.h @@ -192,7 +192,7 @@ public: virtual void processReplSetGetConfig(BSONObjBuilder* result) override; - virtual void processReplicationMetadata(const ReplicationMetadata& replMetadata) override; + virtual void processReplSetMetadata(const rpc::ReplSetMetadata& replMetadata) override; virtual Status setMaintenanceMode(bool activate) override; @@ -942,13 +942,13 @@ private: bool _updateTerm_incallback(long long term, Handle* cbHandle); /** - * Callback that processes the ReplicationMetadata returned from a command run against another + * Callback that processes the ReplSetMetadata returned from a command run against another * replica set member and updates protocol version 1 information (most recent optime that is * committed, member id of the current PRIMARY, the current config version and the current term) */ - void _processReplicationMetadata_helper(const ReplicationExecutor::CallbackArgs& cbData, - const ReplicationMetadata& replMetadata); - void _processReplicationMetadata_incallback(const ReplicationMetadata& replMetadata); + void _processReplSetMetadata_helper(const ReplicationExecutor::CallbackArgs& cbData, + const rpc::ReplSetMetadata& replMetadata); + void _processReplSetMetadata_incallback(const rpc::ReplSetMetadata& replMetadata); /** * Blesses a snapshot to be used for new committed reads. diff --git a/src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp b/src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp index baa2034ab3c..4d478d235bc 100644 --- a/src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp @@ -43,9 +43,9 @@ #include "mongo/db/repl/replica_set_config_checks.h" #include "mongo/db/repl/replication_coordinator_impl.h" #include "mongo/db/repl/replication_executor.h" -#include "mongo/db/repl/replication_metadata.h" #include "mongo/db/repl/topology_coordinator.h" #include "mongo/rpc/get_status_from_command_result.h" +#include "mongo/rpc/metadata/repl_set_metadata.h" #include "mongo/stdx/functional.h" #include "mongo/util/assert_util.h" #include "mongo/util/fail_point_service.h" @@ -88,7 +88,7 @@ void ReplicationCoordinatorImpl::_doMemberHeartbeat(ReplicationExecutor::Callbac } const RemoteCommandRequest request( - target, "admin", heartbeatObj, BSON(rpc::kReplicationMetadataFieldName << 1), timeout); + target, "admin", heartbeatObj, BSON(rpc::kReplSetMetadataFieldName << 1), timeout); const ReplicationExecutor::RemoteCommandCallbackFn callback = stdx::bind(&ReplicationCoordinatorImpl::_handleHeartbeatResponse, this, @@ -129,10 +129,10 @@ void ReplicationCoordinatorImpl::_handleHeartbeatResponse( if (responseStatus.isOK()) { resp = cbData.response.getValue().data; responseStatus = hbResponse.initialize(resp, _topCoord->getTerm()); - ReplicationMetadata replMetadata; - auto metadataStatus = replMetadata.initialize(cbData.response.getValue().metadata); - if (metadataStatus.isOK()) { - _processReplicationMetadata_incallback(replMetadata); + StatusWith<rpc::ReplSetMetadata> replMetadata = + rpc::ReplSetMetadata::readFromMetadata(cbData.response.getValue().metadata); + if (replMetadata.isOK()) { + _processReplSetMetadata_incallback(replMetadata.getValue()); } } const Date_t now = _replExecutor.now(); diff --git a/src/mongo/db/repl/replication_coordinator_impl_test.cpp b/src/mongo/db/repl/replication_coordinator_impl_test.cpp index 12d9098d953..47eb3893471 100644 --- a/src/mongo/db/repl/replication_coordinator_impl_test.cpp +++ b/src/mongo/db/repl/replication_coordinator_impl_test.cpp @@ -49,13 +49,12 @@ #include "mongo/db/repl/replication_coordinator_external_state_mock.h" #include "mongo/db/repl/replication_coordinator_impl.h" #include "mongo/db/repl/replication_coordinator_test_fixture.h" -#include "mongo/db/repl/replication_metadata.h" #include "mongo/db/repl/topology_coordinator_impl.h" #include "mongo/db/repl/update_position_args.h" #include "mongo/db/server_options.h" #include "mongo/db/write_concern_options.h" #include "mongo/executor/network_interface_mock.h" -#include "mongo/rpc/metadata.h" +#include "mongo/rpc/metadata/repl_set_metadata.h" #include "mongo/stdx/functional.h" #include "mongo/stdx/future.h" #include "mongo/stdx/thread.h" @@ -2493,7 +2492,7 @@ TEST_F(ReplCoordTest, ReadAfterCommittedDeferredEqualOpTime) { } TEST_F(ReplCoordTest, MetadataWrongConfigVersion) { - // Ensure that we do not process ReplicationMetadata when ConfigVersions do not match. + // Ensure that we do not process ReplSetMetadata when ConfigVersions do not match. assertStartSuccess(BSON("_id" << "mySet" << "version" << 2 << "members" @@ -2509,27 +2508,26 @@ TEST_F(ReplCoordTest, MetadataWrongConfigVersion) { ASSERT_EQUALS(OpTime(Timestamp(0, 0), 0), getReplCoord()->getLastCommittedOpTime()); // lower configVersion - ReplicationMetadata metadata; - metadata.initialize(BSON(rpc::kReplicationMetadataFieldName << BSON( - "lastOpCommittedTimestamp" - << Timestamp(10, 0) << "lastOpCommittedTerm" << 2 - << "configVersion" << 1 << "primaryIndex" << 2 << "term" << 2))); - getReplCoord()->processReplicationMetadata(metadata); + StatusWith<rpc::ReplSetMetadata> metadata = rpc::ReplSetMetadata::readFromMetadata(BSON( + rpc::kReplSetMetadataFieldName << BSON( + "lastOpCommitted" << BSON("ts" << Timestamp(10, 0) << "term" << 2) << "lastOpVisible" + << BSON("ts" << Timestamp(10, 0) << "term" << 2) << "configVersion" + << 1 << "primaryIndex" << 2 << "term" << 2))); + getReplCoord()->processReplSetMetadata(metadata.getValue()); ASSERT_EQUALS(OpTime(Timestamp(0, 0), 0), getReplCoord()->getLastCommittedOpTime()); // higher configVersion - ReplicationMetadata metadata2; - metadata2.initialize( - BSON(rpc::kReplicationMetadataFieldName - << BSON("lastOpCommittedTimestamp" << Timestamp(10, 0) << "lastOpCommittedTerm" << 2 - << "configVersion" << 100 << "primaryIndex" << 2 - << "term" << 2))); - getReplCoord()->processReplicationMetadata(metadata2); + StatusWith<rpc::ReplSetMetadata> metadata2 = rpc::ReplSetMetadata::readFromMetadata(BSON( + rpc::kReplSetMetadataFieldName << BSON( + "lastOpCommitted" << BSON("ts" << Timestamp(10, 0) << "term" << 2) << "lastOpVisible" + << BSON("ts" << Timestamp(10, 0) << "term" << 2) << "configVersion" + << 100 << "primaryIndex" << 2 << "term" << 2))); + getReplCoord()->processReplSetMetadata(metadata2.getValue()); ASSERT_EQUALS(OpTime(Timestamp(0, 0), 0), getReplCoord()->getLastCommittedOpTime()); } TEST_F(ReplCoordTest, MetadataUpdatesLastCommittedOpTime) { - // Ensure that LastCommittedOpTime updates when a newer OpTime comes in via ReplicationMetadata, + // Ensure that LastCommittedOpTime updates when a newer OpTime comes in via ReplSetMetadata, // but not if the OpTime is older than the current LastCommittedOpTime. assertStartSuccess(BSON("_id" << "mySet" @@ -2553,29 +2551,29 @@ TEST_F(ReplCoordTest, MetadataUpdatesLastCommittedOpTime) { getReplCoord()->onSnapshotCreate(time, SnapshotName(1)); // higher OpTime, should change - ReplicationMetadata metadata; - metadata.initialize(BSON(rpc::kReplicationMetadataFieldName << BSON( - "lastOpCommittedTimestamp" - << Timestamp(10, 0) << "lastOpCommittedTerm" << 1 - << "configVersion" << 2 << "primaryIndex" << 2 << "term" << 1))); - getReplCoord()->processReplicationMetadata(metadata); + StatusWith<rpc::ReplSetMetadata> metadata = rpc::ReplSetMetadata::readFromMetadata(BSON( + rpc::kReplSetMetadataFieldName << BSON( + "lastOpCommitted" << BSON("ts" << Timestamp(10, 0) << "term" << 1) << "lastOpVisible" + << BSON("ts" << Timestamp(10, 0) << "term" << 1) << "configVersion" + << 2 << "primaryIndex" << 2 << "term" << 1))); + getReplCoord()->processReplSetMetadata(metadata.getValue()); ASSERT_EQUALS(OpTime(Timestamp(10, 0), 1), getReplCoord()->getLastCommittedOpTime()); ASSERT_EQUALS(OpTime(Timestamp(10, 0), 1), getReplCoord()->getCurrentCommittedSnapshot_forTest()); // lower OpTime, should not change - ReplicationMetadata metadata2; - metadata2.initialize(BSON(rpc::kReplicationMetadataFieldName << BSON( - "lastOpCommittedTimestamp" - << Timestamp(9, 0) << "lastOpCommittedTerm" << 1 - << "configVersion" << 2 << "primaryIndex" << 2 << "term" << 1))); - getReplCoord()->processReplicationMetadata(metadata2); + StatusWith<rpc::ReplSetMetadata> metadata2 = rpc::ReplSetMetadata::readFromMetadata(BSON( + rpc::kReplSetMetadataFieldName + << BSON("lastOpCommitted" << BSON("ts" << Timestamp(9, 0) << "term" << 1) << "lastOpVisible" + << BSON("ts" << Timestamp(9, 0) << "term" << 1) << "configVersion" + << 2 << "primaryIndex" << 2 << "term" << 1))); + getReplCoord()->processReplSetMetadata(metadata2.getValue()); ASSERT_EQUALS(OpTime(Timestamp(10, 0), 1), getReplCoord()->getLastCommittedOpTime()); } TEST_F(ReplCoordTest, MetadataUpdatesTermAndPrimaryId) { // Ensure that the term is updated if and only if the term is greater than our current term. - // Ensure that currentPrimaryIndex is never altered by ReplicationMetadata. + // Ensure that currentPrimaryIndex is never altered by ReplSetMetadata. assertStartSuccess(BSON("_id" << "mySet" << "version" << 2 << "members" @@ -2594,34 +2592,34 @@ TEST_F(ReplCoordTest, MetadataUpdatesTermAndPrimaryId) { ASSERT_EQUALS(1, getReplCoord()->getTerm()); // higher term, should change - ReplicationMetadata metadata; - metadata.initialize(BSON(rpc::kReplicationMetadataFieldName << BSON( - "lastOpCommittedTimestamp" - << Timestamp(10, 0) << "lastOpCommittedTerm" << 3 - << "configVersion" << 2 << "primaryIndex" << 2 << "term" << 3))); - getReplCoord()->processReplicationMetadata(metadata); + StatusWith<rpc::ReplSetMetadata> metadata = rpc::ReplSetMetadata::readFromMetadata(BSON( + rpc::kReplSetMetadataFieldName << BSON( + "lastOpCommitted" << BSON("ts" << Timestamp(10, 0) << "term" << 3) << "lastOpVisible" + << BSON("ts" << Timestamp(10, 0) << "term" << 3) << "configVersion" + << 2 << "primaryIndex" << 2 << "term" << 3))); + getReplCoord()->processReplSetMetadata(metadata.getValue()); ASSERT_EQUALS(OpTime(Timestamp(10, 0), 3), getReplCoord()->getLastCommittedOpTime()); ASSERT_EQUALS(3, getReplCoord()->getTerm()); ASSERT_EQUALS(-1, getTopoCoord().getCurrentPrimaryIndex()); // lower term, should not change - ReplicationMetadata metadata2; - metadata2.initialize(BSON(rpc::kReplicationMetadataFieldName << BSON( - "lastOpCommittedTimestamp" - << Timestamp(11, 0) << "lastOpCommittedTerm" << 3 - << "configVersion" << 2 << "primaryIndex" << 1 << "term" << 2))); - getReplCoord()->processReplicationMetadata(metadata2); + StatusWith<rpc::ReplSetMetadata> metadata2 = rpc::ReplSetMetadata::readFromMetadata(BSON( + rpc::kReplSetMetadataFieldName << BSON( + "lastOpCommitted" << BSON("ts" << Timestamp(11, 0) << "term" << 3) << "lastOpVisible" + << BSON("ts" << Timestamp(11, 0) << "term" << 3) << "configVersion" + << 2 << "primaryIndex" << 1 << "term" << 2))); + getReplCoord()->processReplSetMetadata(metadata2.getValue()); ASSERT_EQUALS(OpTime(Timestamp(11, 0), 3), getReplCoord()->getLastCommittedOpTime()); ASSERT_EQUALS(3, getReplCoord()->getTerm()); ASSERT_EQUALS(-1, getTopoCoord().getCurrentPrimaryIndex()); // same term, should not change - ReplicationMetadata metadata3; - metadata3.initialize(BSON(rpc::kReplicationMetadataFieldName << BSON( - "lastOpCommittedTimestamp" - << Timestamp(11, 0) << "lastOpCommittedTerm" << 3 - << "configVersion" << 2 << "primaryIndex" << 1 << "term" << 3))); - getReplCoord()->processReplicationMetadata(metadata3); + StatusWith<rpc::ReplSetMetadata> metadata3 = rpc::ReplSetMetadata::readFromMetadata(BSON( + rpc::kReplSetMetadataFieldName << BSON( + "lastOpCommitted" << BSON("ts" << Timestamp(11, 0) << "term" << 3) << "lastOpVisible" + << BSON("ts" << Timestamp(11, 0) << "term" << 3) << "configVersion" + << 2 << "primaryIndex" << 1 << "term" << 3))); + getReplCoord()->processReplSetMetadata(metadata3.getValue()); ASSERT_EQUALS(OpTime(Timestamp(11, 0), 3), getReplCoord()->getLastCommittedOpTime()); ASSERT_EQUALS(3, getReplCoord()->getTerm()); ASSERT_EQUALS(-1, getTopoCoord().getCurrentPrimaryIndex()); diff --git a/src/mongo/db/repl/replication_coordinator_mock.cpp b/src/mongo/db/repl/replication_coordinator_mock.cpp index 2448657d0be..21f1dc47748 100644 --- a/src/mongo/db/repl/replication_coordinator_mock.cpp +++ b/src/mongo/db/repl/replication_coordinator_mock.cpp @@ -205,8 +205,7 @@ void ReplicationCoordinatorMock::processReplSetGetConfig(BSONObjBuilder* result) // TODO } -void ReplicationCoordinatorMock::processReplicationMetadata( - const ReplicationMetadata& replMetadata) {} +void ReplicationCoordinatorMock::processReplSetMetadata(const rpc::ReplSetMetadata& replMetadata) {} Status ReplicationCoordinatorMock::processReplSetGetStatus(BSONObjBuilder* result) { return Status::OK(); diff --git a/src/mongo/db/repl/replication_coordinator_mock.h b/src/mongo/db/repl/replication_coordinator_mock.h index 224bf38f0e2..cbdf4192d37 100644 --- a/src/mongo/db/repl/replication_coordinator_mock.h +++ b/src/mongo/db/repl/replication_coordinator_mock.h @@ -131,7 +131,7 @@ public: virtual void processReplSetGetConfig(BSONObjBuilder* result); - virtual void processReplicationMetadata(const ReplicationMetadata& replMetadata); + virtual void processReplSetMetadata(const rpc::ReplSetMetadata& replMetadata); virtual Status setMaintenanceMode(bool activate); diff --git a/src/mongo/db/repl/replication_metadata.cpp b/src/mongo/db/repl/replication_metadata.cpp deleted file mode 100644 index 64922878a66..00000000000 --- a/src/mongo/db/repl/replication_metadata.cpp +++ /dev/null @@ -1,100 +0,0 @@ -/** - * Copyright 2015 MongoDB Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - * As a special exception, the copyright holders give permission to link the - * code of portions of this program with the OpenSSL library under certain - * conditions as described in each individual source file and distribute - * linked combinations including the program with the OpenSSL library. You - * must comply with the GNU Affero General Public License in all respects for - * all of the code used other than as permitted herein. If you modify file(s) - * with this exception, you may extend this exception to your version of the - * file(s), but you are not obligated to do so. If you do not wish to do so, - * delete this exception statement from your version. If you delete this - * exception statement from all source files in the program, then also delete - * it in the license file. - */ - -#include "mongo/platform/basic.h" - -#include "mongo/db/repl/replication_metadata.h" - -#include "mongo/bson/util/bson_check.h" -#include "mongo/bson/util/bson_extract.h" -#include "mongo/db/jsobj.h" -#include "mongo/rpc/metadata.h" - -namespace mongo { -namespace repl { - -namespace { - -const std::string kLastOpCommittedTimestampFieldName = "lastOpCommittedTimestamp"; -const std::string kLastOpCommittedTermFieldName = "lastOpCommittedTerm"; -const std::string kConfigVersionFieldName = "configVersion"; -const std::string kPrimaryIndexFieldName = "primaryIndex"; -const std::string kTermFieldName = "term"; - -const std::string kLegalReplicationMetadataFieldNames[] = { - kLastOpCommittedTimestampFieldName, - kLastOpCommittedTermFieldName, - kConfigVersionFieldName, - kPrimaryIndexFieldName, - kTermFieldName, -}; - -} // namespace - -Status ReplicationMetadata::initialize(const BSONObj& metadataObj) { - BSONElement replMetadataElement; - - Status status = bsonExtractTypedField( - metadataObj, rpc::kReplicationMetadataFieldName, Object, &replMetadataElement); - if (!status.isOK()) - return status; - BSONObj replMetadataObj = replMetadataElement.Obj(); - - status = bsonCheckOnlyHasFields( - "ReplicationMetadata", replMetadataObj, kLegalReplicationMetadataFieldNames); - if (!status.isOK()) - return status; - - status = bsonExtractIntegerField(replMetadataObj, kConfigVersionFieldName, &_configVersion); - if (!status.isOK()) - return status; - - status = bsonExtractIntegerField(replMetadataObj, kPrimaryIndexFieldName, &_primaryIndex); - if (!status.isOK()) - return status; - - status = bsonExtractIntegerField(replMetadataObj, kTermFieldName, &_term); - if (!status.isOK()) - return status; - - // extracting the lastOpCommitted is a bit of a process - Timestamp ts; - status = bsonExtractTimestampField(replMetadataObj, kLastOpCommittedTimestampFieldName, &ts); - if (!status.isOK()) - return status; - long long term; - status = bsonExtractIntegerField(replMetadataObj, kLastOpCommittedTermFieldName, &term); - if (!status.isOK()) - return status; - _lastOpCommitted = OpTime(ts, term); - - return Status::OK(); -} - -} // namespace repl -} // namespace mongo diff --git a/src/mongo/db/repl/replication_metadata.h b/src/mongo/db/repl/replication_metadata.h deleted file mode 100644 index c068cbe401d..00000000000 --- a/src/mongo/db/repl/replication_metadata.h +++ /dev/null @@ -1,86 +0,0 @@ -/** - * Copyright (C) 2015 MongoDB Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License, version 3, - * as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - * As a special exception, the copyright holders give permission to link the - * code of portions of this program with the OpenSSL library under certain - * conditions as described in each individual source file and distribute - * linked combinations including the program with the OpenSSL library. You - * must comply with the GNU Affero General Public License in all respects for - * all of the code used other than as permitted herein. If you modify file(s) - * with this exception, you may extend this exception to your version of the - * file(s), but you are not obligated to do so. If you do not wish to do so, - * delete this exception statement from your version. If you delete this - * exception statement from all source files in the program, then also delete - * it in the license file. - */ - -#pragma once - -#include "mongo/db/repl/optime.h" - -namespace mongo { - -class BSONObj; -class Status; - -namespace repl { - -/** - * Metadata returned when ReplicationMetadata is requested. - */ -class ReplicationMetadata { -public: - /** - * Initializes this ReplicationMetadata from the contents of args. - */ - Status initialize(const BSONObj& metadataObj); - - /** - * Returns the OpTime of the most recently committed op of which the sender was aware. - */ - OpTime getLastOpCommitted() const { - return _lastOpCommitted; - } - - /** - * Returns the ReplSetConfig version number of the sender. - */ - long long getConfigVersion() const { - return _configVersion; - } - - /** - * Returns the index of the current primary from the perspective of the sender. - */ - long long getPrimaryIndex() const { - return _primaryIndex; - } - - /** - * Returns the current term from the perspective of the sender. - */ - long long getTerm() const { - return _term; - } - -private: - OpTime _lastOpCommitted; - long long _configVersion = -1; - long long _primaryIndex = -1; - long long _term = -1; -}; - -} // namespace repl -} // namespace mongo diff --git a/src/mongo/db/repl/topology_coordinator_impl.cpp b/src/mongo/db/repl/topology_coordinator_impl.cpp index 1988cda800c..b9f037e8df8 100644 --- a/src/mongo/db/repl/topology_coordinator_impl.cpp +++ b/src/mongo/db/repl/topology_coordinator_impl.cpp @@ -2161,8 +2161,12 @@ bool TopologyCoordinatorImpl::shouldChangeSyncSource(const HostAndPort& currentS void TopologyCoordinatorImpl::prepareReplResponseMetadata(rpc::ReplSetMetadata* metadata, const OpTime& lastCommittedOpTime) const { - *metadata = rpc::ReplSetMetadata( - _term, lastCommittedOpTime, _rsConfig.getConfigVersion(), _currentPrimaryIndex); + // TODO(dannenberg): change the third arg to be the lastOpTimeVisible. + *metadata = rpc::ReplSetMetadata(_term, + lastCommittedOpTime, + lastCommittedOpTime, + _rsConfig.getConfigVersion(), + _currentPrimaryIndex); } void TopologyCoordinatorImpl::summarizeAsHtml(ReplSetHtmlSummary* output) { diff --git a/src/mongo/rpc/metadata.cpp b/src/mongo/rpc/metadata.cpp index 74d511d5d4e..30b435e2872 100644 --- a/src/mongo/rpc/metadata.cpp +++ b/src/mongo/rpc/metadata.cpp @@ -39,8 +39,6 @@ namespace mongo { namespace rpc { -const char kReplicationMetadataFieldName[] = "$replData"; - BSONObj makeEmptyMetadata() { return BSONObj(); } diff --git a/src/mongo/rpc/metadata.h b/src/mongo/rpc/metadata.h index 04cc1606d3e..c2160516d4c 100644 --- a/src/mongo/rpc/metadata.h +++ b/src/mongo/rpc/metadata.h @@ -57,8 +57,6 @@ class OperationContext; */ namespace rpc { -extern const char kReplicationMetadataFieldName[]; - /** * Returns an empty metadata object. */ diff --git a/src/mongo/rpc/metadata/repl_set_metadata.cpp b/src/mongo/rpc/metadata/repl_set_metadata.cpp index d275dc833da..66780b50633 100644 --- a/src/mongo/rpc/metadata/repl_set_metadata.cpp +++ b/src/mongo/rpc/metadata/repl_set_metadata.cpp @@ -28,6 +28,7 @@ #include "mongo/rpc/metadata/repl_set_metadata.h" +#include "mongo/bson/util/bson_check.h" #include "mongo/bson/util/bson_extract.h" #include "mongo/db/jsobj.h" #include "mongo/rpc/metadata.h" @@ -37,81 +38,88 @@ namespace rpc { using repl::OpTime; +const char kReplSetMetadataFieldName[] = "$replData"; + namespace { -const char kTermField[] = "term"; -const char kLastCommittedTSField[] = "lastOpCommittedTimestamp"; -const char kLastCommittedTermField[] = "lastOpCommittedTerm"; -const char kLastCommittedConfigVersionField[] = "configVersion"; -const char kLastCommittedPrimaryIndexField[] = "primaryIndex"; +const char kLastOpCommittedFieldName[] = "lastOpCommitted"; +const char kLastOpVisibleFieldName[] = "lastOpVisible"; +const char kConfigVersionFieldName[] = "configVersion"; +const char kPrimaryIndexFieldName[] = "primaryIndex"; +const char kTimestampFieldName[] = "ts"; +const char kTermFieldName[] = "term"; } // unnamed namespace -ReplSetMetadata::ReplSetMetadata() = default; - ReplSetMetadata::ReplSetMetadata(long long term, OpTime committedOpTime, + OpTime visibleOpTime, long long configVersion, int currentPrimaryIndex) - : _currentTerm(term), - _committedOpTime(std::move(committedOpTime)), + : _lastOpCommitted(std::move(committedOpTime)), + _lastOpVisible(std::move(visibleOpTime)), + _currentTerm(term), _configVersion(configVersion), _currentPrimaryIndex(currentPrimaryIndex) {} -StatusWith<ReplSetMetadata> ReplSetMetadata::readFromMetadata(const BSONObj& doc) { - long long term = 0; - auto termStatus = bsonExtractIntegerField(doc, kTermField, &term); - - if (!termStatus.isOK()) { - return termStatus; - } - - Timestamp timestamp; - auto timestampStatus = bsonExtractTimestampField(doc, kLastCommittedTSField, ×tamp); - - if (!timestampStatus.isOK()) { - return timestampStatus; - } - - long long termNumber = 0; - auto commtedTermStatus = bsonExtractIntegerField(doc, kLastCommittedTermField, &termNumber); - - if (!commtedTermStatus.isOK()) { - return commtedTermStatus; - } - - long long configVersion = 0; - auto configVersionStatus = - bsonExtractIntegerField(doc, kLastCommittedConfigVersionField, &configVersion); +StatusWith<ReplSetMetadata> ReplSetMetadata::readFromMetadata(const BSONObj& metadataObj) { + BSONElement replMetadataElement; + + Status status = bsonExtractTypedField( + metadataObj, rpc::kReplSetMetadataFieldName, Object, &replMetadataElement); + if (!status.isOK()) + return status; + BSONObj replMetadataObj = replMetadataElement.Obj(); + + long long configVersion; + status = bsonExtractIntegerField(replMetadataObj, kConfigVersionFieldName, &configVersion); + if (!status.isOK()) + return status; + + long long primaryIndex; + status = bsonExtractIntegerField(replMetadataObj, kPrimaryIndexFieldName, &primaryIndex); + if (!status.isOK()) + return status; + + long long term; + status = bsonExtractIntegerField(replMetadataObj, kTermFieldName, &term); + if (!status.isOK()) + return status; + + repl::OpTime lastOpCommitted; + status = bsonExtractOpTimeField(replMetadataObj, kLastOpCommittedFieldName, &lastOpCommitted); + if (!status.isOK()) + return status; + + repl::OpTime lastOpVisible; + status = bsonExtractOpTimeField(replMetadataObj, kLastOpVisibleFieldName, &lastOpVisible); + if (!status.isOK()) + return status; + + return ReplSetMetadata(term, lastOpCommitted, lastOpVisible, configVersion, primaryIndex); +} - if (!configVersionStatus.isOK()) { - return configVersionStatus; - } +Status ReplSetMetadata::writeToMetadata(BSONObjBuilder* builder) const { + BSONObjBuilder replMetadataBuilder(builder->subobjStart(kReplSetMetadataFieldName)); + replMetadataBuilder.append(kTermFieldName, _currentTerm); - long long primaryIndex = 0; - auto primaryIndexStatus = - bsonExtractIntegerField(doc, kLastCommittedPrimaryIndexField, &primaryIndex); + BSONObjBuilder lastOpCommittedBuilder( + replMetadataBuilder.subobjStart(kLastOpCommittedFieldName)); + lastOpCommittedBuilder.append(kTimestampFieldName, _lastOpCommitted.getTimestamp()); + lastOpCommittedBuilder.append(kTermFieldName, _lastOpCommitted.getTerm()); + lastOpCommittedBuilder.doneFast(); - if (!primaryIndexStatus.isOK()) { - return primaryIndexStatus; - } + BSONObjBuilder lastOpVisibleBuilder(replMetadataBuilder.subobjStart(kLastOpVisibleFieldName)); + lastOpVisibleBuilder.append(kTimestampFieldName, _lastOpVisible.getTimestamp()); + lastOpVisibleBuilder.append(kTermFieldName, _lastOpVisible.getTerm()); + lastOpVisibleBuilder.doneFast(); - return ReplSetMetadata(term, OpTime(timestamp, termNumber), configVersion, primaryIndex); -} - -Status ReplSetMetadata::writeToMetadata(BSONObjBuilder* builder) const { - builder->append(kTermField, _currentTerm); - builder->append(kLastCommittedTSField, _committedOpTime.getTimestamp()); - builder->append(kLastCommittedTermField, _committedOpTime.getTerm()); - builder->append(kLastCommittedConfigVersionField, _configVersion); - builder->append(kLastCommittedPrimaryIndexField, _currentPrimaryIndex); + replMetadataBuilder.append(kConfigVersionFieldName, _configVersion); + replMetadataBuilder.append(kPrimaryIndexFieldName, _currentPrimaryIndex); + replMetadataBuilder.doneFast(); return Status::OK(); } -const OpTime& ReplSetMetadata::getLastCommittedOptime() const { - return _committedOpTime; -} - } // namespace rpc } // namespace mongo diff --git a/src/mongo/rpc/metadata/repl_set_metadata.h b/src/mongo/rpc/metadata/repl_set_metadata.h index bf34efb9dc7..c96cd14487a 100644 --- a/src/mongo/rpc/metadata/repl_set_metadata.h +++ b/src/mongo/rpc/metadata/repl_set_metadata.h @@ -37,14 +37,17 @@ class BSONObjBuilder; namespace rpc { +extern const char kReplSetMetadataFieldName[]; + /** * Represents the metadata information for $replData. */ class ReplSetMetadata { public: - ReplSetMetadata(); + ReplSetMetadata() = default; ReplSetMetadata(long long term, repl::OpTime committedOpTime, + repl::OpTime visibleOpTime, long long configVersion, int currentPrimaryIndex); @@ -52,8 +55,8 @@ public: * format: * { * term: 0, - * lastOpCommittedTimestamp: 0, - * lastOpCommittedTerm: 0, + * lastOpCommitted: {ts: Timestamp(0, 0), term: 0} + * lastOpVisible: {ts: Timestamp(0, 0), term: 0} * configVersion: 0, * primaryIndex: 0 * } @@ -61,13 +64,49 @@ public: static StatusWith<ReplSetMetadata> readFromMetadata(const BSONObj& doc); Status writeToMetadata(BSONObjBuilder* builder) const; - const repl::OpTime& getLastCommittedOptime() const; + /** + * Returns the OpTime of the most recent operation with which the client intereacted. + */ + repl::OpTime getLastOpVisible() const { + return _lastOpVisible; + } + + /** + * Returns the OpTime of the most recently committed op of which the sender was aware. + */ + repl::OpTime getLastOpCommitted() const { + return _lastOpCommitted; + } + + /** + * Returns the ReplSetConfig version number of the sender. + */ + long long getConfigVersion() const { + return _configVersion; + } + + /** + * Returns the index of the current primary from the perspective of the sender. + */ + long long getPrimaryIndex() const { + return _currentPrimaryIndex; + } + + /** + * Returns the current term from the perspective of the sender. + */ + long long getTerm() const { + return _currentTerm; + } private: - long long _currentTerm = 0; - repl::OpTime _committedOpTime; - long long _configVersion = 0; - int _currentPrimaryIndex = 0; + repl::OpTime _lastOpCommitted = + repl::OpTime(Timestamp(0, 0), repl::OpTime::kProtocolVersionV0Term); + repl::OpTime _lastOpVisible = + repl::OpTime(Timestamp(0, 0), repl::OpTime::kProtocolVersionV0Term); + long long _currentTerm = -1; + long long _configVersion = -1; + int _currentPrimaryIndex = -1; }; } // namespace rpc diff --git a/src/mongo/rpc/metadata/repl_set_metadata_test.cpp b/src/mongo/rpc/metadata/repl_set_metadata_test.cpp index 90e197978fc..82bff1f0209 100644 --- a/src/mongo/rpc/metadata/repl_set_metadata_test.cpp +++ b/src/mongo/rpc/metadata/repl_set_metadata_test.cpp @@ -38,16 +38,22 @@ using repl::OpTime; TEST(ReplResponseMetadataTest, Roundtrip) { OpTime opTime(Timestamp(1234, 100), 5); - ReplSetMetadata metadata(3, opTime, 6, 12); + OpTime opTime2(Timestamp(7777, 100), 6); + ReplSetMetadata metadata(3, opTime, opTime2, 6, 12); - ASSERT_EQ(opTime, metadata.getLastCommittedOptime()); + ASSERT_EQ(opTime, metadata.getLastOpCommitted()); + ASSERT_EQ(opTime2, metadata.getLastOpVisible()); BSONObjBuilder builder; metadata.writeToMetadata(&builder); - BSONObj expectedObj(BSON("term" << 3 << "lastOpCommittedTimestamp" << opTime.getTimestamp() - << "lastOpCommittedTerm" << opTime.getTerm() << "configVersion" - << 6 << "primaryIndex" << 12)); + BSONObj expectedObj( + BSON(kReplSetMetadataFieldName + << BSON("term" << 3 << "lastOpCommitted" + << BSON("ts" << opTime.getTimestamp() << "term" << opTime.getTerm()) + << "lastOpVisible" + << BSON("ts" << opTime2.getTimestamp() << "term" << opTime2.getTerm()) + << "configVersion" << 6 << "primaryIndex" << 12))); BSONObj serializedObj = builder.obj(); ASSERT_EQ(expectedObj, serializedObj); @@ -56,7 +62,8 @@ TEST(ReplResponseMetadataTest, Roundtrip) { ASSERT_OK(cloneStatus.getStatus()); const auto& clonedMetadata = cloneStatus.getValue(); - ASSERT_EQ(opTime, clonedMetadata.getLastCommittedOptime()); + ASSERT_EQ(opTime, clonedMetadata.getLastOpCommitted()); + ASSERT_EQ(opTime2, clonedMetadata.getLastOpVisible()); BSONObjBuilder clonedBuilder; clonedMetadata.writeToMetadata(&clonedBuilder); diff --git a/src/mongo/s/catalog/dist_lock_catalog_impl.cpp b/src/mongo/s/catalog/dist_lock_catalog_impl.cpp index fbfe5e0d34e..432b96494a5 100644 --- a/src/mongo/s/catalog/dist_lock_catalog_impl.cpp +++ b/src/mongo/s/catalog/dist_lock_catalog_impl.cpp @@ -41,7 +41,7 @@ #include "mongo/db/query/find_and_modify_request.h" #include "mongo/db/repl/read_concern_args.h" #include "mongo/rpc/get_status_from_command_result.h" -#include "mongo/rpc/metadata.h" +#include "mongo/rpc/metadata/repl_set_metadata.h" #include "mongo/rpc/metadata/sharding_metadata.h" #include "mongo/s/catalog/type_lockpings.h" #include "mongo/s/catalog/type_locks.h" @@ -59,7 +59,7 @@ namespace { const char kCmdResponseWriteConcernField[] = "writeConcernError"; const char kFindAndModifyResponseResultDocField[] = "value"; const char kLocalTimeField[] = "localTime"; -const BSONObj kReplMetadata = BSON(rpc::kReplicationMetadataFieldName << 1); +const BSONObj kReplMetadata = BSON(rpc::kReplSetMetadataFieldName << 1); const ReadPreferenceSetting kReadPref(ReadPreference::PrimaryOnly, TagSet()); /** diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp index b726d8d1689..6b14ca34876 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp @@ -48,7 +48,7 @@ #include "mongo/db/repl/read_concern_args.h" #include "mongo/executor/network_interface.h" #include "mongo/rpc/get_status_from_command_result.h" -#include "mongo/rpc/metadata.h" +#include "mongo/rpc/metadata/repl_set_metadata.h" #include "mongo/s/catalog/config_server_version.h" #include "mongo/s/catalog/dist_lock_manager.h" #include "mongo/s/catalog/type_actionlog.h" @@ -92,7 +92,7 @@ namespace { const ReadPreferenceSetting kConfigReadSelector(ReadPreference::PrimaryOnly, TagSet{}); const ReadPreferenceSetting kConfigPrimaryPreferredSelector(ReadPreference::PrimaryPreferred, TagSet{}); -const BSONObj kReplMetadata(BSON(rpc::kReplicationMetadataFieldName << 1)); +const BSONObj kReplMetadata(BSON(rpc::kReplSetMetadataFieldName << 1)); const int kInitialSSVRetries = 3; const int kActionLogCollectionSize = 1024 * 1024 * 2; const int kChangeLogCollectionSize = 1024 * 1024 * 10; @@ -1125,6 +1125,7 @@ bool CatalogManagerReplicaSet::_runReadCommand(const std::string& dbname, auto resultStatus = _runCommandOnConfig(target.getValue(), dbname, cmdObj); if (!resultStatus.isOK()) { + log() << "DANNENPRINT: " << resultStatus.getStatus(); return Command::appendCommandStatus(*result, resultStatus.getStatus()); } diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set_add_shard_test.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set_add_shard_test.cpp index bd7b874ee1b..bdd15bc299e 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set_add_shard_test.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set_add_shard_test.cpp @@ -36,6 +36,7 @@ #include "mongo/client/remote_command_targeter_factory_mock.h" #include "mongo/db/commands.h" #include "mongo/db/query/lite_parsed_query.h" +#include "mongo/rpc/metadata/repl_set_metadata.h" #include "mongo/s/catalog/replset/catalog_manager_replica_set.h" #include "mongo/s/catalog/replset/catalog_manager_replica_set_test_fixture.h" #include "mongo/s/catalog/type_changelog.h" @@ -122,7 +123,7 @@ protected: const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), DatabaseType::ConfigNS); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BatchedUpdateRequest actualBatchedUpdate; std::string errmsg; @@ -214,7 +215,7 @@ TEST_F(AddShardTest, AddShardStandalone) { // in the previous call, in the config server metadata onFindCommand([&](const RemoteCommandRequest& request) { ASSERT_EQ(request.target, configHost); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.toString(), DatabaseType::ConfigNS); @@ -232,7 +233,7 @@ TEST_F(AddShardTest, AddShardStandalone) { onFindCommand([this](const RemoteCommandRequest& request) { const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.toString(), DatabaseType::ConfigNS); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); auto query = assertGet(LiteParsedQuery::makeFromFindCommand(nss, request.cmdObj, false)); @@ -328,7 +329,7 @@ TEST_F(AddShardTest, AddShardStandaloneGenerateName) { // in the previous call, in the config server metadata onFindCommand([&](const RemoteCommandRequest& request) { ASSERT_EQ(request.target, configHost); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.toString(), DatabaseType::ConfigNS); @@ -344,7 +345,7 @@ TEST_F(AddShardTest, AddShardStandaloneGenerateName) { }); onFindCommand([this](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.toString(), DatabaseType::ConfigNS); @@ -365,7 +366,7 @@ TEST_F(AddShardTest, AddShardStandaloneGenerateName) { // New name is being generated for the new shard onFindCommand([this, &existingShard](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.toString(), ShardType::ConfigNS); auto query = assertGet(LiteParsedQuery::makeFromFindCommand(nss, request.cmdObj, false)); diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set_drop_coll_test.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set_drop_coll_test.cpp index d168b62edd0..e2af5b8393f 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set_drop_coll_test.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set_drop_coll_test.cpp @@ -34,6 +34,7 @@ #include "mongo/client/remote_command_targeter_mock.h" #include "mongo/db/namespace_string.h" #include "mongo/db/query/lite_parsed_query.h" +#include "mongo/rpc/metadata/repl_set_metadata.h" #include "mongo/s/catalog/dist_lock_manager_mock.h" #include "mongo/s/catalog/replset/catalog_manager_replica_set.h" #include "mongo/s/catalog/replset/catalog_manager_replica_set_test_fixture.h" @@ -100,11 +101,11 @@ public: void expectRemoveChunksAndMarkCollectionDropped() { onCommand([this](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); ASSERT_EQ(_configHost, request.target); ASSERT_EQ("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BSONObj expectedCmd(fromjson(R"({ delete: "chunks", diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set_log_action_test.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set_log_action_test.cpp index cbb0ded71d6..02e90693671 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set_log_action_test.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set_log_action_test.cpp @@ -34,6 +34,7 @@ #include "mongo/db/commands.h" #include "mongo/executor/network_interface_mock.h" #include "mongo/executor/task_executor.h" +#include "mongo/rpc/metadata/repl_set_metadata.h" #include "mongo/s/catalog/replset/catalog_manager_replica_set.h" #include "mongo/s/catalog/replset/catalog_manager_replica_set_test_fixture.h" #include "mongo/s/catalog/type_actionlog.h" @@ -61,7 +62,7 @@ public: onCommand([&response](const RemoteCommandRequest& request) { ASSERT_EQUALS("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BSONObj expectedCreateCmd = BSON("create" << ActionLogType::ConfigNS << "capped" << true << "size" << 1024 * 1024 * 2); @@ -75,7 +76,7 @@ public: onCommand([&expectedActionLog](const RemoteCommandRequest& request) { ASSERT_EQUALS("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BatchedInsertRequest actualBatchedInsert; std::string errmsg; diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set_remove_shard_test.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set_remove_shard_test.cpp index 74245c53fa0..4794eabe0e4 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set_remove_shard_test.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set_remove_shard_test.cpp @@ -37,6 +37,7 @@ #include "mongo/db/commands.h" #include "mongo/executor/network_interface_mock.h" #include "mongo/executor/task_executor.h" +#include "mongo/rpc/metadata/repl_set_metadata.h" #include "mongo/s/catalog/replset/catalog_manager_replica_set.h" #include "mongo/s/catalog/replset/catalog_manager_replica_set_test_fixture.h" #include "mongo/s/catalog/type_chunk.h" @@ -146,7 +147,7 @@ TEST_F(RemoveShardTest, RemoveShardStartDraining) { ASSERT_EQUALS(configHost, request.target); ASSERT_EQUALS("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BatchedUpdateRequest actualBatchedUpdate; std::string errmsg; @@ -171,7 +172,7 @@ TEST_F(RemoveShardTest, RemoveShardStartDraining) { // Respond to request to reload information about existing shards onFindCommand([&](const RemoteCommandRequest& request) { ASSERT_EQUALS(configHost, request.target); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); auto query = assertGet(LiteParsedQuery::makeFromFindCommand(nss, request.cmdObj, false)); @@ -324,7 +325,7 @@ TEST_F(RemoveShardTest, RemoveShardCompletion) { ASSERT_EQUALS(configHost, request.target); ASSERT_EQUALS("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BatchedDeleteRequest actualBatchedDelete; std::string errmsg; @@ -347,7 +348,7 @@ TEST_F(RemoveShardTest, RemoveShardCompletion) { // Respond to request to reload information about existing shards onFindCommand([&](const RemoteCommandRequest& request) { ASSERT_EQUALS(configHost, request.target); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); auto query = assertGet(LiteParsedQuery::makeFromFindCommand(nss, request.cmdObj, false)); diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set_shard_collection_test.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set_shard_collection_test.cpp index 98d144fc961..64788d58b38 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set_shard_collection_test.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set_shard_collection_test.cpp @@ -38,6 +38,7 @@ #include "mongo/db/commands.h" #include "mongo/executor/network_interface_mock.h" #include "mongo/executor/task_executor.h" +#include "mongo/rpc/metadata/repl_set_metadata.h" #include "mongo/s/catalog/dist_lock_manager_mock.h" #include "mongo/s/catalog/replset/catalog_manager_replica_set.h" #include "mongo/s/catalog/replset/catalog_manager_replica_set_test_fixture.h" @@ -80,7 +81,7 @@ public: void expectGetDatabase(const DatabaseType& expectedDb) { onFindCommand([&](const RemoteCommandRequest& request) { ASSERT_EQUALS(configHost, request.target); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(DatabaseType::ConfigNS, nss.ns()); @@ -109,7 +110,7 @@ public: ASSERT_EQUALS(configHost, request.target); ASSERT_EQUALS("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BatchedUpdateRequest actualBatchedUpdate; std::string errmsg; @@ -150,7 +151,7 @@ public: void expectReloadChunks(const std::string& ns, const vector<ChunkType>& chunks) { onFindCommand([&](const RemoteCommandRequest& request) { ASSERT_EQUALS(configHost, request.target); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), ChunkType::ConfigNS); @@ -183,7 +184,7 @@ public: ASSERT_EQUALS(configHost, request.target); ASSERT_EQUALS("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BatchedUpdateRequest actualBatchedUpdate; std::string errmsg; @@ -210,7 +211,7 @@ public: void expectReloadCollection(const CollectionType& collection) { onFindCommand([&](const RemoteCommandRequest& request) { ASSERT_EQUALS(configHost, request.target); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), CollectionType::ConfigNS); @@ -236,7 +237,7 @@ public: void expectLoadNewestChunk(const string& ns, const ChunkType& chunk) { onFindCommand([&](const RemoteCommandRequest& request) { ASSERT_EQUALS(configHost, request.target); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), ChunkType::ConfigNS); diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set_test.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set_test.cpp index 9473bd7e26c..1dc3b907536 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set_test.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set_test.cpp @@ -87,7 +87,7 @@ TEST_F(CatalogManagerReplSetTest, GetCollectionExisting) { }); onFindCommand([this, &expectedColl](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), CollectionType::ConfigNS); @@ -140,7 +140,7 @@ TEST_F(CatalogManagerReplSetTest, GetDatabaseExisting) { const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), DatabaseType::ConfigNS); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); auto query = assertGet(LiteParsedQuery::makeFromFindCommand(nss, request.cmdObj, false)); @@ -306,7 +306,7 @@ TEST_F(CatalogManagerReplSetTest, GetAllShardsValid) { }); onFindCommand([this, &s1, &s2, &s3](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), ShardType::ConfigNS); @@ -396,7 +396,7 @@ TEST_F(CatalogManagerReplSetTest, GetChunksForNSWithSortAndLimit) { }); onFindCommand([this, &chunksQuery, chunkA, chunkB](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), ChunkType::ConfigNS); @@ -438,7 +438,7 @@ TEST_F(CatalogManagerReplSetTest, GetChunksForNSNoSortNoLimit) { }); onFindCommand([this, &chunksQuery](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), ChunkType::ConfigNS); @@ -515,7 +515,7 @@ TEST_F(CatalogManagerReplSetTest, RunUserManagementReadCommand) { }); onCommand([](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); ASSERT_EQUALS("test", request.dbname); ASSERT_EQUALS(BSON("usersInfo" << 1), request.cmdObj); @@ -596,7 +596,7 @@ TEST_F(CatalogManagerReplSetTest, RunUserManagementWriteCommandSuccess) { << "test"), request.cmdObj); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BSONObjBuilder responseBuilder; Command::appendCommandStatus(responseBuilder, @@ -696,7 +696,7 @@ TEST_F(CatalogManagerReplSetTest, RunUserManagementWriteCommandNotMasterRetrySuc << "test"), request.cmdObj); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); return BSON("ok" << 1); }); @@ -718,7 +718,7 @@ TEST_F(CatalogManagerReplSetTest, GetGlobalSettingsBalancerDoc) { }); onFindCommand([this, st1](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), SettingsType::ConfigNS); @@ -750,7 +750,7 @@ TEST_F(CatalogManagerReplSetTest, GetGlobalSettingsChunkSizeDoc) { }); onFindCommand([this, st1](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), SettingsType::ConfigNS); @@ -779,7 +779,7 @@ TEST_F(CatalogManagerReplSetTest, GetGlobalSettingsInvalidDoc) { }); onFindCommand([this](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), SettingsType::ConfigNS); @@ -811,7 +811,7 @@ TEST_F(CatalogManagerReplSetTest, GetGlobalSettingsNonExistent) { }); onFindCommand([this](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), SettingsType::ConfigNS); @@ -866,7 +866,7 @@ TEST_F(CatalogManagerReplSetTest, GetCollectionsValidResultsNoDb) { }); onFindCommand([this, coll1, coll2, coll3](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), CollectionType::ConfigNS); @@ -917,7 +917,7 @@ TEST_F(CatalogManagerReplSetTest, GetCollectionsValidResultsWithDb) { }); onFindCommand([this, coll1, coll2](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), CollectionType::ConfigNS); @@ -967,7 +967,7 @@ TEST_F(CatalogManagerReplSetTest, GetCollectionsInvalidCollectionType) { const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), CollectionType::ConfigNS); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); auto query = assertGet(LiteParsedQuery::makeFromFindCommand(nss, request.cmdObj, false)); @@ -1009,7 +1009,7 @@ TEST_F(CatalogManagerReplSetTest, GetDatabasesForShardValid) { }); onFindCommand([this, dbt1, dbt2](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), DatabaseType::ConfigNS); @@ -1081,7 +1081,7 @@ TEST_F(CatalogManagerReplSetTest, GetTagsForCollection) { }); onFindCommand([this, tagA, tagB](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), TagsType::ConfigNS); @@ -1165,7 +1165,7 @@ TEST_F(CatalogManagerReplSetTest, GetTagForChunkOneTagFound) { [this, chunk] { return assertGet(catalogManager()->getTagForChunk("test.coll", chunk)); }); onFindCommand([this, chunk](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), TagsType::ConfigNS); @@ -1209,7 +1209,7 @@ TEST_F(CatalogManagerReplSetTest, GetTagForChunkNoTagFound) { [this, chunk] { return assertGet(catalogManager()->getTagForChunk("test.coll", chunk)); }); onFindCommand([this, chunk](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), TagsType::ConfigNS); @@ -1250,7 +1250,7 @@ TEST_F(CatalogManagerReplSetTest, GetTagForChunkInvalidTagDoc) { }); onFindCommand([this, chunk](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(nss.ns(), TagsType::ConfigNS); @@ -1289,7 +1289,7 @@ TEST_F(CatalogManagerReplSetTest, UpdateDatabase) { onCommand([dbt](const RemoteCommandRequest& request) { ASSERT_EQUALS("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BatchedUpdateRequest actualBatchedUpdate; std::string errmsg; @@ -1364,7 +1364,7 @@ TEST_F(CatalogManagerReplSetTest, ApplyChunkOpsDeprecated) { onCommand([updateOps, preCondition](const RemoteCommandRequest& request) { ASSERT_EQUALS("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); ASSERT_EQUALS(updateOps, request.cmdObj["applyOps"].Obj()); ASSERT_EQUALS(preCondition, request.cmdObj["preCondition"].Obj()); @@ -1398,7 +1398,7 @@ TEST_F(CatalogManagerReplSetTest, ApplyChunkOpsDeprecatedCommandFailed) { ASSERT_EQUALS(updateOps, request.cmdObj["applyOps"].Obj()); ASSERT_EQUALS(preCondition, request.cmdObj["preCondition"].Obj()); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BSONObjBuilder responseBuilder; Command::appendCommandStatus(responseBuilder, @@ -1432,7 +1432,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseSuccess) { onFindCommand([&](const RemoteCommandRequest& request) { ASSERT_EQUALS(configHost, request.target); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); auto query = assertGet(LiteParsedQuery::makeFromFindCommand(nss, request.cmdObj, false)); @@ -1476,7 +1476,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseSuccess) { onFindCommand([&](const RemoteCommandRequest& request) { ASSERT_EQUALS(configHost, request.target); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); ASSERT_EQ(DatabaseType::ConfigNS, nss.ns()); checkReadConcern(request.cmdObj, Timestamp(0, 0), 0); return vector<BSONObj>{}; @@ -1525,7 +1525,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseSuccess) { ASSERT_EQUALS(configHost, request.target); ASSERT_EQUALS("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BatchedInsertRequest actualBatchedInsert; std::string errmsg; @@ -1591,7 +1591,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseDBExists) { }); onFindCommand([this, dbname](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); auto query = assertGet(LiteParsedQuery::makeFromFindCommand(nss, request.cmdObj, false)); @@ -1630,7 +1630,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseDBExistsDifferentCase) { }); onFindCommand([this, dbname, dbnameDiffCase](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); auto query = assertGet(LiteParsedQuery::makeFromFindCommand(nss, request.cmdObj, false)); @@ -1669,7 +1669,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseNoShards) { // Report no databases with the same name already exist onFindCommand([this, dbname](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(DatabaseType::ConfigNS, nss.ns()); checkReadConcern(request.cmdObj, Timestamp(0, 0), 0); @@ -1678,7 +1678,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseNoShards) { // Report no shards exist onFindCommand([this](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); auto query = assertGet(LiteParsedQuery::makeFromFindCommand(nss, request.cmdObj, false)); @@ -1717,7 +1717,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseDuplicateKeyOnInsert) { onFindCommand([&](const RemoteCommandRequest& request) { ASSERT_EQUALS(configHost, request.target); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); auto query = assertGet(LiteParsedQuery::makeFromFindCommand(nss, request.cmdObj, false)); @@ -1759,7 +1759,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseDuplicateKeyOnInsert) { // Report no databases with the same name already exist onFindCommand([&](const RemoteCommandRequest& request) { ASSERT_EQUALS(configHost, request.target); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(DatabaseType::ConfigNS, nss.ns()); checkReadConcern(request.cmdObj, Timestamp(0, 0), 0); @@ -1811,7 +1811,7 @@ TEST_F(CatalogManagerReplSetTest, createDatabaseDuplicateKeyOnInsert) { ASSERT_EQUALS("config", request.dbname); ASSERT_FALSE(request.cmdObj.hasField(repl::ReadConcernArgs::kReadConcernFieldName)); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BatchedInsertRequest actualBatchedInsert; std::string errmsg; @@ -1870,7 +1870,7 @@ TEST_F(CatalogManagerReplSetTest, EnableShardingNoDBExists) { // Query to find if db already exists in config. onFindCommand([this](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); const NamespaceString nss(request.dbname, request.cmdObj.firstElement().String()); ASSERT_EQ(DatabaseType::ConfigNS, nss.toString()); @@ -1909,7 +1909,7 @@ TEST_F(CatalogManagerReplSetTest, EnableShardingNoDBExists) { ASSERT_EQ(HostAndPort("config:123"), request.target); ASSERT_EQ("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BSONObj expectedCmd(fromjson(R"({ update: "databases", @@ -2006,7 +2006,7 @@ TEST_F(CatalogManagerReplSetTest, EnableShardingDBExists) { ASSERT_EQ(HostAndPort("config:123"), request.target); ASSERT_EQ("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BSONObj expectedCmd(fromjson(R"({ update: "databases", @@ -2101,16 +2101,14 @@ TEST_F(CatalogManagerReplSetTest, BasicReadAfterOpTime) { onCommandWithMetadata([this, &newOpTime, &lastOpTime](const RemoteCommandRequest& request) { ASSERT_EQUALS("test", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); ASSERT_EQ(string("dummy"), request.cmdObj.firstElementFieldName()); checkReadConcern(request.cmdObj, lastOpTime.getTimestamp(), lastOpTime.getTerm()); - ReplSetMetadata metadata(12, newOpTime, 100, 3); + ReplSetMetadata metadata(12, newOpTime, repl::OpTime(), 100, 3); BSONObjBuilder builder; - BSONObjBuilder replBuilder(builder.subobjStart(rpc::kReplicationMetadataFieldName)); - metadata.writeToMetadata(&replBuilder); - replBuilder.done(); + metadata.writeToMetadata(&builder); return RemoteCommandResponse(BSON("ok" << 1), builder.obj(), Milliseconds(1)); }); @@ -2137,16 +2135,14 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeShouldNotGoBack) { onCommandWithMetadata([this, &newOpTime, &highestOpTime](const RemoteCommandRequest& request) { ASSERT_EQUALS("test", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); ASSERT_EQ(string("dummy"), request.cmdObj.firstElementFieldName()); checkReadConcern(request.cmdObj, highestOpTime.getTimestamp(), highestOpTime.getTerm()); - ReplSetMetadata metadata(12, newOpTime, 100, 3); + ReplSetMetadata metadata(12, newOpTime, repl::OpTime(), 100, 3); BSONObjBuilder builder; - BSONObjBuilder replBuilder(builder.subobjStart(rpc::kReplicationMetadataFieldName)); - metadata.writeToMetadata(&replBuilder); - replBuilder.done(); + metadata.writeToMetadata(&builder); return RemoteCommandResponse(BSON("ok" << 1), builder.obj(), Milliseconds(1)); }); @@ -2166,16 +2162,14 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeShouldNotGoBack) { onCommandWithMetadata([this, &oldOpTime, &highestOpTime](const RemoteCommandRequest& request) { ASSERT_EQUALS("test", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); ASSERT_EQ(string("dummy"), request.cmdObj.firstElementFieldName()); checkReadConcern(request.cmdObj, highestOpTime.getTimestamp(), highestOpTime.getTerm()); - ReplSetMetadata metadata(12, oldOpTime, 100, 3); + ReplSetMetadata metadata(12, oldOpTime, repl::OpTime(), 100, 3); BSONObjBuilder builder; - BSONObjBuilder replBuilder(builder.subobjStart(rpc::kReplicationMetadataFieldName)); - metadata.writeToMetadata(&replBuilder); - replBuilder.done(); + metadata.writeToMetadata(&builder); return RemoteCommandResponse(BSON("ok" << 1), builder.obj(), Milliseconds(1)); }); @@ -2191,16 +2185,14 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeShouldNotGoBack) { onCommandWithMetadata([this, &oldOpTime, &highestOpTime](const RemoteCommandRequest& request) { ASSERT_EQUALS("test", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); ASSERT_EQ(string("dummy"), request.cmdObj.firstElementFieldName()); checkReadConcern(request.cmdObj, highestOpTime.getTimestamp(), highestOpTime.getTerm()); - ReplSetMetadata metadata(12, oldOpTime, 100, 3); + ReplSetMetadata metadata(12, oldOpTime, repl::OpTime(), 100, 3); BSONObjBuilder builder; - BSONObjBuilder replBuilder(builder.subobjStart(rpc::kReplicationMetadataFieldName)); - metadata.writeToMetadata(&replBuilder); - replBuilder.done(); + metadata.writeToMetadata(&builder); return RemoteCommandResponse(BSON("ok" << 1), builder.obj(), Milliseconds(1)); }); @@ -2219,14 +2211,12 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeFindThenCmd) { onFindWithMetadataCommand( [this, &newOpTime, &highestOpTime](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); checkReadConcern(request.cmdObj, highestOpTime.getTimestamp(), highestOpTime.getTerm()); - ReplSetMetadata metadata(12, newOpTime, 100, 3); + ReplSetMetadata metadata(12, newOpTime, repl::OpTime(), 100, 3); BSONObjBuilder builder; - BSONObjBuilder replBuilder(builder.subobjStart(rpc::kReplicationMetadataFieldName)); - metadata.writeToMetadata(&replBuilder); - replBuilder.done(); + metadata.writeToMetadata(&builder); SettingsType settings; settings.setKey("chunksize"); @@ -2250,7 +2240,7 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeFindThenCmd) { onCommand([this, &oldOpTime, &highestOpTime](const RemoteCommandRequest& request) { ASSERT_EQUALS("test", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); ASSERT_EQ(string("dummy"), request.cmdObj.firstElementFieldName()); checkReadConcern(request.cmdObj, highestOpTime.getTimestamp(), highestOpTime.getTerm()); @@ -2276,16 +2266,14 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeCmdThenFind) { onCommandWithMetadata([this, &newOpTime, &highestOpTime](const RemoteCommandRequest& request) { ASSERT_EQUALS("test", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); ASSERT_EQ(string("dummy"), request.cmdObj.firstElementFieldName()); checkReadConcern(request.cmdObj, highestOpTime.getTimestamp(), highestOpTime.getTerm()); - ReplSetMetadata metadata(12, newOpTime, 100, 3); + ReplSetMetadata metadata(12, newOpTime, repl::OpTime(), 100, 3); BSONObjBuilder builder; - BSONObjBuilder replBuilder(builder.subobjStart(rpc::kReplicationMetadataFieldName)); - metadata.writeToMetadata(&replBuilder); - replBuilder.done(); + metadata.writeToMetadata(&builder); return RemoteCommandResponse(BSON("ok" << 1), builder.obj(), Milliseconds(1)); }); @@ -2301,7 +2289,7 @@ TEST_F(CatalogManagerReplSetTest, ReadAfterOpTimeCmdThenFind) { const repl::OpTime oldOpTime(Timestamp(3, 10), 5); onFindCommand([this, &oldOpTime, &highestOpTime](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); ASSERT_EQ(string("find"), request.cmdObj.firstElementFieldName()); checkReadConcern(request.cmdObj, highestOpTime.getTimestamp(), highestOpTime.getTerm()); diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set_test_fixture.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set_test_fixture.cpp index 36eb4bbac64..477006aaa2a 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set_test_fixture.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set_test_fixture.cpp @@ -44,6 +44,7 @@ #include "mongo/db/service_context_noop.h" #include "mongo/executor/network_interface_mock.h" #include "mongo/executor/thread_pool_task_executor_test_fixture.h" +#include "mongo/rpc/metadata/repl_set_metadata.h" #include "mongo/s/catalog/dist_lock_manager_mock.h" #include "mongo/s/catalog/replset/catalog_manager_replica_set.h" #include "mongo/s/catalog/type_changelog.h" @@ -325,7 +326,7 @@ void CatalogManagerReplSetTestFixture::expectUpdateCollection(const HostAndPort& const CollectionType& coll) { onCommand([&](const RemoteCommandRequest& request) { ASSERT_EQUALS(expectedHost, request.target); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); ASSERT_EQUALS("config", request.dbname); BatchedUpdateRequest actualBatchedUpdate; diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set_upgrade_test.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set_upgrade_test.cpp index 57d0694e5cb..f51c3010dd1 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set_upgrade_test.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set_upgrade_test.cpp @@ -32,6 +32,7 @@ #include "mongo/bson/json.h" #include "mongo/client/remote_command_targeter_mock.h" +#include "mongo/rpc/metadata/repl_set_metadata.h" #include "mongo/s/catalog/config_server_version.h" #include "mongo/s/catalog/replset/catalog_manager_replica_set.h" #include "mongo/s/catalog/replset/catalog_manager_replica_set_test_fixture.h" @@ -54,7 +55,7 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeNotNeeded) { auto future = launchAsync([this] { ASSERT_OK(catalogManager()->checkAndUpgrade(true)); }); onFindCommand([this](const RemoteCommandRequest& request) { - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); ASSERT_EQ(HostAndPort("config:123"), request.target); ASSERT_EQ("config", request.dbname); @@ -154,7 +155,7 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeNoVersionDocEmptyConfig) { ASSERT_EQ("admin", request.dbname); ASSERT_EQ(BSON("listDatabases" << 1), request.cmdObj); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); return fromjson(R"({ databases: [ @@ -169,7 +170,7 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeNoVersionDocEmptyConfig) { ASSERT_EQ(HostAndPort("config:123"), request.target); ASSERT_EQ("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BatchedUpdateRequest actualBatchedUpdate; std::string errmsg; @@ -217,7 +218,7 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeNoVersionDocEmptyConfigWithAdmin ASSERT_EQ("admin", request.dbname); ASSERT_EQ(BSON("listDatabases" << 1), request.cmdObj); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); return fromjson(R"({ databases: [ @@ -233,7 +234,7 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeNoVersionDocEmptyConfigWithAdmin ASSERT_EQ(HostAndPort("config:123"), request.target); ASSERT_EQ("config", request.dbname); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); BatchedUpdateRequest actualBatchedUpdate; std::string errmsg; @@ -266,7 +267,7 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeWriteError) { ASSERT_EQ("admin", request.dbname); ASSERT_EQ(BSON("listDatabases" << 1), request.cmdObj); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); return fromjson(R"({ databases: [ @@ -309,7 +310,7 @@ TEST_F(CatalogManagerReplSetTestFixture, UpgradeNoVersionDocNonEmptyConfigServer ASSERT_EQ("admin", request.dbname); ASSERT_EQ(BSON("listDatabases" << 1), request.cmdObj); - ASSERT_EQUALS(BSON(rpc::kReplicationMetadataFieldName << 1), request.metadata); + ASSERT_EQUALS(BSON(rpc::kReplSetMetadataFieldName << 1), request.metadata); return fromjson(R"({ databases: [ diff --git a/src/mongo/s/client/shard_registry.cpp b/src/mongo/s/client/shard_registry.cpp index 921849312ce..321e6d86de3 100644 --- a/src/mongo/s/client/shard_registry.cpp +++ b/src/mongo/s/client/shard_registry.cpp @@ -292,8 +292,9 @@ StatusWith<ShardRegistry::QueryResponse> ShardRegistry::exhaustiveFind( } auto& data = dataStatus.getValue(); - if (auto replField = data.otherFields.metadata[rpc::kReplicationMetadataFieldName]) { - auto replParseStatus = rpc::ReplSetMetadata::readFromMetadata(replField.Obj()); + if (data.otherFields.metadata.hasField(rpc::kReplSetMetadataFieldName)) { + auto replParseStatus = + rpc::ReplSetMetadata::readFromMetadata(data.otherFields.metadata); if (!replParseStatus.isOK()) { status = replParseStatus.getStatus(); @@ -301,7 +302,7 @@ StatusWith<ShardRegistry::QueryResponse> ShardRegistry::exhaustiveFind( return; } - response.opTime = replParseStatus.getValue().getLastCommittedOptime(); + response.opTime = replParseStatus.getValue().getLastOpCommitted(); } for (const BSONObj& doc : data.documents) { @@ -386,15 +387,15 @@ StatusWith<ShardRegistry::CommandResponse> ShardRegistry::runCommandWithMetadata CommandResponse cmdResponse; cmdResponse.response = response.data; - if (auto replField = response.metadata[rpc::kReplicationMetadataFieldName]) { - auto replParseStatus = rpc::ReplSetMetadata::readFromMetadata(replField.Obj()); + if (response.metadata.hasField(rpc::kReplSetMetadataFieldName)) { + auto replParseStatus = rpc::ReplSetMetadata::readFromMetadata(response.metadata); if (!replParseStatus.isOK()) { return replParseStatus.getStatus(); } // TODO: SERVER-19734 use config server snapshot time. - cmdResponse.opTime = replParseStatus.getValue().getLastCommittedOptime(); + cmdResponse.opTime = replParseStatus.getValue().getLastOpCommitted(); } return cmdResponse; |