Status initializeGlobalShardingState(OperationContext* txn, const ConnectionString& configCS, bool allowNetworking) { if (configCS.type() == ConnectionString::INVALID) { return {ErrorCodes::BadValue, "Unrecognized connection string."}; } auto network = executor::makeNetworkInterface("NetworkInterfaceASIO-ShardRegistry", stdx::make_unique<ShardingNetworkConnectionHook>(), stdx::make_unique<ShardingEgressMetadataHook>()); auto networkPtr = network.get(); auto shardRegistry( stdx::make_unique<ShardRegistry>(stdx::make_unique<RemoteCommandTargeterFactoryImpl>(), makeTaskExecutorPool(std::move(network)), networkPtr, makeTaskExecutor(executor::makeNetworkInterface( "NetworkInterfaceASIO-ShardRegistry-TaskExecutor")), configCS)); auto catalogManager = makeCatalogManager(getGlobalServiceContext(), shardRegistry.get(), HostAndPort(getHostName(), serverGlobalParams.port)); shardRegistry->startup(); grid.init(std::move(catalogManager), std::move(shardRegistry), stdx::make_unique<ClusterCursorManager>(getGlobalServiceContext()->getClockSource())); while (!inShutdown()) { try { Status status = grid.catalogManager(txn)->startup(txn, allowNetworking); uassertStatusOK(status); if (serverGlobalParams.configsvrMode == CatalogManager::ConfigServerMode::NONE) { grid.shardRegistry()->reload(txn); } return Status::OK(); } catch (const DBException& ex) { Status status = ex.toStatus(); if (status == ErrorCodes::ReplicaSetNotFound) { // ReplicaSetNotFound most likely means we've been waiting for the config replica // set to come up for so long that the ReplicaSetMonitor stopped monitoring the set. // Rebuild the config shard to force the monitor to resume monitoring the config // servers. grid.shardRegistry()->rebuildConfigShard(); } log() << "Error initializing sharding state, sleeping for 2 seconds and trying again" << causedBy(status); sleepmillis(2000); continue; } } return Status::OK(); }
Status initializeGlobalShardingState(const ConnectionString& configCS, uint64_t maxChunkSizeBytes, std::unique_ptr<ShardFactory> shardFactory, rpc::ShardingEgressMetadataHookBuilder hookBuilder) { if (configCS.type() == ConnectionString::INVALID) { return {ErrorCodes::BadValue, "Unrecognized connection string."}; } auto network = executor::makeNetworkInterface("NetworkInterfaceASIO-ShardRegistry", stdx::make_unique<ShardingNetworkConnectionHook>(), hookBuilder()); auto networkPtr = network.get(); auto executorPool = makeTaskExecutorPool(std::move(network), hookBuilder()); executorPool->startup(); auto shardRegistry(stdx::make_unique<ShardRegistry>(std::move(shardFactory), configCS)); auto catalogManager = makeCatalogManager(getGlobalServiceContext(), shardRegistry.get(), HostAndPort(getHostName(), serverGlobalParams.port)); auto rawCatalogManager = catalogManager.get(); grid.init( std::move(catalogManager), stdx::make_unique<CatalogCache>(), std::move(shardRegistry), stdx::make_unique<ClusterCursorManager>(getGlobalServiceContext()->getPreciseClockSource()), stdx::make_unique<BalancerConfiguration>(maxChunkSizeBytes), std::move(executorPool), networkPtr); auto status = rawCatalogManager->startup(); if (!status.isOK()) { return status; } return Status::OK(); }
ForwardingCatalogManager::ForwardingCatalogManager(ServiceContext* service, const ConnectionString& configCS, ShardRegistry* shardRegistry, const std::string& distLockProcessId) : _actual(makeCatalogManager(service, configCS, shardRegistry, distLockProcessId)) {}