diff options
author | Spencer T Brody <spencer@mongodb.com> | 2015-09-18 15:53:41 -0400 |
---|---|---|
committer | Spencer T Brody <spencer@mongodb.com> | 2015-09-24 13:36:59 -0400 |
commit | 03c414e87e5c3bc34230421163cdd06c9451389d (patch) | |
tree | 1fc24482ada7905ee380a2c0fd1c58a7fb89ed78 /src/mongo/s/client | |
parent | 3a7b1a9800f75706f35a290a8dee198bb29e3366 (diff) | |
download | mongo-03c414e87e5c3bc34230421163cdd06c9451389d.tar.gz |
SERVER-20498 Send config server optime to shards automatically on all commands via the OP_COMMAND metadata
Diffstat (limited to 'src/mongo/s/client')
-rw-r--r-- | src/mongo/s/client/shard_registry.cpp | 9 | ||||
-rw-r--r-- | src/mongo/s/client/sharding_connection_hook.cpp | 50 |
2 files changed, 45 insertions, 14 deletions
diff --git a/src/mongo/s/client/shard_registry.cpp b/src/mongo/s/client/shard_registry.cpp index 2fd476bc7de..91a6aaa09d2 100644 --- a/src/mongo/s/client/shard_registry.cpp +++ b/src/mongo/s/client/shard_registry.cpp @@ -42,7 +42,7 @@ #include "mongo/db/client.h" #include "mongo/executor/task_executor.h" #include "mongo/rpc/get_status_from_command_result.h" -#include "mongo/rpc/metadata/config_server_response_metadata.h" +#include "mongo/rpc/metadata/config_server_metadata.h" #include "mongo/rpc/metadata/repl_set_metadata.h" #include "mongo/s/catalog/catalog_manager.h" #include "mongo/s/catalog/type_shard.h" @@ -287,6 +287,11 @@ void ShardRegistry::_updateLookupMapsForShard_inlock(shared_ptr<Shard> shard, if (newConnString.type() == ConnectionString::SET) { _rsLookup[newConnString.getSetName()] = shard; + } else if (newConnString.type() == ConnectionString::CUSTOM) { + // CUSTOM connection strings (ie "$dummy:10000) become DBDirectClient connections which + // always return "localhost" as their resposne to getServerAddress(). This is just for + // making dbtest work. + _lookup["localhost"] = shard; } // TODO: The only reason to have the shard host names in the lookup table is for the @@ -425,7 +430,7 @@ StatusWith<ShardRegistry::QueryResponse> ShardRegistry::exhaustiveFindOnConfigNo } Status ShardRegistry::_advanceConfigOpTimeFromMetadata(const BSONObj& metadata) { - auto configMetadata = rpc::ConfigServerResponseMetadata::readFromMetadata(metadata); + auto configMetadata = rpc::ConfigServerMetadata::readFromMetadata(metadata); if (!configMetadata.isOK()) { return configMetadata.getStatus(); } diff --git a/src/mongo/s/client/sharding_connection_hook.cpp b/src/mongo/s/client/sharding_connection_hook.cpp index 7a178055353..24cd459db27 100644 --- a/src/mongo/s/client/sharding_connection_hook.cpp +++ b/src/mongo/s/client/sharding_connection_hook.cpp @@ -42,7 +42,7 @@ #include "mongo/db/client.h" #include "mongo/rpc/get_status_from_command_result.h" #include "mongo/rpc/metadata/audit_metadata.h" -#include "mongo/rpc/metadata/config_server_response_metadata.h" +#include "mongo/rpc/metadata/config_server_metadata.h" #include "mongo/s/client/scc_fast_query_handler.h" #include "mongo/s/client/shard_registry.h" #include "mongo/s/cluster_last_error_info.h" @@ -55,6 +55,12 @@ namespace mongo { using std::string; namespace { + +// A hook that parses the reply metadata from every response to a command sent from a DBClient +// created by mongos or a sharding aware mongod and being used for sharded operations. +// Used by mongos to capture the GLE stats so that we can target the correct node when subsequent +// getLastError calls are made, as well as by both mongod and mongos to update the stored config +// server optime. Status _shardingReplyMetadataReader(const BSONObj& metadataObj, StringData hostString) { saveGLEStats(metadataObj, hostString); @@ -64,7 +70,7 @@ Status _shardingReplyMetadataReader(const BSONObj& metadataObj, StringData hostS } // If this host is a known shard of ours, look for a config server optime in the response // metadata to use to update our notion of the current config server optime. - auto responseStatus = rpc::ConfigServerResponseMetadata::readFromMetadata(metadataObj); + auto responseStatus = rpc::ConfigServerMetadata::readFromMetadata(metadataObj); if (!responseStatus.isOK()) { return responseStatus.getStatus(); } @@ -74,6 +80,32 @@ Status _shardingReplyMetadataReader(const BSONObj& metadataObj, StringData hostS } return Status::OK(); } + +// A hook that will append impersonated users to the metadata of every runCommand run by a DBClient +// created by mongos or a sharding aware mongod. mongos uses this information to send information +// to mongod so that the mongod can produce auditing records attributed to the proper authenticated +// user(s). +// Additionally, if the connection is sharding-aware, also appends the stored config server optime. +Status _shardingRequestMetadataWriter(bool shardedConn, + BSONObjBuilder* metadataBob, + StringData hostStringData) { + audit::writeImpersonatedUsersToMetadata(metadataBob); + if (!shardedConn) { + return Status::OK(); + } + + // Add config server optime to metadata sent to shards. + std::string hostString = hostStringData.toString(); + auto shard = grid.shardRegistry()->getShardNoReload(hostString); + invariant(shard); + if (shard->isConfig()) { + return Status::OK(); + } + rpc::ConfigServerMetadata(grid.shardRegistry()->getConfigOpTime()).writeToMetadata(metadataBob); + + return Status::OK(); +} + } // namespace ShardingConnectionHook::ShardingConnectionHook(bool shardedConnections) @@ -93,19 +125,13 @@ void ShardingConnectionHook::onCreate(DBClientBase* conn) { } if (_shardedConnections) { - // For every DBClient created by mongos, add a hook that will capture the response from - // commands we pass along from the client, so that we can target the correct node when - // subsequent getLastError calls are made by mongos. conn->setReplyMetadataReader(_shardingReplyMetadataReader); } - // For every DBClient created by mongos, add a hook that will append impersonated users - // to the end of every runCommand. mongod uses this information to produce auditing - // records attributed to the proper authenticated user(s). - conn->setRequestMetadataWriter([](BSONObjBuilder* metadataBob, StringData) -> Status { - audit::writeImpersonatedUsersToMetadata(metadataBob); - return Status::OK(); - }); + conn->setRequestMetadataWriter( + [this](BSONObjBuilder* metadataBob, StringData hostStringData) -> Status { + return _shardingRequestMetadataWriter(_shardedConnections, metadataBob, hostStringData); + }); // For every SCC created, add a hook that will allow fastest-config-first config reads if // the appropriate server options are set. |