summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSpencer T Brody <spencer@mongodb.com>2015-07-15 15:30:30 -0400
committerSpencer T Brody <spencer@mongodb.com>2015-07-23 10:51:50 -0400
commitac6ebf125d320e1c5542ac91a86b3b159ae5945d (patch)
treebbca2a55900b393ac2b36d5aa1ab1725a3bdea96 /src
parent84921ca797830b4adaedae01a4357d2bfccfb0a6 (diff)
downloadmongo-ac6ebf125d320e1c5542ac91a86b3b159ae5945d.tar.gz
SERVER-19414 Use CatalogManagerReplicaSet when config servers are a replica set
Diffstat (limited to 'src')
-rw-r--r--src/mongo/s/SConscript2
-rw-r--r--src/mongo/s/catalog/legacy/catalog_manager_legacy.cpp7
-rw-r--r--src/mongo/s/catalog/replset/catalog_manager_replica_set.cpp8
-rw-r--r--src/mongo/s/catalog/replset/replset_dist_lock_manager.cpp4
-rw-r--r--src/mongo/s/catalog/replset/replset_dist_lock_manager.h5
-rw-r--r--src/mongo/s/mongos_options.cpp11
-rw-r--r--src/mongo/s/sharding_initialization.cpp40
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());