diff options
author | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2016-08-04 17:29:34 -0400 |
---|---|---|
committer | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2016-08-04 17:29:34 -0400 |
commit | 0910d24d096ab9787b84b2f64c5a5f387103d06d (patch) | |
tree | aba4aee542d74e22fb85d07bf75f6d441ca257db /src/mongo/rpc/metadata/client_metadata_ismaster.cpp | |
parent | d3155cd6a555f30ac5c5641a6b1006d996692345 (diff) | |
download | mongo-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.cpp | 37 |
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 |