diff options
author | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2018-05-01 14:03:33 -0400 |
---|---|---|
committer | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2018-07-24 13:56:35 -0400 |
commit | 43fcf5b663829f9d5624b7089fbf813b42647e2c (patch) | |
tree | 414443c37702d0b777ad90063b3cde12d8af6076 | |
parent | bce06a11d01ad73da232934957e34cd0a2b9ca21 (diff) | |
download | mongo-43fcf5b663829f9d5624b7089fbf813b42647e2c.tar.gz |
SERVER-34141 Reset client metadata when missing in metadata
(cherry picked from commit 52c1fe02a0cd0f64a4d97f7c1e17792b38c67ca4)
-rw-r--r-- | src/mongo/rpc/metadata/client_metadata_ismaster.cpp | 23 | ||||
-rw-r--r-- | src/mongo/rpc/metadata/client_metadata_ismaster.h | 9 |
2 files changed, 25 insertions, 7 deletions
diff --git a/src/mongo/rpc/metadata/client_metadata_ismaster.cpp b/src/mongo/rpc/metadata/client_metadata_ismaster.cpp index 234f61c78e8..8a6e84f2eef 100644 --- a/src/mongo/rpc/metadata/client_metadata_ismaster.cpp +++ b/src/mongo/rpc/metadata/client_metadata_ismaster.cpp @@ -65,17 +65,30 @@ const boost::optional<ClientMetadata>& ClientMetadataIsMasterState::getClientMet return _clientMetadata; } -void ClientMetadataIsMasterState::setClientMetadata( - Client* client, boost::optional<ClientMetadata> clientMetadata) { +void ClientMetadataIsMasterState::setClientMetadata(Client* client, + boost::optional<ClientMetadata> clientMetadata, + bool setViaMetadata) { auto& state = get(client); stdx::lock_guard<Client> lk(*client); state._clientMetadata = std::move(clientMetadata); + state._setViaMetadata = setViaMetadata; } Status ClientMetadataIsMasterState::readFromMetadata(OperationContext* txn, BSONElement& element) { + auto& clientMetadataIsMasterState = ClientMetadataIsMasterState::get(txn->getClient()); + + // If client metadata is not present in network requests, reset the in-memory metadata to be + // blank so that the wrong + // app name is not propagated. if (element.eoo()) { + auto client = txn->getClient(); + + if (clientMetadataIsMasterState._setViaMetadata && !client->isInDirectClient()) { + clientMetadataIsMasterState.setClientMetadata(client, boost::none, true); + } + return Status::OK(); } @@ -85,10 +98,8 @@ Status ClientMetadataIsMasterState::readFromMetadata(OperationContext* txn, BSON return swParseClientMetadata.getStatus(); } - auto& clientMetadataIsMasterState = ClientMetadataIsMasterState::get(txn->getClient()); - - clientMetadataIsMasterState.setClientMetadata(txn->getClient(), - std::move(swParseClientMetadata.getValue())); + clientMetadataIsMasterState.setClientMetadata( + txn->getClient(), std::move(swParseClientMetadata.getValue()), true); return Status::OK(); } diff --git a/src/mongo/rpc/metadata/client_metadata_ismaster.h b/src/mongo/rpc/metadata/client_metadata_ismaster.h index 305018343d0..73760abfead 100644 --- a/src/mongo/rpc/metadata/client_metadata_ismaster.h +++ b/src/mongo/rpc/metadata/client_metadata_ismaster.h @@ -59,7 +59,9 @@ public: /** * Set the optional client metadata object. */ - static void setClientMetadata(Client* client, boost::optional<ClientMetadata> clientMetadata); + static void setClientMetadata(Client* client, + boost::optional<ClientMetadata> clientMetadata, + bool setViaMetadata = false); /** * Check a flag to indicate that isMaster has been seen for this Client. @@ -102,6 +104,11 @@ private: // Thread-Safety: // None - must be only be read and written from the thread owning "Client". bool _hasSeenIsMaster{false}; + + // Indicates whether we have set isMaster based on metadata or via isMaster + // Thread-Safety: + // None - must be only be read and written from the thread owning "Client". + bool _setViaMetadata{false}; }; } // namespace mongo |