summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormatt dannenberg <matt.dannenberg@10gen.com>2015-08-07 06:36:44 -0400
committermatt dannenberg <matt.dannenberg@10gen.com>2015-08-12 04:22:28 -0400
commit86a3e6352eb27fd2e6115299bcec5103a830fe36 (patch)
tree7f7f42491808e8c487e47a710deb445448d18a58
parent7bb09c0377f5160857617c38ab07955f8f4b03f6 (diff)
downloadmongo-86a3e6352eb27fd2e6115299bcec5103a830fe36.tar.gz
SERVER-19554 merge ReplSetMetadata and ReplicationMetadata
-rw-r--r--src/mongo/bson/util/SConscript2
-rw-r--r--src/mongo/bson/util/bson_extract.cpp26
-rw-r--r--src/mongo/bson/util/bson_extract.h15
-rw-r--r--src/mongo/bson/util/bson_extract_test.cpp28
-rw-r--r--src/mongo/db/repl/SConscript9
-rw-r--r--src/mongo/db/repl/data_replicator.cpp3
-rw-r--r--src/mongo/db/repl/read_concern_args.cpp30
-rw-r--r--src/mongo/db/repl/read_concern_args_test.cpp3
-rw-r--r--src/mongo/db/repl/repl_set_heartbeat_response.cpp12
-rw-r--r--src/mongo/db/repl/repl_set_request_votes_args.cpp11
-rw-r--r--src/mongo/db/repl/replication_coordinator.h6
-rw-r--r--src/mongo/db/repl/replication_coordinator_impl.cpp20
-rw-r--r--src/mongo/db/repl/replication_coordinator_impl.h10
-rw-r--r--src/mongo/db/repl/replication_coordinator_impl_heartbeat.cpp12
-rw-r--r--src/mongo/db/repl/replication_coordinator_impl_test.cpp94
-rw-r--r--src/mongo/db/repl/replication_coordinator_mock.cpp3
-rw-r--r--src/mongo/db/repl/replication_coordinator_mock.h2
-rw-r--r--src/mongo/db/repl/replication_metadata.cpp100
-rw-r--r--src/mongo/db/repl/replication_metadata.h86
-rw-r--r--src/mongo/db/repl/topology_coordinator_impl.cpp8
-rw-r--r--src/mongo/rpc/metadata.cpp2
-rw-r--r--src/mongo/rpc/metadata.h2
-rw-r--r--src/mongo/rpc/metadata/repl_set_metadata.cpp120
-rw-r--r--src/mongo/rpc/metadata/repl_set_metadata.h55
-rw-r--r--src/mongo/rpc/metadata/repl_set_metadata_test.cpp19
-rw-r--r--src/mongo/s/catalog/dist_lock_catalog_impl.cpp4
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp5
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set_add_shard_test.cpp13
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set_drop_coll_test.cpp5
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set_log_action_test.cpp5
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set_remove_shard_test.cpp9
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set_shard_collection_test.cpp13
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set_test.cpp124
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set_test_fixture.cpp3
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set_upgrade_test.cpp15
-rw-r--r--src/mongo/s/client/shard_registry.cpp13
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, &timestamp);
-
- 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, &timestamp);
-
- 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;