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 | ad27c92e01758c96e7ace4cba13574e0d97a761d (patch) | |
tree | 9ef9c726765d76b531c7090063900484b65ea4c8 /src/mongo/db | |
parent | 931a227eedca19bc05fc6318996ffd3c6a2c6f4b (diff) | |
download | mongo-ad27c92e01758c96e7ace4cba13574e0d97a761d.tar.gz |
SERVER-24611 Implement ClientMetadata class
Diffstat (limited to 'src/mongo/db')
-rw-r--r-- | src/mongo/db/clientlistplugin.cpp | 11 | ||||
-rw-r--r-- | src/mongo/db/cloner.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/commands/clone_collection.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/commands/copydb.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/commands/copydb_start_commands.cpp | 4 | ||||
-rw-r--r-- | src/mongo/db/commands/current_op.cpp | 11 | ||||
-rw-r--r-- | src/mongo/db/repl/SConscript | 1 | ||||
-rw-r--r-- | src/mongo/db/repl/oplogreader.cpp | 2 | ||||
-rw-r--r-- | src/mongo/db/repl/replication_info.cpp | 33 | ||||
-rw-r--r-- | src/mongo/db/repl/rollback_source_impl.cpp | 4 |
10 files changed, 65 insertions, 7 deletions
diff --git a/src/mongo/db/clientlistplugin.cpp b/src/mongo/db/clientlistplugin.cpp index 713e9a176f0..8204eeb74a9 100644 --- a/src/mongo/db/clientlistplugin.cpp +++ b/src/mongo/db/clientlistplugin.cpp @@ -40,6 +40,8 @@ #include "mongo/db/operation_context.h" #include "mongo/db/service_context.h" #include "mongo/db/stats/fill_locker_info.h" +#include "mongo/rpc/metadata/client_metadata.h" +#include "mongo/rpc/metadata/client_metadata_ismaster.h" #include "mongo/util/mongoutils/html.h" #include "mongo/util/stringutils.h" @@ -199,6 +201,15 @@ private: client->reportState(b); + const auto& clientMetadata = + ClientMetadataIsMasterState::get(client).getClientMetadata(); + if (clientMetadata) { + auto appName = clientMetadata.get().getApplicationName(); + if (!appName.empty()) { + b.append("applicationName", appName); + } + } + const OperationContext* txn = client->getOperationContext(); b.appendBool("active", static_cast<bool>(txn)); if (txn) { diff --git a/src/mongo/db/cloner.cpp b/src/mongo/db/cloner.cpp index e924fa7312b..d43b145d776 100644 --- a/src/mongo/db/cloner.cpp +++ b/src/mongo/db/cloner.cpp @@ -542,7 +542,7 @@ Status Cloner::copyDb(OperationContext* txn, // nothing to do } else if (!masterSameProcess) { std::string errmsg; - unique_ptr<DBClientBase> con(cs.connect(errmsg)); + unique_ptr<DBClientBase> con(cs.connect(StringData(), errmsg)); if (!con.get()) { return Status(ErrorCodes::HostUnreachable, errmsg); } diff --git a/src/mongo/db/commands/clone_collection.cpp b/src/mongo/db/commands/clone_collection.cpp index 76ef1377673..a6539a5c179 100644 --- a/src/mongo/db/commands/clone_collection.cpp +++ b/src/mongo/db/commands/clone_collection.cpp @@ -148,7 +148,7 @@ public: Cloner cloner; unique_ptr<DBClientConnection> myconn; myconn.reset(new DBClientConnection()); - if (!myconn->connect(HostAndPort(fromhost), errmsg)) + if (!myconn->connect(HostAndPort(fromhost), StringData(), errmsg)) return false; cloner.setConnection(myconn.release()); diff --git a/src/mongo/db/commands/copydb.cpp b/src/mongo/db/commands/copydb.cpp index 92d721b70e1..9bfbde8d67a 100644 --- a/src/mongo/db/commands/copydb.cpp +++ b/src/mongo/db/commands/copydb.cpp @@ -201,7 +201,7 @@ public: // If fromSelf leave the cloner's conn empty, it will use a DBDirectClient instead. const ConnectionString cs(uassertStatusOK(ConnectionString::parse(fromhost))); - DBClientBase* conn = cs.connect(errmsg); + DBClientBase* conn = cs.connect(StringData(), errmsg); if (!conn) { return false; } diff --git a/src/mongo/db/commands/copydb_start_commands.cpp b/src/mongo/db/commands/copydb_start_commands.cpp index 8426b14d072..1af5e4be983 100644 --- a/src/mongo/db/commands/copydb_start_commands.cpp +++ b/src/mongo/db/commands/copydb_start_commands.cpp @@ -113,7 +113,7 @@ public: const ConnectionString cs(uassertStatusOK(ConnectionString::parse(fromhost))); auto& authConn = CopyDbAuthConnection::forClient(txn->getClient()); - authConn.reset(cs.connect(errmsg)); + authConn.reset(cs.connect(StringData(), errmsg)); if (!authConn) { return false; } @@ -202,7 +202,7 @@ public: } auto& authConn = CopyDbAuthConnection::forClient(txn->getClient()); - authConn.reset(cs.connect(errmsg)); + authConn.reset(cs.connect(StringData(), errmsg)); if (!authConn.get()) { return false; } diff --git a/src/mongo/db/commands/current_op.cpp b/src/mongo/db/commands/current_op.cpp index 10cf0f81272..555fbd1efe5 100644 --- a/src/mongo/db/commands/current_op.cpp +++ b/src/mongo/db/commands/current_op.cpp @@ -45,6 +45,8 @@ #include "mongo/db/namespace_string.h" #include "mongo/db/operation_context.h" #include "mongo/db/stats/fill_locker_info.h" +#include "mongo/rpc/metadata/client_metadata.h" +#include "mongo/rpc/metadata/client_metadata_ismaster.h" #include "mongo/util/log.h" namespace mongo { @@ -146,6 +148,15 @@ public: // The client information client->reportState(infoBuilder); + const auto& clientMetadata = + ClientMetadataIsMasterState::get(txn->getClient()).getClientMetadata(); + if (clientMetadata) { + auto appName = clientMetadata.get().getApplicationName(); + if (!appName.empty()) { + infoBuilder.append("appName", appName); + } + } + // Operation context specific information infoBuilder.appendBool("active", static_cast<bool>(opCtx)); if (opCtx) { diff --git a/src/mongo/db/repl/SConscript b/src/mongo/db/repl/SConscript index 959f4e07611..3fd9ec9a787 100644 --- a/src/mongo/db/repl/SConscript +++ b/src/mongo/db/repl/SConscript @@ -1072,6 +1072,7 @@ env.Library( '$BUILD_DIR/mongo/client/clientdriver', '$BUILD_DIR/mongo/db/auth/authcore', '$BUILD_DIR/mongo/db/commands', + '$BUILD_DIR/mongo/rpc/client_metadata', '$BUILD_DIR/mongo/db/concurrency/lock_manager', '$BUILD_DIR/mongo/db/curop', '$BUILD_DIR/mongo/db/lasterror', diff --git a/src/mongo/db/repl/oplogreader.cpp b/src/mongo/db/repl/oplogreader.cpp index 749c6112db9..cb83a12d676 100644 --- a/src/mongo/db/repl/oplogreader.cpp +++ b/src/mongo/db/repl/oplogreader.cpp @@ -93,7 +93,7 @@ bool OplogReader::connect(const HostAndPort& host) { _conn = shared_ptr<DBClientConnection>( new DBClientConnection(false, durationCount<Seconds>(kSocketTimeout))); string errmsg; - if (!_conn->connect(host, errmsg) || !replAuthenticate(_conn.get())) { + if (!_conn->connect(host, StringData(), errmsg) || !replAuthenticate(_conn.get())) { resetConnection(); error() << errmsg << endl; return false; diff --git a/src/mongo/db/repl/replication_info.cpp b/src/mongo/db/repl/replication_info.cpp index be4ddb9e3e4..cb74b9ec9af 100644 --- a/src/mongo/db/repl/replication_info.cpp +++ b/src/mongo/db/repl/replication_info.cpp @@ -25,6 +25,7 @@ * exception statement from all source files in the program, then also delete * it in the license file. */ +#define MONGO_LOG_DEFAULT_COMPONENT ::mongo::logger::LogComponent::kFTDC #include "mongo/platform/basic.h" @@ -50,6 +51,8 @@ #include "mongo/db/storage/storage_options.h" #include "mongo/db/wire_version.h" #include "mongo/executor/network_interface.h" +#include "mongo/rpc/metadata/client_metadata.h" +#include "mongo/rpc/metadata/client_metadata_ismaster.h" #include "mongo/s/write_ops/batched_command_request.h" #include "mongo/util/map_util.h" @@ -243,6 +246,36 @@ public: executor::NetworkInterface::kMessagingPortKeepOpen); } } + + auto& clientMetadataIsMasterState = ClientMetadataIsMasterState::get(txn->getClient()); + bool seenIsMaster = clientMetadataIsMasterState.hasSeenIsMaster(); + if (!seenIsMaster) { + clientMetadataIsMasterState.setSeenIsMaster(); + } + + BSONElement element = cmdObj[kMetadataDocumentName]; + if (!element.eoo()) { + if (seenIsMaster) { + return Command::appendCommandStatus( + result, + Status(ErrorCodes::ClientMetadataCannotBeMutated, + "The client metadata document may only be sent in the first isMaster")); + } + + auto swParseClientMetadata = ClientMetadata::parse(element); + + if (!swParseClientMetadata.getStatus().isOK()) { + return Command::appendCommandStatus(result, swParseClientMetadata.getStatus()); + } + + invariant(swParseClientMetadata.getValue()); + + swParseClientMetadata.getValue().get().logClientMetadata(txn->getClient()); + + clientMetadataIsMasterState.setClientMetadata( + txn->getClient(), std::move(swParseClientMetadata.getValue())); + } + appendReplicationInfo(txn, result, 0); if (serverGlobalParams.clusterRole == ClusterRole::ConfigServer) { diff --git a/src/mongo/db/repl/rollback_source_impl.cpp b/src/mongo/db/repl/rollback_source_impl.cpp index f416af8c716..27513953dca 100644 --- a/src/mongo/db/repl/rollback_source_impl.cpp +++ b/src/mongo/db/repl/rollback_source_impl.cpp @@ -72,7 +72,9 @@ void RollbackSourceImpl::copyCollectionFromRemote(OperationContext* txn, const NamespaceString& nss) const { std::string errmsg; std::unique_ptr<DBClientConnection> tmpConn(new DBClientConnection()); - uassert(15908, errmsg, tmpConn->connect(_source, errmsg) && replAuthenticate(tmpConn.get())); + uassert(15908, + errmsg, + tmpConn->connect(_source, StringData(), errmsg) && replAuthenticate(tmpConn.get())); // cloner owns _conn in unique_ptr Cloner cloner; |