summaryrefslogtreecommitdiff
path: root/src/mongo/rpc/metadata/client_metadata_ismaster.cpp
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2016-08-04 17:29:34 -0400
committerMark Benvenuto <mark.benvenuto@mongodb.com>2016-08-04 17:29:34 -0400
commit0910d24d096ab9787b84b2f64c5a5f387103d06d (patch)
treeaba4aee542d74e22fb85d07bf75f6d441ca257db /src/mongo/rpc/metadata/client_metadata_ismaster.cpp
parentd3155cd6a555f30ac5c5641a6b1006d996692345 (diff)
downloadmongo-0910d24d096ab9787b84b2f64c5a5f387103d06d.tar.gz
SERVER-25266 Enhance NetworkASIO to send the client metadata document
Diffstat (limited to 'src/mongo/rpc/metadata/client_metadata_ismaster.cpp')
-rw-r--r--src/mongo/rpc/metadata/client_metadata_ismaster.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/mongo/rpc/metadata/client_metadata_ismaster.cpp b/src/mongo/rpc/metadata/client_metadata_ismaster.cpp
index 53164ed33d2..2df2461dfa3 100644
--- a/src/mongo/rpc/metadata/client_metadata_ismaster.cpp
+++ b/src/mongo/rpc/metadata/client_metadata_ismaster.cpp
@@ -74,4 +74,41 @@ void ClientMetadataIsMasterState::setClientMetadata(
}
+Status ClientMetadataIsMasterState::readFromMetadata(OperationContext* txn, BSONElement& element) {
+ if (element.eoo()) {
+ return Status::OK();
+ }
+
+ auto swParseClientMetadata = ClientMetadata::parse(element);
+
+ if (!swParseClientMetadata.getStatus().isOK()) {
+ return swParseClientMetadata.getStatus();
+ }
+
+ auto& clientMetadataIsMasterState = ClientMetadataIsMasterState::get(txn->getClient());
+
+ clientMetadataIsMasterState.setClientMetadata(txn->getClient(),
+ std::move(swParseClientMetadata.getValue()));
+
+ return Status::OK();
+}
+
+void ClientMetadataIsMasterState::writeToMetadata(OperationContext* txn, BSONObjBuilder* builder) {
+ // We may be asked to write metadata on background threads that are not associated with an
+ // operation context
+ if (!txn) {
+ return;
+ }
+
+ const auto& clientMetadata =
+ ClientMetadataIsMasterState::get(txn->getClient()).getClientMetadata();
+
+ // Skip appending metadata if there is none
+ if (!clientMetadata || clientMetadata.get().getDocument().isEmpty()) {
+ return;
+ }
+
+ builder->append(ClientMetadata::fieldName(), clientMetadata.get().getDocument());
+}
+
} // namespace mongo