summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mongo/client/connection_string.cpp12
-rw-r--r--src/mongo/client/connection_string.h12
-rw-r--r--src/mongo/client/connection_string_connect.cpp3
-rw-r--r--src/mongo/client/remote_command_targeter_factory_impl.cpp6
-rw-r--r--src/mongo/db/s/sharding_state.cpp45
-rw-r--r--src/mongo/db/s/sharding_state_test.cpp27
-rw-r--r--src/mongo/s/SConscript5
-rw-r--r--src/mongo/s/catalog/replset/dist_lock_catalog_impl_test.cpp27
-rw-r--r--src/mongo/s/catalog/replset/replset_dist_lock_manager_test.cpp28
-rw-r--r--src/mongo/s/client/SConscript6
-rw-r--r--src/mongo/s/client/shard_factory.cpp38
-rw-r--r--src/mongo/s/client/shard_factory.h33
-rw-r--r--src/mongo/s/client/shard_registry.cpp4
-rw-r--r--src/mongo/s/client/version_manager.cpp15
-rw-r--r--src/mongo/s/server.cpp33
-rw-r--r--src/mongo/s/sharding_initialization.cpp17
-rw-r--r--src/mongo/s/sharding_initialization.h11
-rw-r--r--src/mongo/s/sharding_test_fixture.cpp32
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();