diff --git a/.github/workflows/run-regression-high-performance.yml b/.github/workflows/run-regression-high-performance.yml index 75aff3b90..7a7bce3fc 100644 --- a/.github/workflows/run-regression-high-performance.yml +++ b/.github/workflows/run-regression-high-performance.yml @@ -233,7 +233,7 @@ jobs: with: suite_name: aggregate_functions part: 1 - timeout_minutes: 180 + timeout_minutes: 360 runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} @@ -269,7 +269,7 @@ jobs: with: suite_name: aggregate_functions part: 3 - timeout_minutes: 240 + timeout_minutes: 360 runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} @@ -303,11 +303,11 @@ jobs: with: suite_name: alter job_name: alter_replace_partition - timeout_minutes: 180 + timeout_minutes: 360 storage_path: /replace_partition regression_args: '--only "/alter/replace partition/*"' artifact_name: alter-replace-partition-artifacts - runner_type: ${{ inputs.arch == 'arm64' && 'type-cax31-cax41' || 'type-cx53-cpx52' }} + runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} version: ${{ inputs.version }} @@ -496,6 +496,7 @@ jobs: part: ${{ matrix.part }} timeout_minutes: 180 storage_path: /no_ssl + runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} version: ${{ inputs.version }} @@ -520,6 +521,7 @@ jobs: storage_path: /ssl regression_args: '--ssl' artifact_name: clickhouse_keeper-ssl-artifacts + runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} version: ${{ inputs.version }} @@ -585,7 +587,7 @@ jobs: uses: ./.github/workflows/reusable-suite.yml with: suite_name: disk_level_encryption - timeout_minutes: 180 + timeout_minutes: 300 runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-ccx33' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} @@ -667,6 +669,7 @@ jobs: with: suite_name: functions timeout_minutes: 180 + runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} version: ${{ inputs.version }} @@ -683,7 +686,7 @@ jobs: with: suite_name: iceberg part: 1 - timeout_minutes: 180 + timeout_minutes: 300 storage_path: /iceberg regression_args: '--only "/iceberg/iceberg engine/rest catalog/*" "/iceberg/s3 table function/*" "/iceberg/icebergS3 table function/*" "/iceberg/iceberg cache/*"' runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} @@ -703,7 +706,7 @@ jobs: with: suite_name: iceberg part: 2 - timeout_minutes: 180 + timeout_minutes: 300 storage_path: /iceberg regression_args: '--only "/iceberg/iceberg engine/glue catalog/*" "/iceberg/iceberg table engine/*"' runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} @@ -826,7 +829,7 @@ jobs: with: suite_name: ldap/role_mapping job_name: ldap_role_mapping - timeout_minutes: 180 + timeout_minutes: 360 artifact_name: ldap-role_mapping-artifacts ref: ${{ inputs.ref }} runner_type: ${{ inputs.arch == 'arm64' && 'type-cax31-cax41' || 'type-cx53-cpx52' }} @@ -844,8 +847,8 @@ jobs: uses: ./.github/workflows/reusable-suite.yml with: suite_name: lightweight_delete - timeout_minutes: 180 - runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-ccx33' }} + timeout_minutes: 300 + runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} version: ${{ inputs.version }} @@ -861,8 +864,8 @@ jobs: uses: ./.github/workflows/reusable-suite.yml with: suite_name: memory - timeout_minutes: 180 - runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-ccx33' }} + timeout_minutes: 360 + runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} version: ${{ inputs.version }} @@ -878,10 +881,10 @@ jobs: uses: ./.github/workflows/reusable-suite.yml with: suite_name: parquet - timeout_minutes: 180 + timeout_minutes: 300 storage_path: /no_s3 ref: ${{ inputs.ref }} - runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-ccx33' }} + runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} package: ${{ inputs.package }} version: ${{ inputs.version }} flags: ${{ inputs.flags }} @@ -921,6 +924,7 @@ jobs: storage_path: /aws_s3 regression_args: '--storage aws_s3 --aws-s3-bucket {{AWS_BUCKET}} --aws-s3-region {{AWS_REGION}} --aws-s3-key-id {{AWS_KEY_ID}} --aws-s3-access-key {{AWS_ACCESS_KEY}} --only "/parquet/aws s3/*"' artifact_name: parquet-aws-artifacts + runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} version: ${{ inputs.version }} @@ -1012,7 +1016,7 @@ jobs: uses: ./.github/workflows/reusable-suite.yml with: suite_name: rbac - timeout_minutes: 180 + timeout_minutes: 300 part: 1 runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} @@ -1030,7 +1034,7 @@ jobs: uses: ./.github/workflows/reusable-suite.yml with: suite_name: rbac - timeout_minutes: 180 + timeout_minutes: 300 part: 2 runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} @@ -1048,7 +1052,7 @@ jobs: uses: ./.github/workflows/reusable-suite.yml with: suite_name: rbac - timeout_minutes: 180 + timeout_minutes: 300 part: 3 runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} @@ -1291,7 +1295,7 @@ jobs: storage_path: /minio regression_args: '--storage minio' artifact_name: s3-minio-artifacts - runner_type: ${{ inputs.arch == 'arm64' && 'type-cax31-cax41' || 'type-cx53-cpx52' }} + runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} version: ${{ inputs.version }} @@ -1308,6 +1312,7 @@ jobs: with: suite_name: selects timeout_minutes: 180 + runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} version: ${{ inputs.version }} @@ -1356,7 +1361,7 @@ jobs: with: suite_name: ssl_server part: 1 - timeout_minutes: 180 + timeout_minutes: 300 runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-ccx33' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} @@ -1374,7 +1379,7 @@ jobs: with: suite_name: ssl_server part: 2 - timeout_minutes: 180 + timeout_minutes: 300 runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-cpx62' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} @@ -1392,7 +1397,7 @@ jobs: with: suite_name: ssl_server part: 3 - timeout_minutes: 180 + timeout_minutes: 300 runner_type: ${{ inputs.arch == 'arm64' && 'type-cax41' || 'type-ccx33' }} ref: ${{ inputs.ref }} package: ${{ inputs.package }} @@ -1447,7 +1452,7 @@ jobs: with: suite_name: tiered_storage job_name: tiered_storage_gcs - timeout_minutes: 180 + timeout_minutes: 360 storage_path: /gcs regression_args: '--with-s3gcs --gcs-uri {{GCS_URI}} --gcs-key-id {{GCS_KEY_ID}} --gcs-key-secret {{GCS_KEY_SECRET}}' artifact_name: tiered_storage-gcs-artifacts diff --git a/aggregate_functions/regression.py b/aggregate_functions/regression.py index 148d2c35b..a2722f434 100755 --- a/aggregate_functions/regression.py +++ b/aggregate_functions/regression.py @@ -872,17 +872,33 @@ def regression( order_by="tuple()", ) + with And("I increase query timeouts for sanitizer builds"): + if check_with_any_sanitizer(self): + default_query_settings = getsattr( + current().context, "default_query_settings", [] + ) + # Sanitizer builds (ASAN/TSAN/MSAN/UBSAN) are 5-10x slower; the heavy + # INSERTs with all data types in `populate tables with test data` + # can exceed the default 120s wait_for_async_insert_timeout on slower + # CI runners. receive/send_timeout cover network-level waits; + # wait_for_async_insert_timeout covers the server-side async insert + # flush ack which is what actually trips first under sanitizers. + default_query_settings.append(("receive_timeout", 900)) + default_query_settings.append(("send_timeout", 900)) + default_query_settings.append(("wait_for_async_insert_timeout", 900)) + self.context.default_query_settings = default_query_settings + with And("I populate tables with test data"): self.context.table.insert_test_data(cardinality=1, shuffle_values=False) self.context.table_extra_data.insert_test_data( cardinality=5, shuffle_values=True ) - with And("allow higher cpu_wait_ratio "): + with And("allow higher cpu_wait_ratio (increased for sanitizer builds)"): if check_clickhouse_version(">=25.4")(self): allow_higher_cpu_wait_ratio( - min_os_cpu_wait_time_ratio_to_throw=20, - max_os_cpu_wait_time_ratio_to_throw=30, + min_os_cpu_wait_time_ratio_to_throw=50, + max_os_cpu_wait_time_ratio_to_throw=100, ) with Feature("part 1"): diff --git a/aggregate_functions/tests/rankCorr.py b/aggregate_functions/tests/rankCorr.py index b8449400f..cc90f3efb 100644 --- a/aggregate_functions/tests/rankCorr.py +++ b/aggregate_functions/tests/rankCorr.py @@ -2,7 +2,7 @@ from helpers.datatypes import Float64 from helpers.tables import is_numeric, common_columns, unwrap -from helpers.common import check_clickhouse_version, check_current_cpu +from helpers.common import check_clickhouse_version, check_current_cpu, check_with_tsan from aggregate_functions.tests.steps import ( execute_query, permutations_with_replacement, @@ -68,8 +68,10 @@ def scenario(self, func="rankCorr({params})", table=None, snapshot_id=None): with Check("with group by"): snapshot_name_override = None - if "State" in self.name and "_binary" in getattr( - self.context, "clickhouse_path", "" + # TSAN produces same FP rounding as the binary build for rankCorrState. + if "State" in self.name and ( + "_binary" in getattr(self.context, "clickhouse_path", "") + or check_with_tsan(self) ): snapshot_name_override = ( current().name.replace("/part 3", "") + "_binary" diff --git a/alter/regression.py b/alter/regression.py index 297fa2cdd..1795646b4 100755 --- a/alter/regression.py +++ b/alter/regression.py @@ -34,6 +34,29 @@ def argparser(parser): xfails = { + # Data corruption bugs exposed by sanitizer builds + "/alter/attach partition/*": [ + ( + Fail, + "UNKNOWN_CODEC data corruption with sanitizers - needs investigation", + check_with_any_sanitizer, + ) + ], + "/alter/replace partition/*": [ + ( + Fail, + "UNKNOWN_CODEC data corruption with sanitizers - needs investigation", + check_with_any_sanitizer, + ) + ], + # Merge part UINT32_MAX overflow bug + "/alter/attach partition/*/optimize table * final/*": [ + ( + Fail, + "https://github.com/ClickHouse/ClickHouse/issues/69001 - Merge part UINT32_MAX overflow", + check_with_any_sanitizer, + ) + ], "/alter/replace partition/concurrent merges and mutations/mutations on unrelated partition": [ ( Fail, diff --git a/base_58/regression.py b/base_58/regression.py index 14f85fb5c..bcc0bedb8 100755 --- a/base_58/regression.py +++ b/base_58/regression.py @@ -10,11 +10,25 @@ from helpers.cluster import create_cluster from helpers.argparser import argparser, CaptureClusterArgs -from helpers.common import check_clickhouse_version, experimental_analyzer +from helpers.common import check_clickhouse_version, experimental_analyzer, check_with_any_sanitizer pr_70846 = "https://github.com/ClickHouse/ClickHouse/pull/70846" xfails = { + # Memory-delta assertions incompatible with sanitizer allocators + # (b58_decode_memory_usage > 0 fails under ASAN/MSAN). + "/base58/memory usage/*": [ + ( + Fail, + "Memory-delta assertions incompatible with sanitizer allocators", + check_with_any_sanitizer, + ), + ( + Error, + "Memory-delta assertions incompatible with sanitizer allocators", + check_with_any_sanitizer, + ), + ], "alias input/alias instead of table and column": [(Fail, "not implemented")], "/base58/unsupported types constant/Nullable(FixedString(3))/*": [ ( diff --git a/helpers/cluster.py b/helpers/cluster.py index 699492a82..07bfe2e24 100755 --- a/helpers/cluster.py +++ b/helpers/cluster.py @@ -630,7 +630,7 @@ def enable_thread_fuzzer(self): "export THREAD_FUZZER_pthread_mutex_unlock_AFTER_SLEEP_TIME_US=10000" ) - def wait_clickhouse_healthy(self, timeout=90, check_version=True, initial_delay=0): + def wait_clickhouse_healthy(self, timeout=600, check_version=True, initial_delay=0): with By(f"waiting until ClickHouse server on {self.name} is healthy"): for attempt in retries( timeout=timeout, delay=5, initial_delay=initial_delay @@ -782,7 +782,7 @@ def stop_clickhouse(self, timeout=300, safe=True, signal="TERM"): def start_clickhouse( self, - timeout=60, + timeout=600, wait_healthy=True, user=None, thread_fuzzer=False, @@ -843,9 +843,7 @@ def start_clickhouse( timeout=timeout, check_version=check_version, initial_delay=2 ) - def restart_clickhouse( - self, timeout=300, safe=True, wait_healthy=True, retry_count=5, user=None - ): + def restart_clickhouse(self, timeout=600, safe=True, wait_healthy=True, retry_count=5, user=None): """Restart ClickHouse server.""" self.stop_clickhouse(timeout=timeout, safe=safe) diff --git a/helpers/common.py b/helpers/common.py index 1da0e3421..a6f1b5752 100644 --- a/helpers/common.py +++ b/helpers/common.py @@ -56,7 +56,10 @@ def check(test): def check_with_ubsan(test): """Check if the build is with undefined behavior sanitizer (ubsan).""" if hasattr(test.context, "build_options"): - if "ubsan" in test.context.build_options.values(): + if any( + node_build_options.get("sanitizer") == "ubsan" + for node_build_options in test.context.build_options.values() + ): return True return False @@ -65,7 +68,10 @@ def check_with_ubsan(test): def check_with_tsan(test): """Check if the build is with thread sanitizer (tsan).""" if hasattr(test.context, "build_options"): - if "tsan" in test.context.build_options.values(): + if any( + node_build_options.get("sanitizer") == "tsan" + for node_build_options in test.context.build_options.values() + ): return True return False @@ -74,7 +80,10 @@ def check_with_tsan(test): def check_with_asan(test): """Check if the build is with address sanitizer (asan).""" if hasattr(test.context, "build_options"): - if "asan" in test.context.build_options.values(): + if any( + node_build_options.get("sanitizer") == "asan" + for node_build_options in test.context.build_options.values() + ): return True return False @@ -83,7 +92,10 @@ def check_with_asan(test): def check_with_msan(test): """Check if the build is with memory sanitizer (msan).""" if hasattr(test.context, "build_options"): - if "msan" in test.context.build_options.values(): + if any( + node_build_options.get("sanitizer") == "msan" + for node_build_options in test.context.build_options.values() + ): return True return False @@ -243,7 +255,9 @@ def check_with_any_sanitizer(test): sanitizers = ["tsan", "asan", "ubsan", "msan"] if hasattr(test.context, "build_options"): return any( - sanitizer in test.context.build_options.values() for sanitizer in sanitizers + node_build_options.get("sanitizer") == sanitizer + for node_build_options in test.context.build_options.values() + for sanitizer in sanitizers ) return False @@ -256,7 +270,8 @@ def check_several_sanitizers_in_binary_link( def check(test): if hasattr(test.context, "build_options"): return any( - sanitizer in test.context.build_options.values() + node_build_options.get("sanitizer") == sanitizer + for node_build_options in test.context.build_options.values() for sanitizer in sanitizers ) return False diff --git a/iceberg/regression.py b/iceberg/regression.py index 74c17699c..f63b16c45 100755 --- a/iceberg/regression.py +++ b/iceberg/regression.py @@ -19,11 +19,34 @@ check_is_altinity_build, experimental_analyzer, check_if_antalya_build, + check_with_any_sanitizer, check_if_antalya_post_26_3_10_20001, ) xfails = { + # Server crashes with "Metadata is not initialized" during schema evolution with sanitizers + "/iceberg/iceberg engine/*/schema evolution/*": [ + ( + Fail, + "https://github.com/ClickHouse/ClickHouse/issues/86024 - Iceberg metadata initialization bug with sanitizers", + check_with_any_sanitizer, + ) + ], + # Logical error 'prewhere_info' on Iceberg row policies without PREWHERE (sanitizer-only chassert). + # Fixed upstream in CH#100361; not backported to stable-26.3. + "/iceberg/iceberg table engine/feature/row policies/*": [ + ( + Fail, + "https://github.com/ClickHouse/ClickHouse/pull/100361 - not backported to stable-26.3", + check_with_any_sanitizer, + ), + ( + Error, + "https://github.com/ClickHouse/ClickHouse/pull/100361 - not backported to stable-26.3", + check_with_any_sanitizer, + ), + ], "/iceberg/export partition/*/manifest integrity/value_counts across data files sum to source row count": [ ( Fail, @@ -307,6 +330,11 @@ } ffails = { + "/iceberg/iceberg engine/*": ( + Skip, + "Iceberg tests unstable with sanitizer builds (server startup issues)", + check_with_any_sanitizer, + ), "/iceberg/iceberg engine": ( Skip, "Iceberg engine was introduced in 24.12", diff --git a/kerberos/regression.py b/kerberos/regression.py index 01a2a55a4..ea767aeb7 100755 --- a/kerberos/regression.py +++ b/kerberos/regression.py @@ -8,13 +8,28 @@ from helpers.cluster import create_cluster from helpers.argparser import argparser, CaptureClusterArgs -from helpers.common import check_clickhouse_version, experimental_analyzer +from helpers.common import check_clickhouse_version, experimental_analyzer, check_with_msan from kerberos.requirements.requirements import * xfails = { "config/principal and realm specified/:": [ (Fail, "https://github.com/ClickHouse/ClickHouse/issues/26197") ], + # MSAN aborts on every kerberos request: bufferToString strips trailing + # NUL bytes from opaque AP-REP tokens, causing krb5 ASN.1 decoder to read + # uninitialized memory. Fixed upstream in CH#103114, not backported to stable-26.3. + "/kerberos/*": [ + ( + Fail, + "https://github.com/ClickHouse/ClickHouse/pull/103114 - not backported to stable-26.3", + check_with_msan, + ), + ( + Error, + "https://github.com/ClickHouse/ClickHouse/pull/103114 - not backported to stable-26.3", + check_with_msan, + ), + ], } ffails = { diff --git a/ontime_benchmark/tests/benchmark.py b/ontime_benchmark/tests/benchmark.py index b777d8fdf..ee8b080be 100644 --- a/ontime_benchmark/tests/benchmark.py +++ b/ontime_benchmark/tests/benchmark.py @@ -14,9 +14,12 @@ def insert_ontime_data(self, from_year, to_year, table_name, node=None): if node is None: node = self.context.node + # Sanitizer builds are 3-4x slower; bump ingest timeout accordingly. + query_timeout = 3600 if check_with_any_sanitizer(self) else 1200 + node.query( f"INSERT INTO {table_name} SELECT * FROM ontime_data WHERE Year BETWEEN {from_year} AND {to_year}", - timeout=1200, + timeout=query_timeout, ) @@ -27,6 +30,11 @@ def fetch_ontime_data(self, from_year, to_year, node=None): if node is None: node = self.context.node + # Sanitizer builds are 3-4x slower; bump CSV.gz ingest timeouts accordingly. + sanitized = check_with_any_sanitizer(self) + query_timeout = 3600 if sanitized else 1200 + receive_timeout = 1800 if sanitized else 600 + with Given("I create a table to store ontime data locally"): create_ontime_table( table_name="ontime_data", @@ -45,10 +53,10 @@ def fetch_ontime_data(self, from_year, to_year, node=None): node.query( f"INSERT INTO ontime_data " f"SELECT * FROM s3('https://clickhouse-public-datasets.s3.amazonaws.com/ontime/csv_by_year/{{{from_year}..{to_year}}}.csv.gz', CSVWithNames) " - "SETTINGS receive_timeout=600, " + f"SETTINGS receive_timeout={receive_timeout}, " "max_insert_threads=10, " # This affects memory more than it affects performance "max_memory_usage=29500000000;", # Runners have about this much available memory - timeout=1200, + timeout=query_timeout, ) diff --git a/parquet/regression.py b/parquet/regression.py index ec0773570..d492407bb 100755 --- a/parquet/regression.py +++ b/parquet/regression.py @@ -23,6 +23,7 @@ allow_higher_cpu_wait_ratio, check_if_not_antalya_build, check_if_antalya_build, + check_with_any_sanitizer, ) from parquet.tests.common import start_minio, parquet_test_columns @@ -501,6 +502,18 @@ def regression( max_os_cpu_wait_time_ratio_to_throw=20, ) + with And("I increase query timeouts for sanitizer builds"): + if check_with_any_sanitizer(self): + default_query_settings = getsattr( + current().context, "default_query_settings", [] + ) + # Heavy INSERTs exceed default 120s wait_for_async_insert_timeout on + # slow sanitizer runners (observed in parquet under MSAN/TSAN). + default_query_settings.append(("receive_timeout", 900)) + default_query_settings.append(("send_timeout", 900)) + default_query_settings.append(("wait_for_async_insert_timeout", 900)) + self.context.default_query_settings = default_query_settings + with And("I have a Parquet table definition"): columns = ( cluster.node("clickhouse1") diff --git a/rbac/regression.py b/rbac/regression.py index e87303c1e..910da864f 100755 --- a/rbac/regression.py +++ b/rbac/regression.py @@ -9,7 +9,7 @@ from helpers.cluster import create_cluster from helpers.argparser import argparser, CaptureClusterArgs -from helpers.common import check_clickhouse_version, experimental_analyzer +from helpers.common import check_clickhouse_version, experimental_analyzer, check_with_any_sanitizer from rbac.requirements import SRS_006_ClickHouse_Role_Based_Access_Control from rbac.helper.common import add_rbac_config_file @@ -257,8 +257,8 @@ ), "/rbac/part 1/privileges/system drop cache/compiled expression cache*": ( Skip, - "Not supportted in ARM builds", - (lambda test: platform.machine() == "aarch64"), + "JIT compilation disabled in ARM and sanitizer builds", + (lambda test: platform.machine() == "aarch64" or check_with_any_sanitizer(test)), ), "rbac/part 1/privileges/:/table_type='ReplicatedReplacingMergeTree-sharded_cluster": ( Skip, diff --git a/s3/tests/common.py b/s3/tests/common.py index c62cad9f3..d11f6f205 100644 --- a/s3/tests/common.py +++ b/s3/tests/common.py @@ -33,6 +33,10 @@ def add_config( if nodes is None: nodes = [cluster.node(node) for node in cluster.nodes["clickhouse"]] + # Sanitizer builds restart 3-4x slower; bump default config-reload timeout. + if check_with_any_sanitizer(current()) and timeout < 300: + timeout = 300 + def check_preprocessed_config_is_updated(after_removal=False): """Check that preprocessed config is updated.""" started = time.time() @@ -459,7 +463,7 @@ def remote_host_filter_config( config = create_remote_host_filter_config_content( urls, config_d_dir, config_file ) - return add_config(config, restart=restart) + return add_config(config, timeout=timeout, restart=restart) def create_s3_max_redirects_config_content( diff --git a/settings/regression.py b/settings/regression.py index dd048cedf..3d4ce11cf 100755 --- a/settings/regression.py +++ b/settings/regression.py @@ -10,9 +10,29 @@ CaptureClusterArgs, ) -from helpers.common import check_clickhouse_version, check_if_head, check_if_latest +from helpers.common import ( + check_clickhouse_version, + check_if_head, + check_if_latest, + check_with_any_sanitizer, +) xfails = { + # Profiler settings have different defaults in sanitizer builds (profilers disabled) + "/settings/default values/query_profiler_cpu_time_period_ns": [ + ( + Fail, + "Profilers are disabled in sanitizer builds", + check_with_any_sanitizer, + ) + ], + "/settings/default values/query_profiler_real_time_period_ns": [ + ( + Fail, + "Profilers are disabled in sanitizer builds", + check_with_any_sanitizer, + ) + ], "/settings/default values/parallel_replicas_mark_segment_size": [ ( Fail,