diff options
-rw-r--r-- | src/mongo/client/connection_string.cpp | 12 | ||||
-rw-r--r-- | src/mongo/client/connection_string.h | 12 | ||||
-rw-r--r-- | src/mongo/client/connection_string_connect.cpp | 3 | ||||
-rw-r--r-- | src/mongo/client/remote_command_targeter_factory_impl.cpp | 6 | ||||
-rw-r--r-- | src/mongo/db/s/sharding_state.cpp | 45 | ||||
-rw-r--r-- | src/mongo/db/s/sharding_state_test.cpp | 27 | ||||
-rw-r--r-- | src/mongo/s/SConscript | 5 | ||||
-rw-r--r-- | src/mongo/s/catalog/replset/dist_lock_catalog_impl_test.cpp | 27 | ||||
-rw-r--r-- | src/mongo/s/catalog/replset/replset_dist_lock_manager_test.cpp | 28 | ||||
-rw-r--r-- | src/mongo/s/client/SConscript | 6 | ||||
-rw-r--r-- | src/mongo/s/client/shard_factory.cpp | 38 | ||||
-rw-r--r-- | src/mongo/s/client/shard_factory.h | 33 | ||||
-rw-r--r-- | src/mongo/s/client/shard_registry.cpp | 4 | ||||
-rw-r--r-- | src/mongo/s/client/version_manager.cpp | 15 | ||||
-rw-r--r-- | src/mongo/s/server.cpp | 33 | ||||
-rw-r--r-- | src/mongo/s/sharding_initialization.cpp | 17 | ||||
-rw-r--r-- | src/mongo/s/sharding_initialization.h | 11 | ||||
-rw-r--r-- | src/mongo/s/sharding_test_fixture.cpp | 32 |
18 files changed, 269 insertions, 85 deletions
diff --git a/src/mongo/client/connection_string.cpp b/src/mongo/client/connection_string.cpp index 18ee8ea1234..36e317ba19c 100644 --- a/src/mongo/client/connection_string.cpp +++ b/src/mongo/client/connection_string.cpp @@ -70,11 +70,19 @@ ConnectionString::ConnectionString(const std::string& s, ConnectionType connType _finishInit(); } +ConnectionString::ConnectionString(ConnectionType connType) : _type(connType), _string("<local>") { + invariant(_type == LOCAL); +} + ConnectionString ConnectionString::forReplicaSet(StringData setName, std::vector<HostAndPort> servers) { return ConnectionString(setName, std::move(servers)); } +ConnectionString ConnectionString::forLocal() { + return ConnectionString(LOCAL); +} + // TODO: rewrite parsing make it more reliable void ConnectionString::_fillServers(std::string s) { // @@ -161,6 +169,8 @@ bool ConnectionString::sameLogicalEndpoint(const ConnectionString& other) const return _setName == other._setName; case CUSTOM: return _string == other._string; + case LOCAL: + return true; } MONGO_UNREACHABLE; @@ -207,6 +217,8 @@ std::string ConnectionString::typeToString(ConnectionType type) { return "set"; case CUSTOM: return "custom"; + case LOCAL: + return "local"; } MONGO_UNREACHABLE; diff --git a/src/mongo/client/connection_string.h b/src/mongo/client/connection_string.h index fbb29a829f6..f6b5ef419ec 100644 --- a/src/mongo/client/connection_string.h +++ b/src/mongo/client/connection_string.h @@ -56,7 +56,7 @@ class DBClientBase; */ class ConnectionString { public: - enum ConnectionType { INVALID, MASTER, SET, CUSTOM }; + enum ConnectionType { INVALID, MASTER, SET, CUSTOM, LOCAL }; ConnectionString() = default; @@ -66,6 +66,11 @@ public: static ConnectionString forReplicaSet(StringData setName, std::vector<HostAndPort> servers); /** + * Constructs a local connection string. + */ + static ConnectionString forLocal(); + + /** * Creates a MASTER connection string with the specified server. */ explicit ConnectionString(const HostAndPort& server); @@ -155,6 +160,11 @@ private: */ ConnectionString(StringData setName, std::vector<HostAndPort> servers); + /** + * Creates a connection string with the specified type. Used for creating LOCAL strings. + */ + explicit ConnectionString(ConnectionType connType); + void _fillServers(std::string s); void _finishInit(); diff --git a/src/mongo/client/connection_string_connect.cpp b/src/mongo/client/connection_string_connect.cpp index 3a8e0287656..4356735492e 100644 --- a/src/mongo/client/connection_string_connect.cpp +++ b/src/mongo/client/connection_string_connect.cpp @@ -88,8 +88,9 @@ DBClientBase* ConnectionString::connect(std::string& errmsg, double socketTimeou return replacementConn; } + case LOCAL: case INVALID: - uasserted(13421, "trying to connect to invalid ConnectionString"); + MONGO_UNREACHABLE; } MONGO_UNREACHABLE; diff --git a/src/mongo/client/remote_command_targeter_factory_impl.cpp b/src/mongo/client/remote_command_targeter_factory_impl.cpp index 3c3b1974eac..a4ffd134108 100644 --- a/src/mongo/client/remote_command_targeter_factory_impl.cpp +++ b/src/mongo/client/remote_command_targeter_factory_impl.cpp @@ -53,11 +53,11 @@ std::unique_ptr<RemoteCommandTargeter> RemoteCommandTargeterFactoryImpl::create( case ConnectionString::SET: return stdx::make_unique<RemoteCommandTargeterRS>(connStr.getSetName(), connStr.getServers()); + // These connections should never be seen case ConnectionString::INVALID: - // These connections should never be seen - break; + case ConnectionString::LOCAL: + MONGO_UNREACHABLE; } - MONGO_UNREACHABLE; } diff --git a/src/mongo/db/s/sharding_state.cpp b/src/mongo/db/s/sharding_state.cpp index 622675f390e..4f9c69c3e4c 100644 --- a/src/mongo/db/s/sharding_state.cpp +++ b/src/mongo/db/s/sharding_state.cpp @@ -35,6 +35,8 @@ #include "mongo/bson/util/bson_extract.h" #include "mongo/client/connection_string.h" #include "mongo/client/replica_set_monitor.h" +#include "mongo/client/remote_command_targeter_factory_impl.h" +#include "mongo/client/remote_command_targeter.h" #include "mongo/db/client.h" #include "mongo/db/db_raii.h" #include "mongo/db/dbhelpers.h" @@ -50,8 +52,12 @@ #include "mongo/rpc/metadata/config_server_metadata.h" #include "mongo/s/catalog/catalog_manager.h" #include "mongo/s/catalog/type_chunk.h" +#include "mongo/s/client/shard_factory.h" +#include "mongo/s/client/shard_remote.h" +#include "mongo/s/client/shard_local.h" #include "mongo/s/client/shard_registry.h" #include "mongo/s/chunk_version.h" +#include "mongo/s/balancer/balancer_configuration.h" #include "mongo/s/config.h" #include "mongo/s/grid.h" #include "mongo/s/sharding_initialization.h" @@ -143,7 +149,44 @@ ShardingState::ShardingState() : _initializationState(static_cast<uint32_t>(InitializationState::kNew)), _initializationStatus(Status(ErrorCodes::InternalError, "Uninitialized value")), _configServerTickets(kMaxConfigServerRefreshThreads), - _globalInit(initializeGlobalShardingStateForMongod) {} + _globalInit() { + _globalInit = [](const ConnectionString& configCS) { + + auto targeterFactory = stdx::make_unique<RemoteCommandTargeterFactoryImpl>(); + auto targeterFactoryPtr = targeterFactory.get(); + + ShardFactory::BuilderCallable setBuilder = + [targeterFactoryPtr](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardRemote>( + shardId, connStr, targeterFactoryPtr->create(connStr)); + }; + + ShardFactory::BuilderCallable masterBuilder = + [targeterFactoryPtr](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardRemote>( + shardId, connStr, targeterFactoryPtr->create(connStr)); + }; + + ShardFactory::BuilderCallable localBuilder = + [](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardLocal>(shardId); + }; + + ShardFactory::BuildersMap buildersMap{ + {ConnectionString::SET, std::move(setBuilder)}, + {ConnectionString::MASTER, std::move(masterBuilder)}, + {ConnectionString::LOCAL, std::move(localBuilder)}, + }; + + auto shardFactory = + stdx::make_unique<ShardFactory>(std::move(buildersMap), std::move(targeterFactory)); + + return initializeGlobalShardingState(configCS, + ChunkSizeSettingsType::kDefaultMaxChunkSizeBytes, + std::move(shardFactory), + false); + }; +} ShardingState::~ShardingState() = default; diff --git a/src/mongo/db/s/sharding_state_test.cpp b/src/mongo/db/s/sharding_state_test.cpp index 0f74eb6df2f..1f5eecf6f21 100644 --- a/src/mongo/db/s/sharding_state_test.cpp +++ b/src/mongo/db/s/sharding_state_test.cpp @@ -30,6 +30,7 @@ #include "mongo/base/status_with.h" #include "mongo/client/remote_command_targeter_factory_mock.h" +#include "mongo/client/remote_command_targeter.h" #include "mongo/client/replica_set_monitor.h" #include "mongo/db/service_context_noop.h" #include "mongo/executor/network_interface_mock.h" @@ -45,6 +46,7 @@ #include "mongo/s/catalog/catalog_cache.h" #include "mongo/s/catalog/catalog_manager_mock.h" #include "mongo/s/client/shard_factory.h" +#include "mongo/s/client/shard_remote.h" #include "mongo/s/client/shard_registry.h" #include "mongo/s/grid.h" #include "mongo/s/query/cluster_cursor_manager.h" @@ -75,8 +77,29 @@ void initGrid(OperationContext* txn, const ConnectionString& configConnString) { executorPool->addExecutors(std::move(executorsForPool), std::move(fixedExec)); executorPool->startup(); - auto shardFactory( - stdx::make_unique<ShardFactory>(stdx::make_unique<RemoteCommandTargeterFactoryMock>())); + auto targeterFactory = stdx::make_unique<RemoteCommandTargeterFactoryMock>(); + auto targeterFactoryPtr = targeterFactory.get(); + + ShardFactory::BuilderCallable setBuilder = + [targeterFactoryPtr](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardRemote>( + shardId, connStr, targeterFactoryPtr->create(connStr)); + }; + + ShardFactory::BuilderCallable masterBuilder = + [targeterFactoryPtr](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardRemote>( + shardId, connStr, targeterFactoryPtr->create(connStr)); + }; + + ShardFactory::BuildersMap buildersMap{ + {ConnectionString::SET, std::move(setBuilder)}, + {ConnectionString::MASTER, std::move(masterBuilder)}, + }; + + auto shardFactory = + stdx::make_unique<ShardFactory>(std::move(buildersMap), std::move(targeterFactory)); + auto shardRegistry(stdx::make_unique<ShardRegistry>(std::move(shardFactory), configConnString)); grid.init( diff --git a/src/mongo/s/SConscript b/src/mongo/s/SConscript index cb7dfb3d0ff..38cfbdb9cb3 100644 --- a/src/mongo/s/SConscript +++ b/src/mongo/s/SConscript @@ -210,7 +210,7 @@ env.Library( '$BUILD_DIR/mongo/client/connection_string', '$BUILD_DIR/mongo/rpc/metadata', '$BUILD_DIR/mongo/db/commands/server_status_core', - '$BUILD_DIR/mongo/db/service_context', + '$BUILD_DIR/mongo/db/service_context', '$BUILD_DIR/mongo/db/stats/timer_stats', ] ) @@ -264,6 +264,7 @@ env.Library( "d_state.cpp", ], LIBDEPS=[ + "coreshard", "$BUILD_DIR/mongo/db/commands/core", "$BUILD_DIR/mongo/db/concurrency/lock_manager", "$BUILD_DIR/mongo/db/query/query", @@ -271,7 +272,7 @@ env.Library( "$BUILD_DIR/mongo/db/s/metadata", "$BUILD_DIR/mongo/db/s/sharding", "$BUILD_DIR/mongo/executor/network_interface_factory", - "coreshard", + "$BUILD_DIR/mongo/s/client/shard_local", ], LIBDEPS_TAGS=[ # Depends on symbols from files in serverOnlyFiles diff --git a/src/mongo/s/catalog/replset/dist_lock_catalog_impl_test.cpp b/src/mongo/s/catalog/replset/dist_lock_catalog_impl_test.cpp index 00069bc60f1..3bae6ce8a09 100644 --- a/src/mongo/s/catalog/replset/dist_lock_catalog_impl_test.cpp +++ b/src/mongo/s/catalog/replset/dist_lock_catalog_impl_test.cpp @@ -52,6 +52,7 @@ #include "mongo/s/catalog/type_locks.h" #include "mongo/s/client/shard_factory.h" #include "mongo/s/client/shard_registry.h" +#include "mongo/s/client/shard_remote.h" #include "mongo/s/grid.h" #include "mongo/s/query/cluster_cursor_manager.h" #include "mongo/s/write_ops/batched_update_request.h" @@ -131,8 +132,30 @@ private: executorPool->startup(); ConnectionString configCS(HostAndPort("dummy:1234")); - auto shardFactory( - stdx::make_unique<ShardFactory>(stdx::make_unique<RemoteCommandTargeterFactoryMock>())); + + auto targeterFactory = stdx::make_unique<RemoteCommandTargeterFactoryMock>(); + auto targeterFactoryPtr = targeterFactory.get(); + + ShardFactory::BuilderCallable setBuilder = + [targeterFactoryPtr](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardRemote>( + shardId, connStr, targeterFactoryPtr->create(connStr)); + }; + + ShardFactory::BuilderCallable masterBuilder = + [targeterFactoryPtr](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardRemote>( + shardId, connStr, targeterFactoryPtr->create(connStr)); + }; + + ShardFactory::BuildersMap buildersMap{ + {ConnectionString::SET, std::move(setBuilder)}, + {ConnectionString::MASTER, std::move(masterBuilder)}, + }; + + auto shardFactory = + stdx::make_unique<ShardFactory>(std::move(buildersMap), std::move(targeterFactory)); + auto shardRegistry(stdx::make_unique<ShardRegistry>(std::move(shardFactory), configCS)); _distLockCatalog = stdx::make_unique<DistLockCatalogImpl>(shardRegistry.get()); diff --git a/src/mongo/s/catalog/replset/replset_dist_lock_manager_test.cpp b/src/mongo/s/catalog/replset/replset_dist_lock_manager_test.cpp index b1ff0c3490f..a52aa8f1bc3 100644 --- a/src/mongo/s/catalog/replset/replset_dist_lock_manager_test.cpp +++ b/src/mongo/s/catalog/replset/replset_dist_lock_manager_test.cpp @@ -42,6 +42,7 @@ #include "mongo/bson/json.h" #include "mongo/bson/util/builder.h" #include "mongo/client/remote_command_targeter_factory_mock.h" +#include "mongo/client/remote_command_targeter.h" #include "mongo/db/jsobj.h" #include "mongo/db/operation_context_noop.h" #include "mongo/db/service_context_noop.h" @@ -54,6 +55,7 @@ #include "mongo/s/catalog/type_locks.h" #include "mongo/s/client/shard_factory.h" #include "mongo/s/client/shard_registry.h" +#include "mongo/s/client/shard_remote.h" #include "mongo/s/grid.h" #include "mongo/s/query/cluster_cursor_manager.h" #include "mongo/stdx/condition_variable.h" @@ -134,10 +136,32 @@ protected: getGlobalServiceContext()->setTickSource(makeTickSource()); // Set up grid just so that the config shard is accessible via the ShardRegistry. - auto targeterFactory = stdx::make_unique<RemoteCommandTargeterFactoryMock>(); - auto shardFactory = stdx::make_unique<ShardFactory>(std::move(targeterFactory)); ConnectionString configCS = ConnectionString::forReplicaSet( "configReplSet", std::vector<HostAndPort>{HostAndPort{"config"}}); + + auto targeterFactory = stdx::make_unique<RemoteCommandTargeterFactoryMock>(); + auto targeterFactoryPtr = targeterFactory.get(); + + ShardFactory::BuilderCallable setBuilder = + [targeterFactoryPtr](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardRemote>( + shardId, connStr, targeterFactoryPtr->create(connStr)); + }; + + ShardFactory::BuilderCallable masterBuilder = + [targeterFactoryPtr](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardRemote>( + shardId, connStr, targeterFactoryPtr->create(connStr)); + }; + + ShardFactory::BuildersMap buildersMap{ + {ConnectionString::SET, std::move(setBuilder)}, + {ConnectionString::MASTER, std::move(masterBuilder)}, + }; + + auto shardFactory = + stdx::make_unique<ShardFactory>(std::move(buildersMap), std::move(targeterFactory)); + auto shardRegistry = stdx::make_unique<ShardRegistry>(std::move(shardFactory), configCS); grid.init(nullptr, nullptr, diff --git a/src/mongo/s/client/SConscript b/src/mongo/s/client/SConscript index 41d59ece01a..3ea184d27b6 100644 --- a/src/mongo/s/client/SConscript +++ b/src/mongo/s/client/SConscript @@ -76,9 +76,13 @@ env.Library( ], LIBDEPS=[ '$BUILD_DIR/mongo/client/clientdriver', - '$BUILD_DIR/mongo/db/serveronly', 'shard_interface' ], + LIBDEPS_TAGS=[ + # Depends on DBDirectClient + 'incomplete', + ], + ) env.CppUnitTest( diff --git a/src/mongo/s/client/shard_factory.cpp b/src/mongo/s/client/shard_factory.cpp index ef4d57d90c5..cc5ca205a0f 100644 --- a/src/mongo/s/client/shard_factory.cpp +++ b/src/mongo/s/client/shard_factory.cpp @@ -26,6 +26,9 @@ * it in the license file. */ +#define MONGO_LOG_DEFAULT_COMPONENT ::mongo::logger::LogComponent::kSharding + + #include "mongo/platform/basic.h" #include "mongo/s/client/shard_factory.h" @@ -33,38 +36,27 @@ #include "mongo/base/status_with.h" #include "mongo/client/remote_command_targeter.h" #include "mongo/client/connection_string.h" -#include "mongo/s/client/shard.h" -#include "mongo/s/client/shard_remote.h" #include "mongo/stdx/memory.h" #include "mongo/util/assert_util.h" +#include "mongo/util/log.h" namespace mongo { -ShardFactory::ShardFactory(std::unique_ptr<RemoteCommandTargeterFactory> targeterFactory) - : _targeterFactory(std::move(targeterFactory)){}; +ShardFactory::ShardFactory(BuildersMap&& builders, + std::unique_ptr<RemoteCommandTargeterFactory> targeterFactory) + : _builders(builders), _targeterFactory(std::move(targeterFactory)) {} std::unique_ptr<Shard> ShardFactory::createUniqueShard(const ShardId& shardId, - const ConnectionString& connStr, - bool isLocal) { - if (isLocal) { - // TODO: Replace with the following line once ShardLocal is implemented. - // return stdx::make_unique<ShardLocal>(shardId); - MONGO_UNREACHABLE; - } else { - return stdx::make_unique<ShardRemote>(shardId, connStr, _targeterFactory->create(connStr)); - } + const ConnectionString& connStr) { + auto builderIt = _builders.find(connStr.type()); + invariant(builderIt != _builders.end()); + return builderIt->second(shardId, connStr); } std::shared_ptr<Shard> ShardFactory::createShard(const ShardId& shardId, - const ConnectionString& connStr, - bool isLocal) { - if (isLocal) { - // TODO: Replace with the following line once ShardLocal is implemented. - // return stdx::make_shared<ShardLocal>(shardId); - MONGO_UNREACHABLE; - } else { - return std::make_shared<ShardRemote>(shardId, connStr, _targeterFactory->create(connStr)); - } + const ConnectionString& connStr) { + auto builderIt = _builders.find(connStr.type()); + invariant(builderIt != _builders.end()); + return std::shared_ptr<Shard>(builderIt->second(shardId, connStr)); } - } // namespace mongo diff --git a/src/mongo/s/client/shard_factory.h b/src/mongo/s/client/shard_factory.h index 26b20ccbb34..caa6743e75b 100644 --- a/src/mongo/s/client/shard_factory.h +++ b/src/mongo/s/client/shard_factory.h @@ -30,42 +30,53 @@ #include <memory> #include <string> +#include <map> +#include <functional> #include "mongo/base/disallow_copying.h" + +#include "mongo/client/connection_string.h" #include "mongo/client/remote_command_targeter_factory.h" +#include "mongo/s/client/shard.h" +#include "mongo/stdx/functional.h" namespace mongo { -class ConnectionString; -class Shard; - /** - * A factory for creating ShardRemote or ShardLocal instances. + * An object factory for creating Shard instances via calling registered builders. */ class ShardFactory { MONGO_DISALLOW_COPYING(ShardFactory); public: - ShardFactory(std::unique_ptr<RemoteCommandTargeterFactory> targeterFactory); + using BuilderCallable = + stdx::function<std::unique_ptr<Shard>(const ShardId&, const ConnectionString&)>; + using BuildersMap = std::map<ConnectionString::ConnectionType, BuilderCallable>; + + ShardFactory(BuildersMap&&, std::unique_ptr<RemoteCommandTargeterFactory>); ~ShardFactory() = default; /** * Deprecated. Creates a unique_ptr with a new instance of a Shard with the provided shardId * and connection string. This method is currently only used for addShard. */ - std::unique_ptr<Shard> createUniqueShard(const std::string& shardId, - const ConnectionString& connStr, - bool isLocal); + std::unique_ptr<Shard> createUniqueShard(const ShardId& shardId, + const ConnectionString& connStr); /** * Creates a shared_ptr with a new instance of a Shard with the provided shardId * and connection string. */ - std::shared_ptr<Shard> createShard(const std::string& shardId, - const ConnectionString& connStr, - bool isLocal); + std::shared_ptr<Shard> createShard(const ShardId& shardId, const ConnectionString& connStr); private: + // Map from ConnectionType to a function that can be used to build a Shard object for that + // ConnectionType. This map must be set up at the initialization of the ShardFactory instance. + BuildersMap _builders; + + // Even though ShardFactory doesn't use _targeterFactory directly, the functions contained in + // _builders may, so ShardFactory must own _targeterFactory so that their lifetimes are tied + // together std::unique_ptr<RemoteCommandTargeterFactory> _targeterFactory; }; diff --git a/src/mongo/s/client/shard_registry.cpp b/src/mongo/s/client/shard_registry.cpp index 63a8ac4c6ac..fb34871a644 100644 --- a/src/mongo/s/client/shard_registry.cpp +++ b/src/mongo/s/client/shard_registry.cpp @@ -209,7 +209,7 @@ shared_ptr<Shard> ShardRegistry::getConfigShard() { } unique_ptr<Shard> ShardRegistry::createConnection(const ConnectionString& connStr) const { - return _shardFactory->createUniqueShard("<unnamed>", connStr, false); + return _shardFactory->createUniqueShard("<unnamed>", connStr); } shared_ptr<Shard> ShardRegistry::lookupRSName(const string& name) const { @@ -326,7 +326,7 @@ void ShardRegistry::_addShard_inlock(const ShardId& shardId, const ConnectionStr // TODO: the third argument should pass the bool that will instruct factory to create either // local or remote shard. - auto shard = _shardFactory->createShard(shardId, connString, false); + auto shard = _shardFactory->createShard(shardId, connString); _lookup[shard->getId()] = shard; diff --git a/src/mongo/s/client/version_manager.cpp b/src/mongo/s/client/version_manager.cpp index 6924b948869..5fcb8743740 100644 --- a/src/mongo/s/client/version_manager.cpp +++ b/src/mongo/s/client/version_manager.cpp @@ -153,20 +153,13 @@ bool setShardVersion(OperationContext* txn, */ DBClientBase* getVersionable(DBClientBase* conn) { switch (conn->type()) { + case ConnectionString::LOCAL: case ConnectionString::INVALID: - massert(15904, - str::stream() << "cannot set version on invalid connection " - << conn->toString(), - false); - return nullptr; + case ConnectionString::CUSTOM: + MONGO_UNREACHABLE; + case ConnectionString::MASTER: return conn; - case ConnectionString::CUSTOM: - massert(16334, - str::stream() << "cannot set version or shard on custom connection " - << conn->toString(), - false); - return nullptr; case ConnectionString::SET: DBClientReplicaSet* set = (DBClientReplicaSet*)conn; return &(set->masterConn()); diff --git a/src/mongo/s/server.cpp b/src/mongo/s/server.cpp index 98497256feb..adf32cbf290 100644 --- a/src/mongo/s/server.cpp +++ b/src/mongo/s/server.cpp @@ -39,6 +39,7 @@ #include "mongo/client/dbclient_rs.h" #include "mongo/client/global_conn_pool.h" #include "mongo/client/remote_command_targeter_factory_impl.h" +#include "mongo/client/remote_command_targeter.h" #include "mongo/client/replica_set_monitor.h" #include "mongo/config.h" #include "mongo/db/audit.h" @@ -67,6 +68,8 @@ #include "mongo/s/catalog/type_shard.h" #include "mongo/s/catalog/type_tags.h" #include "mongo/s/client/shard_connection.h" +#include "mongo/s/client/shard_remote.h" +#include "mongo/s/client/shard_factory.h" #include "mongo/s/client/shard_registry.h" #include "mongo/s/client/sharding_connection_hook_for_mongos.h" #include "mongo/s/cluster_write.h" @@ -272,8 +275,34 @@ static void reloadSettings(OperationContext* txn) { } static Status initializeSharding(OperationContext* txn) { - Status status = initializeGlobalShardingStateForMongos(mongosGlobalParams.configdbs, - mongosGlobalParams.maxChunkSizeBytes); + auto targeterFactory = stdx::make_unique<RemoteCommandTargeterFactoryImpl>(); + auto targeterFactoryPtr = targeterFactory.get(); + + ShardFactory::BuilderCallable setBuilder = + [targeterFactoryPtr](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardRemote>( + shardId, connStr, targeterFactoryPtr->create(connStr)); + }; + + ShardFactory::BuilderCallable masterBuilder = + [targeterFactoryPtr](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardRemote>( + shardId, connStr, targeterFactoryPtr->create(connStr)); + }; + + ShardFactory::BuildersMap buildersMap{ + {ConnectionString::SET, std::move(setBuilder)}, + {ConnectionString::MASTER, std::move(masterBuilder)}, + }; + + auto shardFactory = + stdx::make_unique<ShardFactory>(std::move(buildersMap), std::move(targeterFactory)); + + Status status = initializeGlobalShardingState(mongosGlobalParams.configdbs, + mongosGlobalParams.maxChunkSizeBytes, + std::move(shardFactory), + true); + if (!status.isOK()) { return status; } diff --git a/src/mongo/s/sharding_initialization.cpp b/src/mongo/s/sharding_initialization.cpp index 20004b1eafa..d3019a5ae61 100644 --- a/src/mongo/s/sharding_initialization.cpp +++ b/src/mongo/s/sharding_initialization.cpp @@ -132,8 +132,11 @@ std::unique_ptr<TaskExecutorPool> makeTaskExecutorPool(std::unique_ptr<NetworkIn return executorPool; } +} // namespace + Status initializeGlobalShardingState(const ConnectionString& configCS, uint64_t maxChunkSizeBytes, + std::unique_ptr<ShardFactory> shardFactory, bool isMongos) { if (configCS.type() == ConnectionString::INVALID) { return {ErrorCodes::BadValue, "Unrecognized connection string."}; @@ -154,8 +157,6 @@ Status initializeGlobalShardingState(const ConnectionString& configCS, auto executorPool = makeTaskExecutorPool(std::move(network), isMongos); executorPool->startup(); - auto shardFactory( - stdx::make_unique<ShardFactory>(stdx::make_unique<RemoteCommandTargeterFactoryImpl>())); auto shardRegistry(stdx::make_unique<ShardRegistry>(std::move(shardFactory), configCS)); auto catalogManager = makeCatalogManager(getGlobalServiceContext(), @@ -180,18 +181,6 @@ Status initializeGlobalShardingState(const ConnectionString& configCS, return Status::OK(); } -} // namespace - -Status initializeGlobalShardingStateForMongos(const ConnectionString& configCS, - uint64_t maxChunkSizeBytes) { - return initializeGlobalShardingState(configCS, maxChunkSizeBytes, true); -} - -Status initializeGlobalShardingStateForMongod(const ConnectionString& configCS) { - return initializeGlobalShardingState( - configCS, ChunkSizeSettingsType::kDefaultMaxChunkSizeBytes, false); -} - Status reloadShardRegistryUntilSuccess(OperationContext* txn) { if (serverGlobalParams.clusterRole == ClusterRole::ConfigServer) { return Status::OK(); diff --git a/src/mongo/s/sharding_initialization.h b/src/mongo/s/sharding_initialization.h index d7105768785..a4508870088 100644 --- a/src/mongo/s/sharding_initialization.h +++ b/src/mongo/s/sharding_initialization.h @@ -29,22 +29,23 @@ #pragma once #include <cstdint> +#include <memory> namespace mongo { class ConnectionString; class OperationContext; +class ShardFactory; class Status; /** * Takes in the connection string for reaching the config servers and initializes the global * CatalogManager, ShardingRegistry, and grid objects. */ -Status initializeGlobalShardingStateForMongos(const ConnectionString& configCS, - uint64_t maxChunkSizeBytes); - -Status initializeGlobalShardingStateForMongod(const ConnectionString& configCS); - +Status initializeGlobalShardingState(const ConnectionString& configCS, + uint64_t maxChunkSizeBytes, + std::unique_ptr<ShardFactory> shardFactory, + bool isMongos); /** * Tries to contact the config server and reload the shard registry until it succeeds or * is interrupted. diff --git a/src/mongo/s/sharding_test_fixture.cpp b/src/mongo/s/sharding_test_fixture.cpp index e79f59137a7..acbb5b7d13e 100644 --- a/src/mongo/s/sharding_test_fixture.cpp +++ b/src/mongo/s/sharding_test_fixture.cpp @@ -56,6 +56,7 @@ #include "mongo/s/catalog/type_shard.h" #include "mongo/s/client/shard_factory.h" #include "mongo/s/client/shard_registry.h" +#include "mongo/s/client/shard_remote.h" #include "mongo/s/grid.h" #include "mongo/s/query/cluster_cursor_manager.h" #include "mongo/s/set_shard_version_request.h" @@ -127,13 +128,40 @@ void ShardingTestFixture::setUp() { "CatalogManagerReplSetTest", {HostAndPort{"TestHost1"}, HostAndPort{"TestHost2"}}); auto targeterFactory(stdx::make_unique<RemoteCommandTargeterFactoryMock>()); - _targeterFactory = targeterFactory.get(); + auto targeterFactoryPtr = targeterFactory.get(); + _targeterFactory = targeterFactoryPtr; auto configTargeter(stdx::make_unique<RemoteCommandTargeterMock>()); _configTargeter = configTargeter.get(); _targeterFactory->addTargeterToReturn(configCS, std::move(configTargeter)); - auto shardFactory(stdx::make_unique<ShardFactory>(std::move(targeterFactory))); + ShardFactory::BuilderCallable setBuilder = + [targeterFactoryPtr](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardRemote>( + shardId, connStr, targeterFactoryPtr->create(connStr)); + }; + + ShardFactory::BuilderCallable masterBuilder = + [targeterFactoryPtr](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardRemote>( + shardId, connStr, targeterFactoryPtr->create(connStr)); + }; + + ShardFactory::BuilderCallable customBuilder = + [targeterFactoryPtr](const ShardId& shardId, const ConnectionString& connStr) { + return stdx::make_unique<ShardRemote>( + shardId, connStr, targeterFactoryPtr->create(connStr)); + }; + + ShardFactory::BuildersMap buildersMap{ + {ConnectionString::SET, std::move(setBuilder)}, + {ConnectionString::MASTER, std::move(masterBuilder)}, + {ConnectionString::CUSTOM, std::move(customBuilder)}, + }; + + auto shardFactory = + stdx::make_unique<ShardFactory>(std::move(buildersMap), std::move(targeterFactory)); + auto shardRegistry(stdx::make_unique<ShardRegistry>(std::move(shardFactory), configCS)); executorPool->startup(); |