diff options
author | Spencer T Brody <spencer@mongodb.com> | 2015-07-15 15:30:30 -0400 |
---|---|---|
committer | Spencer T Brody <spencer@mongodb.com> | 2015-07-23 10:51:50 -0400 |
commit | ac6ebf125d320e1c5542ac91a86b3b159ae5945d (patch) | |
tree | bbca2a55900b393ac2b36d5aa1ab1725a3bdea96 /src | |
parent | 84921ca797830b4adaedae01a4357d2bfccfb0a6 (diff) | |
download | mongo-ac6ebf125d320e1c5542ac91a86b3b159ae5945d.tar.gz |
SERVER-19414 Use CatalogManagerReplicaSet when config servers are a replica set
Diffstat (limited to 'src')
-rw-r--r-- | src/mongo/s/SConscript | 2 | ||||
-rw-r--r-- | src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp | 7 | ||||
-rw-r--r-- | src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp | 8 | ||||
-rw-r--r-- | src/mongo/s/catalog/replset/replset_dist_lock_manager.cpp | 4 | ||||
-rw-r--r-- | src/mongo/s/catalog/replset/replset_dist_lock_manager.h | 5 | ||||
-rw-r--r-- | src/mongo/s/mongos_options.cpp | 11 | ||||
-rw-r--r-- | src/mongo/s/sharding_initialization.cpp | 40 |
7 files changed, 56 insertions, 21 deletions
diff --git a/src/mongo/s/SConscript b/src/mongo/s/SConscript index 997d721a1d8..1669b744cbe 100644 --- a/src/mongo/s/SConscript +++ b/src/mongo/s/SConscript @@ -20,8 +20,10 @@ env.Library( LIBDEPS=[ '$BUILD_DIR/mongo/executor/network_interface_factory', '$BUILD_DIR/mongo/executor/thread_pool_task_executor', + '$BUILD_DIR/mongo/s/catalog/dist_lock_catalog_impl', '$BUILD_DIR/mongo/s/catalog/legacy/catalog_manager_legacy', '$BUILD_DIR/mongo/s/catalog/replset/catalog_manager_replica_set', + '$BUILD_DIR/mongo/s/catalog/replset/replset_dist_lock_manager', ] ) diff --git a/src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp b/src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp index 22ded60fe24..1f0f9e324a5 100644 --- a/src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp +++ b/src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp @@ -189,12 +189,7 @@ Status CatalogManagerLegacy::init(const ConnectionString& configDBCS) { if (_configServerConnectionString.type() == ConnectionString::MASTER) { _configServers.push_back(_configServerConnectionString); - } else if (_configServerConnectionString.type() == ConnectionString::SYNC || - (_configServerConnectionString.type() == ConnectionString::SET && - _configServerConnectionString.getServers().size() == 1)) { - // TODO(spencer): Remove second part of the above or statement that allows replset - // config server strings once we've separated the legacy catalog manager from the - // CSRS version. + } else if (_configServerConnectionString.type() == ConnectionString::SYNC) { const vector<HostAndPort> configHPs = _configServerConnectionString.getServers(); for (vector<HostAndPort>::const_iterator it = configHPs.begin(); it != configHPs.end(); ++it) { diff --git a/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp b/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp index f7eb5b4c5cf..c071b846b6f 100644 --- a/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp +++ b/src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp @@ -82,12 +82,10 @@ using str::stream; namespace { -const Status notYetImplemented(ErrorCodes::InternalError, "Not yet implemented"); // todo remove - -// Until read committed is supported always write to the primary with majoirty write and read +// Until read committed is supported always write to the primary with majority write and read // from the secondary. That way we ensure that reads will see a consistent data. const ReadPreferenceSetting kConfigWriteSelector(ReadPreference::PrimaryOnly, TagSet{}); -const ReadPreferenceSetting kConfigReadSelector(ReadPreference::SecondaryOnly, TagSet{}); +const ReadPreferenceSetting kConfigReadSelector(ReadPreference::PrimaryOnly, TagSet{}); const int kNotMasterNumRetries = 3; const int kInitialSSVRetries = 3; @@ -886,7 +884,7 @@ StatusWith<std::string> CatalogManagerReplicaSet::_generateNewShardName() const } BSONObjBuilder shardNameRegex; - shardNameRegex.appendRegex(ShardType::name(), "/^shard/"); + shardNameRegex.appendRegex(ShardType::name(), "^shard"); auto findStatus = grid.shardRegistry()->exhaustiveFind(readHost.getValue(), NamespaceString(ShardType::ConfigNS), diff --git a/src/mongo/s/catalog/replset/replset_dist_lock_manager.cpp b/src/mongo/s/catalog/replset/replset_dist_lock_manager.cpp index e9e161dbc88..28ac5afa23d 100644 --- a/src/mongo/s/catalog/replset/replset_dist_lock_manager.cpp +++ b/src/mongo/s/catalog/replset/replset_dist_lock_manager.cpp @@ -52,6 +52,10 @@ using std::unique_ptr; using stdx::chrono::milliseconds; using stdx::chrono::duration_cast; +const stdx::chrono::seconds ReplSetDistLockManager::kDistLockWriteConcernTimeout{5}; +const stdx::chrono::seconds ReplSetDistLockManager::kDistLockPingInterval{30}; +const stdx::chrono::minutes ReplSetDistLockManager::kDistLockExpirationTime{15}; + ReplSetDistLockManager::ReplSetDistLockManager(ServiceContext* globalContext, StringData processID, unique_ptr<DistLockCatalog> catalog, diff --git a/src/mongo/s/catalog/replset/replset_dist_lock_manager.h b/src/mongo/s/catalog/replset/replset_dist_lock_manager.h index 1779925b8ec..81da75af01e 100644 --- a/src/mongo/s/catalog/replset/replset_dist_lock_manager.h +++ b/src/mongo/s/catalog/replset/replset_dist_lock_manager.h @@ -37,6 +37,7 @@ #include "mongo/s/catalog/dist_lock_catalog.h" #include "mongo/s/catalog/dist_lock_manager.h" #include "mongo/s/catalog/dist_lock_ping_info.h" +#include "mongo/stdx/chrono.h" #include "mongo/stdx/condition_variable.h" #include "mongo/stdx/mutex.h" #include "mongo/stdx/thread.h" @@ -47,6 +48,10 @@ class ServiceContext; class ReplSetDistLockManager final : public DistLockManager { public: + static const stdx::chrono::seconds kDistLockWriteConcernTimeout; + static const stdx::chrono::seconds kDistLockPingInterval; + static const stdx::chrono::minutes kDistLockExpirationTime; + ReplSetDistLockManager(ServiceContext* globalContext, StringData processID, std::unique_ptr<DistLockCatalog> catalog, diff --git a/src/mongo/s/mongos_options.cpp b/src/mongo/s/mongos_options.cpp index 489235cc749..da9d3e7b1a5 100644 --- a/src/mongo/s/mongos_options.cpp +++ b/src/mongo/s/mongos_options.cpp @@ -267,12 +267,11 @@ Status storeMongosOptions(const moe::Environment& params, const std::vector<std: std::vector<HostAndPort> configServers = mongosGlobalParams.configdbs.getServers(); - if (!(mongosGlobalParams.configdbs.type() == ConnectionString::SYNC) && - !(mongosGlobalParams.configdbs.type() == ConnectionString::SET && - configServers.size() == 1)) { - return Status(ErrorCodes::BadValue, - "Must have either 3 node old-style config servers, or a single server " - "replica set config server"); + if (mongosGlobalParams.configdbs.type() != ConnectionString::SYNC && + mongosGlobalParams.configdbs.type() != ConnectionString::SET) { + return Status( + ErrorCodes::BadValue, + "Must have either 3 node legacy config servers, or a replica set config server"); } if (configServers.size() < 3) { 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()); |