Fix logical error exception in getConsistentMetadataSnapshotImpl when log pointer goes backwards by alexey-milovidov · Pull Request #100651 · ClickHouse/ClickHouse · GitHub
Skip to content

Fix logical error exception in getConsistentMetadataSnapshotImpl when log pointer goes backwards#100651

Open
alexey-milovidov wants to merge 85 commits into
masterfrom
fix-backup-max-log-ptr-assertion
Open

Fix logical error exception in getConsistentMetadataSnapshotImpl when log pointer goes backwards#100651
alexey-milovidov wants to merge 85 commits into
masterfrom
fix-backup-max-log-ptr-assertion

Conversation

@alexey-milovidov

@alexey-milovidov alexey-milovidov commented Mar 24, 2026

Copy link
Copy Markdown
Member

The chassert(max_log_ptr == new_max_log_ptr) in getConsistentMetadataSnapshotImpl fires when a DatabaseReplicated is dropped and recreated during a backup operation. The initial max_log_ptr is read from the old database, but after recreation the new database has a smaller log pointer, causing the assertion to fail.

Throw CANNOT_GET_REPLICATED_DATABASE_SNAPSHOT instead, since the database that was asked to back up no longer exists; the new database (with the same name but different identity) should not be silently substituted.

CI report: https://s3.amazonaws.com/clickhouse-test-reports/json.html?PR=100641&sha=c7c8447120affec1e60b8c7c6380dab230aa9439&name_0=PR&name_1=Stateless%20tests%20%28amd_debug%2C%20parallel%29
#100641

Changelog category (leave one):

  • Bug Fix (user-visible misbehavior in an official stable release)

Changelog entry (a user-readable short description of the changes that goes into CHANGELOG.md):

Fixed a LOGICAL_ERROR exception during backup of a Replicated database that is being dropped and recreated concurrently; such backups now fail cleanly with CANNOT_GET_REPLICATED_DATABASE_SNAPSHOT.

Documentation entry for user-facing changes

  • Documentation is written (mandatory for new features)

Note

Medium Risk
Changes snapshotting logic used by DatabaseReplicated backup and recovery to detect concurrent DROP DATABASE+recreate via Keeper czxid/log-pointer checks; incorrect handling could cause backup/recovery failures or wrong metadata selection, so it needs careful concurrency coverage but is scoped to this race.

Overview
Prevents DatabaseReplicated metadata snapshots (used by backups and lost-replica recovery) from crashing or silently reading from a recreated database instance when a concurrent DROP DATABASE removes and re-creates the same Keeper subtree.

getConsistentMetadataSnapshotImpl now pins database identity using /max_log_ptr’s czxid, converts multiple Keeper ZNONODE/rollback situations into a consistent CANNOT_GET_REPLICATED_DATABASE_SNAPSHOT error (replacing the previous chassert/retry-exhaustion behavior), and forwards an optional expected czxid from callers (getTablesForBackup, DatabaseReplicatedWorker::initializeReplication). A new PAUSEABLE_ONCE failpoint plus a stateless test were added to deterministically reproduce the drop+recreate race during backup.

Reviewed by Cursor Bugbot for commit 3439122. Bugbot is set up for automated code reviews on this repo. Configure here.

…en log pointer goes backwards

The `chassert(max_log_ptr == new_max_log_ptr)` assertion in
`getConsistentMetadataSnapshotImpl` fires when the database is recreated
between the initial `max_log_ptr` read and a subsequent loop iteration,
causing the log pointer to go backwards. Handle this case gracefully
by resetting `max_log_ptr` to the new (smaller) value and retrying.

https://s3.amazonaws.com/clickhouse-test-reports/json.html?PR=100641&sha=c7c8447120affec1e60b8c7c6380dab230aa9439&name_0=PR&name_1=Stateless%20tests%20%28amd_debug%2C%20parallel%29

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@clickhouse-gh

clickhouse-gh Bot commented Mar 24, 2026

Copy link
Copy Markdown
Contributor

