summaryrefslogtreecommitdiff
path: root/buildscripts/resmokelib
diff options
context:
space:
mode:
authorKshitij Gupta <kshitij.gupta@mongodb.com>2022-11-18 20:43:33 +0000
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2022-11-18 21:13:11 +0000
commite489daae84158a122a12acca26f804f58bf921b4 (patch)
tree921f33aaf61f405d3ef1d02e72f4a5f8b464cb60 /buildscripts/resmokelib
parent45400e2540977847771a1172de82a01fb12ec8b4 (diff)
downloadmongo-e489daae84158a122a12acca26f804f58bf921b4.tar.gz
SERVER-71448: Add resmoke option for optional config server.
Diffstat (limited to 'buildscripts/resmokelib')
-rw-r--r--buildscripts/resmokelib/config.py4
-rw-r--r--buildscripts/resmokelib/configure_resmoke.py2
-rw-r--r--buildscripts/resmokelib/run/__init__.py4
-rw-r--r--buildscripts/resmokelib/testing/fixtures/_builder.py16
-rw-r--r--buildscripts/resmokelib/testing/fixtures/shardedcluster.py13
-rw-r--r--buildscripts/resmokelib/utils/__init__.py19
6 files changed, 53 insertions, 5 deletions
diff --git a/buildscripts/resmokelib/config.py b/buildscripts/resmokelib/config.py
index 2566f367703..98b8d290ad1 100644
--- a/buildscripts/resmokelib/config.py
+++ b/buildscripts/resmokelib/config.py
@@ -57,6 +57,7 @@ DEFAULTS = {
"base_port": 20000,
"backup_on_restart_dir": None,
"buildlogger_url": "https://logkeeper2.build.10gen.cc",
+ "catalog_shard": None,
"continue_on_failure": False,
"dbpath_prefix": None,
"dbtest_executable": None,
@@ -300,6 +301,9 @@ DBTEST_EXECUTABLE = None
# actually running them).
DRY_RUN = None
+# If set, specifies which node is the catalog shard. Can also be set to 'any'.
+CATALOG_SHARD = None
+
# URL to connect to the Evergreen service.
EVERGREEN_URL = None
diff --git a/buildscripts/resmokelib/configure_resmoke.py b/buildscripts/resmokelib/configure_resmoke.py
index 3c99a241d35..3cf42fb3b0c 100644
--- a/buildscripts/resmokelib/configure_resmoke.py
+++ b/buildscripts/resmokelib/configure_resmoke.py
@@ -321,6 +321,8 @@ or explicitly pass --installDir to the run subcommand of buildscripts/resmoke.py
_config.NUM_CLIENTS_PER_FIXTURE = config.pop("num_clients_per_fixture")
_config.NUM_REPLSET_NODES = config.pop("num_replset_nodes")
_config.NUM_SHARDS = config.pop("num_shards")
+ _config.CATALOG_SHARD = utils.pick_catalog_shard_node(
+ config.pop("catalog_shard"), _config.NUM_SHARDS)
_config.PERF_REPORT_FILE = config.pop("perf_report_file")
_config.CEDAR_REPORT_FILE = config.pop("cedar_report_file")
_config.RANDOM_SEED = config.pop("seed")
diff --git a/buildscripts/resmokelib/run/__init__.py b/buildscripts/resmokelib/run/__init__.py
index 06afd159176..f807088483e 100644
--- a/buildscripts/resmokelib/run/__init__.py
+++ b/buildscripts/resmokelib/run/__init__.py
@@ -937,6 +937,10 @@ class RunPlugin(PluginInterface):
metavar="PATH",
help="Sets the seed used by storage config fuzzer")
+ mongodb_server_options.add_argument(
+ "--catalogShard", dest="catalog_shard", metavar="CONFIG",
+ help="If set, specifies which node is the catalog shard. Can also be set to 'any'.")
+
internal_options = parser.add_argument_group(
title=_INTERNAL_OPTIONS_TITLE,
description=("Internal options for advanced users and resmoke developers."
diff --git a/buildscripts/resmokelib/testing/fixtures/_builder.py b/buildscripts/resmokelib/testing/fixtures/_builder.py
index 448e8e91541..429d2253eaa 100644
--- a/buildscripts/resmokelib/testing/fixtures/_builder.py
+++ b/buildscripts/resmokelib/testing/fixtures/_builder.py
@@ -18,7 +18,7 @@ from buildscripts.resmokelib.testing.fixtures.replicaset import \
from buildscripts.resmokelib.testing.fixtures.shardedcluster import \
ShardedClusterFixture
from buildscripts.resmokelib.testing.fixtures.standalone import MongoDFixture
-from buildscripts.resmokelib.utils import autoloader, default_if_none
+from buildscripts.resmokelib.utils import autoloader, default_if_none, pick_catalog_shard_node
MONGO_REPO_LOCATION = "."
FIXTURE_DIR = "buildscripts/resmokelib/testing/fixtures"
@@ -402,14 +402,20 @@ class ShardedClusterBuilder(FixtureBuilder):
**kwargs)
is_multiversion = mixed_bin_versions is not None
- config_svr = self._new_configsvr(sharded_cluster, is_multiversion, old_bin_version)
- sharded_cluster.install_configsvr(config_svr)
for rs_shard_index in range(kwargs["num_shards"]):
rs_shard = self._new_rs_shard(sharded_cluster, mixed_bin_versions, old_bin_version,
rs_shard_index, kwargs["num_rs_nodes_per_shard"])
sharded_cluster.install_rs_shard(rs_shard)
+ catalog_shard = kwargs["catalog_shard"]
+ config_svr = None
+ if catalog_shard is None:
+ config_svr = self._new_configsvr(sharded_cluster, is_multiversion, old_bin_version)
+ else:
+ config_svr = sharded_cluster.shards[catalog_shard]
+ sharded_cluster.install_configsvr(config_svr)
+
for mongos_index in range(kwargs["num_mongos"]):
mongos = self._new_mongos(sharded_cluster, mongos_executables, mongos_classes,
mongos_index, kwargs["num_mongos"], is_multiversion)
@@ -439,6 +445,10 @@ class ShardedClusterBuilder(FixtureBuilder):
config.DEFAULT_MONGOS_EXECUTABLE)
kwargs["mongos_executable"] = mongos_executable
+ catalog_shard = pick_catalog_shard_node(
+ kwargs.pop("catalog_shard", config.CATALOG_SHARD), num_shards)
+ kwargs["catalog_shard"] = catalog_shard
+
@staticmethod
def _validate_multiversion_options(kwargs: Dict[str, Any],
mixed_bin_versions: Optional[List[str]]) -> None:
diff --git a/buildscripts/resmokelib/testing/fixtures/shardedcluster.py b/buildscripts/resmokelib/testing/fixtures/shardedcluster.py
index 7de0c37ba08..50df2abb1bf 100644
--- a/buildscripts/resmokelib/testing/fixtures/shardedcluster.py
+++ b/buildscripts/resmokelib/testing/fixtures/shardedcluster.py
@@ -24,7 +24,7 @@ class ShardedClusterFixture(interface.Fixture):
preserve_dbpath=False, num_shards=1, num_rs_nodes_per_shard=1, num_mongos=1,
enable_sharding=None, enable_balancer=True, enable_autosplit=True,
auth_options=None, configsvr_options=None, shard_options=None,
- cluster_logging_prefix=None):
+ cluster_logging_prefix=None, catalog_shard=None):
"""Initialize ShardedClusterFixture with different options for the cluster processes."""
interface.Fixture.__init__(self, logger, job_num, fixturelib, dbpath_prefix=dbpath_prefix)
@@ -42,6 +42,7 @@ class ShardedClusterFixture(interface.Fixture):
mongod_options.get("set_parameters", {})).copy()
self.mongod_options["set_parameters"]["migrationLockAcquisitionMaxWaitMS"] = \
self.mongod_options["set_parameters"].get("migrationLockAcquisitionMaxWaitMS", 30000)
+ self.catalog_shard = catalog_shard
self.preserve_dbpath = preserve_dbpath
self.num_shards = num_shards
self.num_rs_nodes_per_shard = num_rs_nodes_per_shard
@@ -91,7 +92,8 @@ class ShardedClusterFixture(interface.Fixture):
def setup(self):
"""Set up the sharded cluster."""
- self.configsvr.setup()
+ if self.catalog_shard is None:
+ self.configsvr.setup()
# Start up each of the shards
for shard in self.shards:
@@ -234,6 +236,8 @@ class ShardedClusterFixture(interface.Fixture):
teardown_handler.teardown(mongos, "mongos", mode=mode)
for shard in self.shards:
+ if shard is self.configsvr:
+ continue
teardown_handler.teardown(shard, "shard", mode=mode)
if self.configsvr is not None:
@@ -335,6 +339,11 @@ class ShardedClusterFixture(interface.Fixture):
mongod_options["dbpath"] = os.path.join(self._dbpath_prefix, "shard{}".format(index))
mongod_options["replSet"] = self._SHARD_REPLSET_NAME_PREFIX + str(index)
+ if self.catalog_shard == index:
+ del mongod_options["shardsvr"]
+ mongod_options["configsvr"] = ""
+ replset_config_options["configsvr"] = True
+
shard_logging_prefix = self._get_rs_shard_logging_prefix(index)
return {
diff --git a/buildscripts/resmokelib/utils/__init__.py b/buildscripts/resmokelib/utils/__init__.py
index 7658a415fa6..c1054af800c 100644
--- a/buildscripts/resmokelib/utils/__init__.py
+++ b/buildscripts/resmokelib/utils/__init__.py
@@ -1,6 +1,7 @@
"""Helper functions."""
import contextlib
+import random
import re
import sys
@@ -89,3 +90,21 @@ def get_task_name_without_suffix(task_name, variant_name):
"""
task_name = task_name if task_name else ""
return re.sub(fr"(_[0-9]+)?(_{variant_name})?$", "", task_name)
+
+
+def pick_catalog_shard_node(catalog_shard, num_shards):
+ """Get catalog_shard node index or None if no catalog_shard."""
+ if catalog_shard is None:
+ return None
+
+ if num_shards is None or int(num_shards) <= 0:
+ raise ValueError("Num shards > 0 for catalog shard to exist")
+
+ if catalog_shard == "any":
+ return random.randrange(0, num_shards)
+
+ catalog_shard_index = int(catalog_shard)
+ if catalog_shard_index < 0 or catalog_shard_index >= num_shards:
+ raise ValueError("Catalog shard value must be in range 0..num_shards-1 or \"any\"")
+
+ return catalog_shard_index