This is an automated email from the ASF dual-hosted git repository. mck pushed a commit to branch trunk in repository https://gitbox.apache.org/repos/asf/cassandra-dtest.git
The following commit(s) were added to refs/heads/trunk by this push: new 4f6f06c6 For upgrade tests correctly use cassandra_version over version, and set protocol_version to highest source version supports 4f6f06c6 is described below commit 4f6f06c66e4247072bda6587db52e4dc24dfb784 Author: mck <m...@apache.org> AuthorDate: Wed Apr 9 09:35:51 2025 +0200 For upgrade tests correctly use cassandra_version over version, and set protocol_version to highest source version supports Assumption is made that the source version on an upgrade path cannot support a higher protocol_version than the destination version. Also upgrade tests default to SimpleSnitch, regardless of cluster's default config, can be overridden by each test. patch by Mick Semb Wever; reviewed by Berenguer Blasi for CASSANDRA-20536 --- dtest_setup.py | 36 ++++++++++++++++++++++++------------ upgrade_tests/upgrade_base.py | 32 ++++++++++++++++++++++++++------ 2 files changed, 50 insertions(+), 18 deletions(-) diff --git a/dtest_setup.py b/dtest_setup.py index 3980259b..f2f70d9a 100644 --- a/dtest_setup.py +++ b/dtest_setup.py @@ -17,7 +17,8 @@ from cassandra.cluster import NoHostAvailable from cassandra.cluster import EXEC_PROFILE_DEFAULT from cassandra.policies import WhiteListRoundRobinPolicy from ccmlib.common import is_win -from ccmlib.cluster import Cluster +from ccmlib.cluster import Cluster, NodeError +from ccmlib.extension import get_cluster_class from dtest import (get_ip_from_node, make_execution_profile, get_auth_provider, get_port_from_node, get_eager_protocol_version, hack_legacy_parsing) @@ -94,12 +95,12 @@ class DTestSetup(object): def install_nodetool_legacy_parsing(self): """ Install nodetool legacy parsing on the cluster """ - if self.cluster.version() < LooseVersion('3.11.13'): - logger.debug("hacking nodetool for legacy parsing on {}".format(self.cluster.version())) + if self.cluster.cassandra_version() < LooseVersion('3.11.13'): + logger.debug("hacking nodetool for legacy parsing on {}".format(self.cluster.cassandra_version())) for node in self.cluster.nodelist(): self.install_legacy_parsing(node) else: - logger.debug("not modifying nodetool on version {}".format(self.cluster.version())) + logger.debug("not modifying nodetool on version {}".format(self.cluster.cassandra_version())) def set_ignore_log_patterns(self, other): if self._ignore_log_patterns == None: @@ -240,7 +241,7 @@ class DTestSetup(object): port = get_port_from_node(node) if protocol_version is None: - protocol_version = get_eager_protocol_version(node.cluster.version()) + protocol_version = get_eager_protocol_version(node.cluster.cassandra_version()) if user is not None: auth_provider = get_auth_provider(user=user, password=password) @@ -439,7 +440,7 @@ class DTestSetup(object): phi_values = {'phi_convict_threshold': 5} # enable read time tracking of repaired data between replicas by default - if self.cluster.version() >= '4': + if self.cluster.cassandra_version() >= '4': repaired_data_tracking_values = {'repaired_data_tracking_for_partition_reads_enabled': 'true', 'repaired_data_tracking_for_range_reads_enabled': 'true', 'report_unconfirmed_repaired_data_mismatches': 'true'} @@ -461,10 +462,10 @@ class DTestSetup(object): if self.setup_overrides is not None and len(self.setup_overrides.cluster_options) > 0: values = merge_dicts(values, self.setup_overrides.cluster_options) - # No more thrift in 4.0, and start_rpc doesn't exists anymore - if self.cluster.version() >= '4' and 'start_rpc' in values: + # No more thrift in 4.0, and start_rpc doesn't exist anymore + if self.cluster.cassandra_version() >= '4' and 'start_rpc' in values: del values['start_rpc'] - if self.cluster.version() >= '4': + if self.cluster.cassandra_version() >= '4': values['corrupted_tombstone_strategy'] = 'exception' if self.dtest_config.use_vnodes: @@ -480,6 +481,15 @@ class DTestSetup(object): self.cluster.set_configuration_options(values) logger.debug("Done setting configuration options:\n" + pprint.pformat(self.cluster._config_options, indent=4)) + def prune_unsupported_config(self): + """Remove unsupported configuration options. Applicable for upgrade tests. """ + if self.cluster.cassandra_version() < LooseVersion('4.0.1'): + if self.cluster._config_options is not None: + self.cluster._config_options.pop('repaired_data_tracking_for_partition_reads_enabled', None) + self.cluster._config_options.pop('repaired_data_tracking_for_range_reads_enabled', None) + self.cluster._config_options.pop('report_unconfirmed_repaired_data_mismatches', None) + self.cluster._config_options.pop('corrupted_tombstone_strategy', None) + def maybe_setup_jacoco(self, cluster_name='test'): """Setup JaCoCo code coverage support""" @@ -510,13 +520,14 @@ class DTestSetup(object): @staticmethod def create_ccm_cluster(dtest_setup): - logger.info("cluster ccm directory: " + dtest_setup.test_path) version = dtest_setup.dtest_config.cassandra_version + cluster_class = get_cluster_class(dtest_setup.dtest_config.cassandra_dir) + logger.info("cluster ccm directory: {} from {} type {} version {}".format(dtest_setup.test_path, dtest_setup.dtest_config.cassandra_dir, cluster_class, version)) if version: - cluster = Cluster(dtest_setup.test_path, dtest_setup.cluster_name, cassandra_version=version) + cluster = cluster_class(dtest_setup.test_path, dtest_setup.cluster_name, version=version) else: - cluster = Cluster(dtest_setup.test_path, dtest_setup.cluster_name, cassandra_dir=dtest_setup.dtest_config.cassandra_dir) + cluster = cluster_class(dtest_setup.test_path, dtest_setup.cluster_name, install_dir=dtest_setup.dtest_config.cassandra_dir) cluster.set_datadir_count(dtest_setup.dtest_config.data_dir_count) cluster.set_environment_variable('CASSANDRA_LIBJEMALLOC', dtest_setup.dtest_config.jemalloc_path) @@ -568,3 +579,4 @@ class DTestSetup(object): version that may not be compatible with the existing configuration options """ self.init_default_config() + self.prune_unsupported_config() diff --git a/upgrade_tests/upgrade_base.py b/upgrade_tests/upgrade_base.py index 30f51b25..92e12b37 100644 --- a/upgrade_tests/upgrade_base.py +++ b/upgrade_tests/upgrade_base.py @@ -1,13 +1,15 @@ from distutils.version import LooseVersion +import logging +import pytest import os +import shutil import sys import time -import pytest -import logging from abc import ABCMeta +from ccmlib import extension, repository from ccmlib.common import get_version_from_build, is_win from .upgrade_manifest import CASSANDRA_4_0 @@ -81,11 +83,18 @@ class UpgradeTester(Tester, metaclass=ABCMeta): assert nodes, 2 >= "backwards compatibility tests require at least two nodes" - self.protocol_version = protocol_version + self.protocol_version = protocol_version if protocol_version is not None else self.UPGRADE_PATH.starting_meta.max_proto_v cluster = self.cluster cluster.set_install_dir(version=self.UPGRADE_PATH.starting_version) + + install_dir_class = extension.get_cluster_class(cluster.get_install_dir()) + if cluster.__class__ != install_dir_class: + logger.info("changing cluster type to {} (from {} bc {})".format(install_dir_class, cluster.__class__, cluster.get_install_dir())) + cluster.__class__ = install_dir_class + cluster._cassandra_version = cluster.dse_username = cluster.dse_password = None + self.install_nodetool_legacy_parsing() self.fixture_dtest_setup.reinitialize_cluster_for_different_version() @@ -102,7 +111,7 @@ class UpgradeTester(Tester, metaclass=ABCMeta): if start_rpc: cluster.set_configuration_options(values={'start_rpc': True}) - cluster.set_configuration_options(values={'internode_compression': 'none'}) + cluster.set_configuration_options(values={'internode_compression': 'none', 'endpoint_snitch': 'SimpleSnitch'}) if extra_config_options: cluster.set_configuration_options(values=extra_config_options) @@ -113,10 +122,11 @@ class UpgradeTester(Tester, metaclass=ABCMeta): node1 = cluster.nodelist()[0] time.sleep(0.2) + logger.info("nodes started on {}, connecting with protocol_version: {}; cl: ".format(cluster.version(), self.protocol_version, cl)) if cl: - session = self.patient_cql_connection(node1, protocol_version=protocol_version, consistency_level=cl, **kwargs) + session = self.patient_cql_connection(node1, protocol_version=self.protocol_version, consistency_level=cl, **kwargs) else: - session = self.patient_cql_connection(node1, protocol_version=protocol_version, **kwargs) + session = self.patient_cql_connection(node1, protocol_version=self.protocol_version, **kwargs) if create_keyspace: create_ks(session, 'ks', rf) @@ -150,6 +160,15 @@ class UpgradeTester(Tester, metaclass=ABCMeta): node1.mark_log_for_errors() logger.debug('upgrading node1 to {}'.format(self.UPGRADE_PATH.upgrade_version)) + (install_dir, _) = repository.setup(self.UPGRADE_PATH.upgrade_version) + install_dir_class = extension.get_cluster_class(install_dir) + if self.cluster.__class__ != install_dir_class: + logger.info("changing cluster type to {} (from {} bc {})".format(install_dir_class, self.cluster.__class__, install_dir)) + self.cluster.__class__ = install_dir_class + self.cluster._cassandra_version = self.cluster.dse_username = self.cluster.dse_password = None + old_conf = node1.get_conf_dir() + node1.__class__ = install_dir_class.getNodeClass() + shutil.copytree(old_conf, node1.get_conf_dir()) node1.set_install_dir(version=self.UPGRADE_PATH.upgrade_version) self.install_legacy_parsing(node1) @@ -175,6 +194,7 @@ class UpgradeTester(Tester, metaclass=ABCMeta): node1.start(wait_for_binary_proto=True) + logger.info("node1 started on {}, connecting with protocol_version: {}; cl: ".format(new_version_from_build, self.protocol_version, self.CL)) sessions_and_meta = [] if self.CL: session = self.patient_exclusive_cql_connection(node1, protocol_version=self.protocol_version, consistency_level=self.CL, **kwargs) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@cassandra.apache.org For additional commands, e-mail: commits-h...@cassandra.apache.org