@clickhouse-gh clickhouse-gh Bot added the pr-ci label Mar 24, 2026
The test concurrently runs backups and drops/recreates a
`DatabaseReplicated`, triggering the code path where `max_log_ptr` goes
backwards in `getConsistentMetadataSnapshotImpl`. Before the fix this
caused a logical error exception in debug builds.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Comment thread tests/queries/0_stateless/04057_backup_replicated_db_recreate.sh Outdated
alexey-milovidov and others added 12 commits March 25, 2026 21:16
The test was failing because `BACKUP ... ASYNC` outputs a result table
(id, status) to stdout, and `SYSTEM UNFREEZE` can also produce output.
Only stderr was being suppressed, so the extra stdout was mismatching
the reference file which expects only "1".

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…p IDs per worker

The `CREATE DATABASE ... ENGINE = Replicated(...)` outputs shard/replica info
to stdout, which leaked into the test output causing a reference mismatch.
Redirect both stdout and stderr to /dev/null for all DDL commands.

Also include `$BASHPID` in backup IDs to avoid collisions between the two
concurrent `do_backups` workers.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The test now checks that `system.backups` contains at least one entry
matching the test prefix, ensuring the stress scenario actually exercises
the target race condition rather than silently passing when all backup
attempts fail.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… failure

Under TSan, the concurrent `DROP DATABASE` prevents all backups from being
recorded in `system.backups` within the timeout. The real assertion of this
test is server liveness (no logical error exception), not that backups
succeeded, so downgrade the "no backups attempted" check to a warning.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Comment thread tests/queries/0_stateless/04057_backup_replicated_db_recreate.sh Outdated
Comment thread src/Databases/DatabaseReplicated.cpp
alexey-milovidov and others added 3 commits April 24, 2026 14:55
…trying

When `max_log_ptr` moves backwards in `getConsistentMetadataSnapshotImpl`, it
means the database was dropped and recreated as another instance. Silently
retrying with the new pointer would back up a different database than the
caller asked for, which is not what we want. Fail the operation cleanly with
`CANNOT_GET_REPLICATED_DATABASE_SNAPSHOT`.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ilure

The test wrote "Backups attempted: $BACKUP_COUNT" to stderr, which causes
`clickhouse-test` to mark the test as failed regardless of exit code. Since
the real assertion of this test is server liveness (via the final `SELECT 1`),
the informational echo is not needed.

CI report: https://s3.amazonaws.com/clickhouse-test-reports/json.html?PR=100651&sha=696e74894edee8cefebb95f235644482350ef933&name_0=PR&name_1=Stateless%20tests%20%28arm_asan_ubsan%2C%20flaky%20check%29

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread tests/queries/0_stateless/04057_backup_replicated_db_recreate.sh Outdated
…n backups

The test previously only asserted server liveness (`SELECT 1`), so a regression
of the original `chassert(max_log_ptr == new_max_log_ptr)` failure could go
undetected: the `chassert` raises a `LOGICAL_ERROR` exception that is silently
swallowed by `BACKUP ... ASYNC`, and the test could pass even if the regression
path was never exercised at all.

Now the test:
- counts successful `DROP DATABASE` cycles in `drop_and_recreate` and asserts
  that at least one full recreate completed, otherwise `max_log_ptr` cannot
  have moved backwards and the regression path is untested
- queries `system.backups` for any backup whose `error` contains
  `LOGICAL_ERROR` and asserts the count is `0`

Addresses review feedback on #100651
Comment thread tests/queries/0_stateless/04057_backup_replicated_db_recreate.sh
alexey-milovidov and others added 2 commits April 26, 2026 05:01
…reate, wait for backups

Under randomized settings (flaky check), the previous concurrent
`drop_and_recreate` background loop never completed a full
`DROP DATABASE`+recreate cycle within the 10 second timeout, so the test
deterministically printed `not recreated: 0` instead of the expected
`recreated`.

Restructure the test:

- Drive recreates in the foreground, synchronously. Backup workers stay
  in the background, so the race against `BACKUP ... ASYNC` is preserved
  while recreate cycles are guaranteed to make progress.
- Drop the 5-table `create_and_populate` loop down to a single table; one
  table is enough to advance `max_log_ptr`.
- Bump `TIMEOUT` from 10s to 30s.
- After the stress loops, poll `system.backups` until no row for this
  test's prefix is in `CREATING_BACKUP` before checking for
  `LOGICAL_ERROR`. `BACKUP ... ASYNC` only waits for submission, so the
  previous code could read `system.backups` while in-flight backups
  still had a chance to hit the regression path. Addresses reviewer
  feedback.

