summaryrefslogtreecommitdiff
path: root/src/mongo/rpc/metadata/sharding_metadata.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mongo/rpc/metadata/sharding_metadata.cpp')
-rw-r--r--src/mongo/rpc/metadata/sharding_metadata.cpp176
1 files changed, 83 insertions, 93 deletions
diff --git a/src/mongo/rpc/metadata/sharding_metadata.cpp b/src/mongo/rpc/metadata/sharding_metadata.cpp
index e33a4e075bd..4fc3a2feae2 100644
--- a/src/mongo/rpc/metadata/sharding_metadata.cpp
+++ b/src/mongo/rpc/metadata/sharding_metadata.cpp
@@ -41,115 +41,105 @@ namespace rpc {
namespace {
- const char kGLEStatsFieldName[] = "$gleStats";
- const char kGLEStatsLastOpTimeFieldName[] = "lastOpTime";
- const char kGLEStatsElectionIdFieldName[] = "electionId";
+const char kGLEStatsFieldName[] = "$gleStats";
+const char kGLEStatsLastOpTimeFieldName[] = "lastOpTime";
+const char kGLEStatsElectionIdFieldName[] = "electionId";
} // namespace
- StatusWith<ShardingMetadata> ShardingMetadata::readFromMetadata(const BSONObj& metadataObj) {
- BSONElement smElem;
- auto smExtractStatus = bsonExtractTypedField(metadataObj,
- kGLEStatsFieldName,
- mongo::Object,
- &smElem);
- if (!smExtractStatus.isOK()) {
- return smExtractStatus;
- }
-
- if (smElem.embeddedObject().nFields() != 2) {
- return Status(ErrorCodes::InvalidOptions,
- str::stream() << "The $gleStats object can only have 2 fields, but got "
- << smElem.embeddedObject().toString());
- }
-
- BSONElement lastOpTimeElem;
- auto lastOpTimeExtractStatus = bsonExtractTypedField(smElem.embeddedObject(),
- kGLEStatsLastOpTimeFieldName,
- mongo::bsonTimestamp,
- &lastOpTimeElem);
- if (!lastOpTimeExtractStatus.isOK()) {
- return lastOpTimeExtractStatus;
- }
-
- BSONElement lastElectionIdElem;
- auto lastElectionIdExtractStatus = bsonExtractTypedField(smElem.embeddedObject(),
- kGLEStatsElectionIdFieldName,
- mongo::jstOID,
- &lastElectionIdElem);
- if (!lastElectionIdExtractStatus.isOK()) {
- return lastElectionIdExtractStatus;
- }
-
- return ShardingMetadata(lastOpTimeElem.timestamp(), lastElectionIdElem.OID());
+StatusWith<ShardingMetadata> ShardingMetadata::readFromMetadata(const BSONObj& metadataObj) {
+ BSONElement smElem;
+ auto smExtractStatus =
+ bsonExtractTypedField(metadataObj, kGLEStatsFieldName, mongo::Object, &smElem);
+ if (!smExtractStatus.isOK()) {
+ return smExtractStatus;
}
- Status ShardingMetadata::writeToMetadata(BSONObjBuilder* metadataBob) const {
- BSONObjBuilder subobj(metadataBob->subobjStart(kGLEStatsFieldName));
- subobj.append(kGLEStatsLastOpTimeFieldName, getLastOpTime());
- subobj.append(kGLEStatsElectionIdFieldName, getLastElectionId());
- return Status::OK();
+ if (smElem.embeddedObject().nFields() != 2) {
+ return Status(ErrorCodes::InvalidOptions,
+ str::stream() << "The $gleStats object can only have 2 fields, but got "
+ << smElem.embeddedObject().toString());
}
- Status ShardingMetadata::downconvert(const BSONObj& commandReply,
- const BSONObj& replyMetadata,
- BSONObjBuilder* legacyCommandReplyBob) {
-
- legacyCommandReplyBob->appendElements(commandReply);
+ BSONElement lastOpTimeElem;
+ auto lastOpTimeExtractStatus = bsonExtractTypedField(smElem.embeddedObject(),
+ kGLEStatsLastOpTimeFieldName,
+ mongo::bsonTimestamp,
+ &lastOpTimeElem);
+ if (!lastOpTimeExtractStatus.isOK()) {
+ return lastOpTimeExtractStatus;
+ }
- auto swShardingMetadata = readFromMetadata(replyMetadata);
- if (swShardingMetadata.isOK()) {
- // We can reuse the same logic to write the sharding metadata out to the legacy
- // command as the element has the same format whether it is there or on the metadata
- // object.
- swShardingMetadata.getValue().writeToMetadata(legacyCommandReplyBob);
- }
- else if (swShardingMetadata.getStatus() == ErrorCodes::NoSuchKey) {
- // It is valid to not have a $gleStats field.
- }
- else {
- return swShardingMetadata.getStatus();
- }
- return Status::OK();
+ BSONElement lastElectionIdElem;
+ auto lastElectionIdExtractStatus = bsonExtractTypedField(
+ smElem.embeddedObject(), kGLEStatsElectionIdFieldName, mongo::jstOID, &lastElectionIdElem);
+ if (!lastElectionIdExtractStatus.isOK()) {
+ return lastElectionIdExtractStatus;
}
- Status ShardingMetadata::upconvert(const BSONObj& legacyCommand,
- BSONObjBuilder* commandBob,
- BSONObjBuilder* metadataBob) {
- // We can reuse the same logic to read the sharding metadata out from the legacy command
- // as it has the same format whether it is there or on the metadata object.
- auto swShardingMetadata = readFromMetadata(legacyCommand);
- if (swShardingMetadata.isOK()) {
- swShardingMetadata.getValue().writeToMetadata(metadataBob);
-
- // Write out the command excluding the $gleStats subobject.
- for (const auto& elem : legacyCommand) {
- if (elem.fieldNameStringData() != StringData(kGLEStatsFieldName)) {
- commandBob->append(elem);
- }
+ return ShardingMetadata(lastOpTimeElem.timestamp(), lastElectionIdElem.OID());
+}
+
+Status ShardingMetadata::writeToMetadata(BSONObjBuilder* metadataBob) const {
+ BSONObjBuilder subobj(metadataBob->subobjStart(kGLEStatsFieldName));
+ subobj.append(kGLEStatsLastOpTimeFieldName, getLastOpTime());
+ subobj.append(kGLEStatsElectionIdFieldName, getLastElectionId());
+ return Status::OK();
+}
+
+Status ShardingMetadata::downconvert(const BSONObj& commandReply,
+ const BSONObj& replyMetadata,
+ BSONObjBuilder* legacyCommandReplyBob) {
+ legacyCommandReplyBob->appendElements(commandReply);
+
+ auto swShardingMetadata = readFromMetadata(replyMetadata);
+ if (swShardingMetadata.isOK()) {
+ // We can reuse the same logic to write the sharding metadata out to the legacy
+ // command as the element has the same format whether it is there or on the metadata
+ // object.
+ swShardingMetadata.getValue().writeToMetadata(legacyCommandReplyBob);
+ } else if (swShardingMetadata.getStatus() == ErrorCodes::NoSuchKey) {
+ // It is valid to not have a $gleStats field.
+ } else {
+ return swShardingMetadata.getStatus();
+ }
+ return Status::OK();
+}
+
+Status ShardingMetadata::upconvert(const BSONObj& legacyCommand,
+ BSONObjBuilder* commandBob,
+ BSONObjBuilder* metadataBob) {
+ // We can reuse the same logic to read the sharding metadata out from the legacy command
+ // as it has the same format whether it is there or on the metadata object.
+ auto swShardingMetadata = readFromMetadata(legacyCommand);
+ if (swShardingMetadata.isOK()) {
+ swShardingMetadata.getValue().writeToMetadata(metadataBob);
+
+ // Write out the command excluding the $gleStats subobject.
+ for (const auto& elem : legacyCommand) {
+ if (elem.fieldNameStringData() != StringData(kGLEStatsFieldName)) {
+ commandBob->append(elem);
}
- } else if (swShardingMetadata.getStatus() == ErrorCodes::NoSuchKey) {
- // it is valid to not have a $gleStats field
- commandBob->appendElements(legacyCommand);
- }
- else {
- return swShardingMetadata.getStatus();
}
- return Status::OK();
+ } else if (swShardingMetadata.getStatus() == ErrorCodes::NoSuchKey) {
+ // it is valid to not have a $gleStats field
+ commandBob->appendElements(legacyCommand);
+ } else {
+ return swShardingMetadata.getStatus();
}
+ return Status::OK();
+}
- ShardingMetadata::ShardingMetadata(Timestamp lastOpTime, OID lastElectionId)
- : _lastOpTime(std::move(lastOpTime))
- , _lastElectionId(std::move(lastElectionId))
- {}
+ShardingMetadata::ShardingMetadata(Timestamp lastOpTime, OID lastElectionId)
+ : _lastOpTime(std::move(lastOpTime)), _lastElectionId(std::move(lastElectionId)) {}
- const Timestamp& ShardingMetadata::getLastOpTime() const {
- return _lastOpTime;
- }
+const Timestamp& ShardingMetadata::getLastOpTime() const {
+ return _lastOpTime;
+}
- const OID& ShardingMetadata::getLastElectionId() const {
- return _lastElectionId;
- }
+const OID& ShardingMetadata::getLastElectionId() const {
+ return _lastElectionId;
+}
} // namespace rpc
} // namespace mongo