diff options
author | Kshitij Gupta <kshitij.gupta@mongodb.com> | 2022-11-18 20:43:33 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-11-18 21:13:11 +0000 |
commit | e489daae84158a122a12acca26f804f58bf921b4 (patch) | |
tree | 921f33aaf61f405d3ef1d02e72f4a5f8b464cb60 /buildscripts/resmokelib | |
parent | 45400e2540977847771a1172de82a01fb12ec8b4 (diff) | |
download | mongo-e489daae84158a122a12acca26f804f58bf921b4.tar.gz |
SERVER-71448: Add resmoke option for optional config server.
Diffstat (limited to 'buildscripts/resmokelib')
-rw-r--r-- | buildscripts/resmokelib/config.py | 4 | ||||
-rw-r--r-- | buildscripts/resmokelib/configure_resmoke.py | 2 | ||||
-rw-r--r-- | buildscripts/resmokelib/run/__init__.py | 4 | ||||
-rw-r--r-- | buildscripts/resmokelib/testing/fixtures/_builder.py | 16 | ||||
-rw-r--r-- | buildscripts/resmokelib/testing/fixtures/shardedcluster.py | 13 | ||||
-rw-r--r-- | buildscripts/resmokelib/utils/__init__.py | 19 |
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 |