CI report: https://s3.amazonaws.com/clickhouse-test-reports/json.html?PR=100651&sha=cfdb1b3242dcfd23a58aaf77cd2eeb22e3cfab82&name_0=PR&name_1=Stateless%20tests%20%28amd_asan_ubsan%2C%20flaky%20check%29

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread tests/queries/0_stateless/04057_backup_replicated_db_recreate.sh Outdated
Comment thread tests/queries/0_stateless/04057_backup_replicated_db_recreate.sh
@alexey-milovidov

Copy link
Copy Markdown
Member Author

Merged current master (clean, no conflicts) and re-verified that DatabaseReplicated.cpp compiles against it; this also publishes a prior in-progress master merge. A fresh CI run is now in progress on ed87ad9.

The 4 reds on the previous run (49a51c6) were all on a single Stateless tests (arm_asan_ubsan, azure, parallel) job that ran out of memory — RSS pinned at the 53.69 GiB cap, the runner-wide total-memory flake class:

  • 00975_move_partition_merge_tree, 02741_hashed_dictionary_load_factor, 02136_scalar_read_rows_jsonMEMORY_LIMIT_EXCEEDED (Code 241); 00975 "Failed 0 out of 3 reruns".
  • 03611_table_function_file_like_permissions — cascade from the same OOM: the CREATE USER was killed under memory pressure, so the subsequent GRANT/REVOKE/auth failed with UNKNOWN_ROLE/AUTHENTICATION_FAILED.

None are related to this change, which touches only DatabaseReplicated/DatabaseReplicatedWorker/FailPoint and the backup tests (no Access/GRANT code).

@alexey-milovidov

Copy link
Copy Markdown
Member Author

The only red on this PR is 03135_keeper_client_find_commands in Fast test (arm_darwin), which is unrelated to this change (this PR only touches DatabaseReplicated backup/recovery metadata snapshotting).

Root cause is benign teardown noise: on macOS the keeper-client process logs a Net Exception: Socket is not connected (errno 57 / ENOTCONN) raised by Poco::Net::SocketImpl::shutdown inside Coordination::ZooKeeper::finalize while the ZooKeeper object is destroyed at process exit. The actual command output (find_super_nodes / find_big_family) is correct; the test only fails because the harness treats any stderr ("having stderror") as a failure, and keeper-client logs to stderr.

This is a low-frequency, arm_darwin-only flaky — play.clickhouse.com shows it failing 3 times in the last 30 days, all on Fast test (arm_darwin), across unrelated PRs:

day check PR
2026-06-13 Fast test (arm_darwin) #100651 (this PR)
2026-05-21 Fast test (arm_darwin) #101216
2026-05-17 Fast test (arm_darwin) #95657

Failed job: https://github.com/ClickHouse/ClickHouse/actions/runs/27466341242/job/81199164563
Report: https://s3.amazonaws.com/clickhouse-test-reports/json.html?PR=100651&sha=5370da39b454d590a5639759af8d993f1f5b4663&name_0=PR&name_1=Fast%20test%20%28arm_darwin%29

@groeneai, could you investigate this arm_darwin keeper-client teardown flaky and provide a fix in a separate PR? If a fix is already in progress, please link it here.

@groeneai

Copy link
Copy Markdown
Contributor

@alexey-milovidov Confirmed and fixed in a separate PR: #107438.

