summaryrefslogtreecommitdiff
path: root/src/mongo/db
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
commitad27c92e01758c96e7ace4cba13574e0d97a761d (patch)
tree9ef9c726765d76b531c7090063900484b65ea4c8 /src/mongo/db
parent931a227eedca19bc05fc6318996ffd3c6a2c6f4b (diff)
downloadmongo-ad27c92e01758c96e7ace4cba13574e0d97a761d.tar.gz
SERVER-24611 Implement ClientMetadata class
Diffstat (limited to 'src/mongo/db')
-rw-r--r--src/mongo/db/clientlistplugin.cpp11
-rw-r--r--src/mongo/db/cloner.cpp2
-rw-r--r--src/mongo/db/commands/clone_collection.cpp2
-rw-r--r--src/mongo/db/commands/copydb.cpp2
-rw-r--r--src/mongo/db/commands/copydb_start_commands.cpp4
-rw-r--r--src/mongo/db/commands/current_op.cpp11
-rw-r--r--src/mongo/db/repl/SConscript1
-rw-r--r--src/mongo/db/repl/oplogreader.cpp2
-rw-r--r--src/mongo/db/repl/replication_info.cpp33
-rw-r--r--src/mongo/db/repl/rollback_source_impl.cpp4
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;