diff options
Diffstat (limited to 'src/mongo/s/sharding_initialization.cpp')
-rw-r--r-- | src/mongo/s/sharding_initialization.cpp | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/src/mongo/s/sharding_initialization.cpp b/src/mongo/s/sharding_initialization.cpp index cb39903bb21..e6d425d3128 100644 --- a/src/mongo/s/sharding_initialization.cpp +++ b/src/mongo/s/sharding_initialization.cpp @@ -32,17 +32,26 @@ #include "mongo/s/sharding_initialization.h" +#include <string> + #include "mongo/base/status.h" #include "mongo/client/connection_string.h" #include "mongo/client/remote_command_targeter_factory_impl.h" #include "mongo/executor/network_interface_factory.h" #include "mongo/executor/task_executor.h" #include "mongo/executor/thread_pool_task_executor.h" +#include "mongo/db/server_options.h" +#include "mongo/db/service_context.h" +#include "mongo/s/catalog/dist_lock_catalog_impl.h" #include "mongo/s/catalog/legacy/catalog_manager_legacy.h" +#include "mongo/s/catalog/replset/catalog_manager_replica_set.h" +#include "mongo/s/catalog/replset/replset_dist_lock_manager.h" #include "mongo/s/client/shard_registry.h" #include "mongo/s/grid.h" #include "mongo/stdx/memory.h" #include "mongo/util/concurrency/thread_pool.h" +#include "mongo/util/mongoutils/str.h" +#include "mongo/util/net/sock.h" namespace mongo { @@ -68,10 +77,33 @@ Status initializeGlobalShardingState(const ConnectionString& configCS) { makeTaskExecutor(std::move(network)), networkPtr)); - auto catalogManager = stdx::make_unique<CatalogManagerLegacy>(); - Status status = catalogManager->init(configCS); - if (!status.isOK()) { - return status; + std::unique_ptr<CatalogManager> catalogManager; + if (configCS.type() == ConnectionString::SET) { + auto distLockCatalog = stdx::make_unique<DistLockCatalogImpl>( + shardRegistry.get(), ReplSetDistLockManager::kDistLockWriteConcernTimeout); + + const std::string distLockProcessId = str::stream() + << getHostName() << ":" << serverGlobalParams.port << ":" << time(0) << ":" << rand(); + auto distLockManager = stdx::make_unique<ReplSetDistLockManager>( + getGlobalServiceContext(), + distLockProcessId, + std::move(distLockCatalog), + ReplSetDistLockManager::kDistLockPingInterval, + ReplSetDistLockManager::kDistLockExpirationTime); + + auto catalogManagerReplicaSet = stdx::make_unique<CatalogManagerReplicaSet>(); + Status status = catalogManagerReplicaSet->init(configCS, std::move(distLockManager)); + if (!status.isOK()) { + return status; + } + catalogManager = std::move(catalogManagerReplicaSet); + } else { + auto catalogManagerLegacy = stdx::make_unique<CatalogManagerLegacy>(); + Status status = catalogManagerLegacy->init(configCS); + if (!status.isOK()) { + return status; + } + catalogManager = std::move(catalogManagerLegacy); } shardRegistry->init(catalogManager.get()); |