Root cause is exactly as you described. CIDB shows the same stack on all three Fast test (arm_darwin) hits (#100651, #101216, #95657), 0 master failures: on macOS shutdown() on an already-disconnected socket returns ENOTCONN; Poco::Net::SocketImpl::shutdown() throws NetException("Socket is not connected"); Coordination::ZooKeeper::finalize() catches it and logs via tryLogCurrentException(log) (defaults to ERROR); keeper-client sends ERROR to stderr, and the harness fails on stderr. Command output is correct.

Fix downgrades only e.code() == POCO_ENOTCONN to TRACE at both socket.shutdown() catch sites in ZooKeeperImpl.cpp (finalize + connect-cleanup), keeping ERROR for all other shutdown errors. Mirrors the existing POCO_ENOTCONN downgrade in HTTPServerConnection.cpp. Not reproducible on the Linux build box (ENOTCONN is macOS-only); verified there that the normal teardown path emits no stderr.

@alexey-milovidov

Copy link
Copy Markdown
Member Author

Merged current master into the branch (it was ~2863 commits behind; merge-base was 8 days old). The merge was clean — no conflicts.

master independently touched DatabaseReplicated.cpp since the merge-base, but only in dropTable (the "Fix infinite DROP retry loop for TimeSeries tables" change, #—), which is a different function from this PR's getConsistentMetadataSnapshotImpl / getTablesForBackup / recoverLostReplica / DatabaseReplicatedDDLWorker::initializeReplication. The two new PAUSEABLE_ONCE failpoints in FailPoint.cpp merged cleanly next to master's Fix failpoint. The net diff against master is unchanged (the same 10 files).

Verified: all three changed translation units (DatabaseReplicated.cpp, DatabaseReplicatedWorker.cpp, FailPoint.cpp) pass -fsyntax-only against the merged tree. The ZooKeeper / failpoint APIs this PR relies on (tryGetChildren, tryGet-with-Stat, pauseFailPoint) are unchanged in master.

The previous run on 5370da39 was green (no test failures). The only red earlier (03135_keeper_client_find_commands on Fast test (arm_darwin)) was an unrelated arm_darwin-only keeper-client teardown flaky, already fixed in #107438. A fresh CI run is now in progress on 99e6d4a.

pull Bot pushed a commit to Haofei/ClickHouse that referenced this pull request Jun 22, 2026
test_concurrent_reads runs 25 concurrent SELECT * queries against one
accumulating Iceberg table while 15 Spark writers commit in parallel, for
10 rounds. By default each SELECT fans out to ~max_threads (number of CPU
cores) internal read threads, so 25 simultaneous readers request hundreds
of threads at once. On a loaded CI shard this oversubscribes the global
thread pool: a single SELECT either gets starved past the 300s client
receive_timeout (Return code 159, seen on the asan/db-disk/old-analyzer 5/6
shard for PRs ClickHouse#100651 and ClickHouse#108049 and on master) or the server rejects the
query outright with CANNOT_SCHEDULE_TASK (Code 439, threads=1000, jobs=1000).

Pin max_threads=4 on the concurrent SELECT so the readers' aggregate thread
demand stays bounded. This does not change what the test verifies: all 25
readers still race all 15 writers across every round and the exact row-count
assertion is unchanged. Only the per-query intra-read parallelism is capped,
which is irrelevant to concurrent-read snapshot consistency.

Locally reproduced both directions on a debug build: pristine test fails at
round 2 with CANNOT_SCHEDULE_TASK; with the cap it passes all 10 rounds
(~150s).
@alexey-milovidov

Copy link
Copy Markdown
Member Author

Merged current master into the branch (it was ~464 commits behind and red). One trivial conflict in src/Databases/DatabaseReplicated.cpp — the FailPoints declaration block — resolved by keeping this PR's two PAUSEABLE_ONCE failpoints (database_replicated_pause_after_reading_log_pointer, database_replicated_pause_after_snapshot_identity_check) alongside master's new database_replicated_throw_on_stop_replication. The net diff against master is unchanged (the same 10 files), and there were no test-number collisions for 04057 / 04309 / 04320.

Build: all three changed translation units (FailPoint.cpp, DatabaseReplicated.cpp, DatabaseReplicatedWorker.cpp) compile cleanly against the merged tree.

CI failure (unrelated): The only red check is Upgrade check (amd_release)Error message in clickhouse-server.log, with PostgreSQLConnectionPool: Connection error: connection to server at "192.0.2.1" ... timeout expired from DatabasePostgreSQL::removeOutdatedTables. This is unrelated to this PR, which touches only DatabaseReplicated backup/recovery snapshotting (no PostgreSQL code). It originates from test 04210_show_remote_databases_in_system_tables, which creates remote MySQL/PostgreSQL database engines pointing at the documentation IP 192.0.2.1; the background cleanup task logs connection errors that the upgrade check's log scan flags. CIDB shows it firing across 8 distinct PRs on 2026-06-29 alone (0 on master). It is already being fixed in #108560.

A fresh CI run is now in progress on 8bad9dcaf1f.

@alexey-milovidov

Copy link
Copy Markdown
Member Author

Merged current master into the branch (it was 154 commits behind; merge-base ~1 day old). The merge was clean — no conflicts, and the net diff against master is unchanged (the same 10 files, +674/-23). The two PAUSEABLE_ONCE failpoints and the rollback-guard changes in DatabaseReplicated.cpp carried over without conflict.

Build: all three changed translation units (FailPoint.cpp, DatabaseReplicated.cpp, DatabaseReplicatedWorker.cpp) pass -fsyntax-only against the merged tree. No test-number collisions for 04057 / 04309 / 04320 (they coexist with same-prefix siblings under unique full names).

CI failures (unrelated): the previous run (8bad9dca) was green except for three Stress test jobs (amd_tsan, arm_asan_ubsan, s3, arm_tsan), all failing on Hung check failed, possible deadlock found. This is the chronic master-wide hung-check flake tracked in #107941 — the CI summary attributes all three to that issue, and the stacks are in unrelated areas (AST fuzzer InterpreterSelectQueryAnalyzer / PullingAsyncPipelineExecutor), not in DatabaseReplicated backup/recovery snapshotting. Not caused by this PR.

Resolved the remaining @tavplubix thread on the backwards-log-pointer case: the rollback guard now throws CANNOT_GET_REPLICATED_DATABASE_SNAPSHOT rather than backing up the dropped/recreated database, exactly as suggested.

AI Review verdict on 8bad9dca was ✅ Approve. A fresh CI run is now in progress on 3a6cca8886b.

Comment thread src/Databases/DatabaseReplicated.cpp
@groeneai groeneai mentioned this pull request Jun 30, 2026
1 task
@alexey-milovidov

Copy link
Copy Markdown
Member Author

Re-checked CI and reviews on 3a6cca88.

CI: MERGEABLE / UNSTABLE. The only reds are two Stress test jobs (amd_tsan, arm_tsan) on Hung check failed, possible deadlock found. The CI summary attributes both to the chronic master-wide hung-check flake #107941 (OPEN), and the captured stacks are unrelated to this change — amd_tsan is QueryAnalyzer::resolveFunction/resolveExpressionNodeList recursion (deep-nested-literal analyzer fuzz) and arm_tsan is executeASTFuzzerQueriesTCPHandler. Neither stack contains any DatabaseReplicated/backup frame. Not caused by this PR.

No master re-merge: the branch is ~96 commits behind but the merge-base is from today (2026-06-29 23:39Z, <1 day), there are no conflicts, and the two reds are flakes a merge cannot fix.

AI Review verdict (⚠️ Request changes, DatabaseReplicated.cpp:2776): the required action allows either closing the pre-first-read identity window or documenting why the backup collector cannot end up snapshotting a substituted/recreated database. I traced the backup path and chose the latter — the window is real at the code level but benign:

  • BackupEntriesCollector re-looks-up the DatabasePtr from DatabaseCatalog on every consistency attempt (tryGatherMetadataAndCompareWithPrevious clears the maps at BackupEntriesCollector.cpp:276-277, then re-runs gatherDatabaseMetadata :453/:457), so a stale object never persists across attempts.
  • compareWithPrevious (:713-796) compares the formatted CREATE text of every database and table between consecutive attempts, and the written backup uses the last (consistent) attempt's data. A stable old-DDL+new-tables snapshot is therefore impossible: the transitional attempt mismatches its neighbours and triggers a retry, and the loop converges to a consistent snapshot of the current x (or fails with INCONSISTENT_METADATA_FOR_BACKUP at the deadline if x is being continuously recreated).
  • expected_max_log_ptr_czxid pins identity across the window that is internal to one operation (between the first /max_log_ptr read at :2776 and the reads inside getConsistentMetadataSnapshotImpl) — exactly the window that previously produced the chassert(max_log_ptr == new_max_log_ptr) LOGICAL_ERROR and torn intra-snapshot reads, now turned into a clean CANNOT_GET_REPLICATED_DATABASE_SNAPSHOT that the collector retries.

Full walk-through posted on the inline thread. The AI verdict on the byte-identical net diff one commit earlier (8bad9dca; 3a6cca88 is only a clean master merge, same +674/-23 / 10 files) was ✅ Approve, so this flip is on functionally identical code. My recommendation: no code change is required for correctness; pinning a construction-time czxid would only change name-addressed-backup semantics after an already-completed recreate (a separate, maintainer-level decision), not fix any defect in this PR.

No code pushed.

@alexey-milovidov

Copy link
Copy Markdown
Member Author

Re-checked CI and reviews on 3a6cca88; nothing material has changed since my previous status, so I re-triggered the two flaky Stress test jobs (amd_tsan, arm_tsan). Both failed only on Hung check failed, possible deadlock found, the chronic master-wide flake #107941 (OPEN); neither captured stack contains any DatabaseReplicated/backup frame (amd_tsan = QueryAnalyzer::resolveFunction recursion, arm_tsan = executeASTFuzzerQueriesTCPHandler). A fresh run is now in progress.

No master re-merge: the branch is ~195 commits behind but the merge-base is from yesterday (2026-06-29 23:39Z, <1 day), there are no conflicts, and the two reds are flakes a master merge cannot fix.

The single open review thread (DatabaseReplicated.cpp:2776, AI ⚠️ Request changes) remains satisfied via the verdict's explicit "or document why" alternative — see my traced reply on that thread; no code change is needed.

The AI review flagged a residual window in `getTablesForBackup`: if the
backup collector retained a stale `DatabaseReplicated` object and a
`DROP DATABASE`+recreate completes before the first `/max_log_ptr` read,
the captured `czxid` belongs to the new database and all in-function
identity checks compare new-to-new.

This window cannot make the *written* backup substitute a different
database, because `BackupEntriesCollector` bounds it across attempts:
it clears `database_infos`/`table_infos` and re-fetches a fresh
`DatabasePtr` from `DatabaseCatalog` on every attempt (so a stale object
never carries across attempts), and `compareWithPrevious` requires two
consecutive attempts to agree on both the database `CREATE` text and the
full table set. A transitional attempt mixing the stale object's old
`CREATE` (different UUID) with the recreated subtree's new tables
disagrees with the next all-new attempt and is discarded; the loop
converges to a consistent snapshot or fails with
`INCONSISTENT_METADATA_FOR_BACKUP` at the deadline.

Add a code comment capturing this invariant so the `czxid` pinning's
scope (the narrower intra-operation window) is clear to future readers.
No behavioral change.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@alexey-milovidov

Copy link
Copy Markdown
Member Author

Addressed the AI review's "⚠️ Request changes" verdict. Its minimum required action allowed either closing the pre-first-read identity window or documenting why the backup collector cannot end up snapshotting a recreated database — pushed fc34664b9b1, which takes the documentation route in code (comment-only, no behavioral change).

The new comment in getTablesForBackup records why the residual pre-first-read window is benign: BackupEntriesCollector re-gathers all metadata from scratch on every attempt (clears database_infos/table_infos and re-fetches a fresh DatabasePtr from DatabaseCatalog, so no stale object survives across attempts), and compareWithPrevious requires two consecutive attempts to agree on both the database CREATE text and the full table set. A transitional attempt mixing a stale object's old CREATE (different UUID) with the recreated subtree's new tables is therefore discarded; the loop converges to a consistent snapshot or fails with INCONSISTENT_METADATA_FOR_BACKUP. The czxid pinning only has to close the narrower intra-operation window. The verdict's alternative (pin identity at object construction to also reject backing up x after an already-completed recreate) is a separate name-addressed-backup semantics decision left as a maintainer call. Resolved the corresponding review thread.

CI: the only red was Stress test (arm_tsan)Hung check failed, possible deadlock found, the chronic master-wide flake #107941 (OPEN); the captured stack is an AST-fuzzer query with no DatabaseReplicated frames, unrelated to this change. A fresh CI run is now in progress on fc34664b9b1.

@clickhouse-gh

clickhouse-gh Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

LLVM Coverage Report

Metric Baseline Current Δ
Lines 85.40% 85.50% +0.10%
Functions 92.60% 92.70% +0.10%
Branches 77.70% 77.70% +0.00%

Changed lines: Changed C/C++ lines covered: 108/163 (66.26%) · Uncovered code

Full report · Diff report

@alexey-milovidov

Copy link
Copy Markdown
Member Author

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-bugfix Pull request with bugfix, not backported by default

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants