summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2018-05-01 14:03:33 -0400
committerMark Benvenuto <mark.benvenuto@mongodb.com>2018-07-24 13:56:35 -0400
commit43fcf5b663829f9d5624b7089fbf813b42647e2c (patch)
tree414443c37702d0b777ad90063b3cde12d8af6076
parentbce06a11d01ad73da232934957e34cd0a2b9ca21 (diff)
downloadmongo-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.cpp23
-rw-r--r--src/mongo/rpc/metadata/client_metadata_ismaster.h9
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