Skip to content

[feature](be) Count the changelog TTL cleanups in the BE metrics - #69868

Merged
morningman merged 1 commit into
apache:masterfrom
morningman:changelog-monitor-t6
Nov 2, 2026
Merged

morningman merged 1 commit into
apache:masterfrom
morningman:changelog-monitor-t6

Conversation

@morningman

@morningman morningman commented Oct 30, 2026 •

Copy link
Copy Markdown
Contributor

What problem does this PR solve?

Issue Number: #69907

Related PR: None

Problem Summary:

In short. The BEs clean up the changelog of a table by TTL, but /metrics cannot tell whether that cleanup runs, fails, or reclaims anything. This PR counts each cleanup on the BE as it finishes, in three new series: how many succeeded or failed, how many bytes of expired changelog they dropped, and when one last succeeded.

Background. A table with changelog.enable keeps its changelog in a hidden changelog index, and changelog.ttl_seconds bounds how long the changelog is kept. The BEs remove what is older than that in a cumulative compaction of a tablet of that index (a changelog tablet): rowsets whose commit TSO is at or before the TTL cutoff are left out of the merge, so the output replaces them without their rows. Two submitters start these compactions, both as CHANGELOG_COMPACTION: the changelog TTL scanner, for tablets it finds holding expired rowsets, and the regular compaction producer; either compaction picks expired rowsets first.

The problem, and what it cost.

  • No alert can watch the cleanup. The bvars changelog_ttl_discovered, changelog_ttl_submitted and changelog_ttl_failed are only on the brpc /vars page, and they count what the TTL scanner found and submitted, not what the compactions did: a cleanup that fails after it was submitted counts nowhere, and nothing counts the bytes removed.
  • The only changelog series in /metrics, compaction_task_state_total{type="changelog"}, is the number of changelog compactions running and pending. A cleanup that keeps failing lets the changelog grow without bound, and nothing on the BE says why.

How this PR fixes it.

  • Three series, counted as a compaction that drops expired changelog ends, and registered at startup so they exist from 0:
Series Type Labels Value
doris_be_changelog_ttl_cleanup_total counter result=success/failed the compactions that drop expired changelog rowsets, counted as each ends
doris_be_changelog_ttl_reclaimed_bytes_total counter the total disk size of the expired rowsets the successful ones dropped
doris_be_changelog_ttl_last_success_timestamp_seconds gauge when one last succeeded, in seconds since the epoch
  • A compaction is a cleanup when one of its inputs is expired changelog: at or below the visible version its TTL snapshot was taken at, with a commit TSO at or before the cutoff. That is exactly what filter_changelog_ttl_rowsets leaves out of the merge, and the two now ask one predicate, Compaction::is_expired_changelog_rowset, which pick_expired_changelog_rowset uses too. It is decided from the inputs rather than from what the merge filtered, so that a cleanup that fails before its merge, a cloud compaction that cannot refresh its tablet meta for example, is counted as failed.
  • Counted where the execution of the compaction ends: CumulativeCompaction::execute_compact in shared-nothing mode, CloudCumulativeCompaction::record_compaction_success and record_compaction_failure in cloud mode. A compaction that does not get to run has not started a cleanup and is not counted: one that finds the tablet under another cumulative compaction, whether in its preparation or as its execution takes the cumulative compaction lock again, and one whose job the meta service refuses.
  • In cloud mode the BE that runs the compaction counts it, so a query sums over the BEs; the shared storage is not measured. The dropped rowsets become stale rowsets, whose files the stale rowset sweep or the recycler deletes later; the bytes are counted when the rowsets leave the tablet.
  • The bvars stay as they are.

Results. Before this PR, the /metrics of a BE has none of these series. After it, on a local shared-nothing cluster, a table with changelog.ttl_seconds = 1 and two rows inserted (regression test_changelog_ttl_cleanup_metrics):

cleanup_total{result="success"} cleanup_total{result="failed"} reclaimed_bytes_total last_success_timestamp_seconds
BE started 0 0 0 0
once the changelog rows have been cleaned up 1 0 1112 the time of the cleanup

The 1112 bytes are what the BE logs for that changelog compaction: input_rowsets_total_size=1.09 KB, output_rowset_total_size=0, filtered_row_num=2.

Classes, and how they call each other.

  • DorisMetrics: the three series.
  • Compaction: is_expired_changelog_rowset (new), shared by pick_expired_changelog_rowset and filter_changelog_ttl_rowsets; record_changelog_ttl_cleanup (new) counts a cleanup from the inputs.
  • CumulativeCompaction, CloudCumulativeCompaction: call it as the execution ends.
CumulativeCompaction::execute_compact                      shared-nothing
  └─ CompactionMixin::execute_compact ─► merge: filter_changelog_ttl_rowsets ─┐
  └─ record_changelog_ttl_cleanup(ok)                                          │ is_expired_changelog_rowset
CloudCumulativeCompaction::execute_compact                 cloud               │
  └─ CloudCompactionMixin::execute_compact ─► merge: same filter ─────────────┤
  └─ record_compaction_success ─► record_changelog_ttl_cleanup(true)           │
     record_compaction_failure ─► record_changelog_ttl_cleanup(false)          │
                                    └─ DorisMetrics::changelog_ttl_* ◄─────────┘ (from the inputs)

Nothing else changes: no config, no thrift or proto change, and what the compactions pick and drop stays the same.

Release note

New BE metrics doris_be_changelog_ttl_cleanup_total{result}, doris_be_changelog_ttl_reclaimed_bytes_total and doris_be_changelog_ttl_last_success_timestamp_seconds.

Check List (For Author)

  • Test

    • Regression test
    • Unit Test
    • Manual test (add detailed scripts or steps below)
    • No need to test or manual test. Explain why:
      • This is a refactor/code format and no logic has been changed.
      • Previous test can cover this change.
      • No code files have been changed.
      • Other reason

    Unit test: CumulativeCompactionTest.TestRecordChangelogTtlCleanup checks what counts as a cleanup (not a compaction whose inputs hold no expired changelog, nor one that took no TTL snapshot; a rowset above the visible version of the snapshot, or an empty one, is not expired changelog) and that the reclaimed bytes are those of the rowsets filter_changelog_ttl_rowsets drops; CompactionMetricsTest.TestChangelogTtlCleanupCountedAsCompactionFinishes runs CumulativeCompaction::execute_compact up to its merge and checks a success and a failure; CloudCompactionTest.changelog_ttl_cleanup_counted_as_compaction_finishes does the same through record_compaction_success and record_compaction_failure. With the success hooks removed, the two that go through them fail. Together with the other compaction, changelog TTL and DorisMetrics suites, 114 cases pass and one is skipped outside Release.

    Regression test: changelog_p0/test_changelog_ttl_cleanup_metrics (nonConcurrent: it waits for the TTL to expire), on a local shared-nothing cluster; not run in cloud mode.

    Manual test: promtool check metrics on the /metrics of the BE reports no parsing error; the only finding on the new series is "no help text", which every BE series gets (the BE writes no HELP lines).

  • Behavior changed:

    • No.
    • Yes.
  • Does this need documentation?

    • No.
    • Yes. The doris-website change comes with the documentation of the changelog and IVM monitoring.

Check List (For Reviewer who merge this PR)

  • Confirm the release note
  • Confirm test cases
  • Confirm document
  • Add branch pick label

### What problem does this PR solve?

Issue Number: None

Related PR: None

Problem Summary:

The changelog of a table is cleaned up by TTL on the BEs: a cumulative compaction of a changelog tablet drops the
rowsets whose commit TSO is at or before the TTL cutoff instead of merging them. Nothing in /metrics says whether
this cleanup runs, fails, or how much it reclaims. The bvars changelog_ttl_discovered, _submitted and _failed are
only visible on the brpc /vars page and count what the TTL scanner found and submitted, not what the compactions
did: a cleanup that fails after it was submitted counts nowhere, and the bytes removed are not counted at all. The
only changelog series in /metrics, compaction_task_state_total{type="changelog"}, is the number of running and
pending changelog compactions. So a cleanup that keeps failing, which lets the changelog grow without bound, cannot
be alerted on.

This adds three BE metrics, counted where a cleanup finishes:

- doris_be_changelog_ttl_cleanup_total{result="success"|"failed"}: the compactions that drop expired changelog
  rowsets, counted as each one ends.
- doris_be_changelog_ttl_reclaimed_bytes_total: the total disk size of the expired rowsets the successful ones
  dropped.
- doris_be_changelog_ttl_last_success_timestamp_seconds: when one last succeeded.

A compaction is a cleanup when one of its inputs is expired changelog: at or below the visible version its TTL
snapshot was taken at, with a commit TSO at or before the cutoff. That is what filter_changelog_ttl_rowsets leaves
out of the merge, and the two now share one predicate, Compaction::is_expired_changelog_rowset, which
pick_expired_changelog_rowset uses as well. The decision is made from the inputs rather than from what the merge
filtered, so that a cleanup failing before its merge counts as a failure. It is counted as the execution of the
compaction ends, in CumulativeCompaction::execute_compact and in CloudCumulativeCompaction::record_compaction_success
and record_compaction_failure; a compaction that does not get past its preparation has not started a cleanup. It
does not matter whether the TTL scanner or the compaction producer submitted the compaction: both submit
CHANGELOG_COMPACTION, and either one picks expired rowsets first. In cloud mode the BE that runs the compaction
counts it, so a query sums over the BEs. The dropped rowsets become stale rowsets, and their files are deleted
later, by the stale rowset sweep or the recycler; the bytes are counted when the rowsets leave the tablet. The bvars
stay as they are.

### Release note

New BE metrics doris_be_changelog_ttl_cleanup_total{result}, doris_be_changelog_ttl_reclaimed_bytes_total and
doris_be_changelog_ttl_last_success_timestamp_seconds.

### Check List (For Author)

- Test: Unit Test, Regression test, Manual test
    - Unit Test: CumulativeCompactionTest.TestRecordChangelogTtlCleanup (what counts as a cleanup, and that the
      bytes are those of the rowsets filter_changelog_ttl_rowsets drops),
      CompactionMetricsTest.TestChangelogTtlCleanupCountedAsCompactionFinishes (through
      CumulativeCompaction::execute_compact, success and failure) and
      CloudCompactionTest.changelog_ttl_cleanup_counted_as_compaction_finishes; with the other compaction, changelog
      TTL and DorisMetrics suites, 114 cases pass and one is skipped outside Release. With the success hooks
      removed, the two cases that go through them fail.
    - Regression test: changelog_p0/test_changelog_ttl_cleanup_metrics (nonConcurrent) on a local shared-nothing
      cluster; not run in cloud mode
    - Manual test: on that cluster the four series are there from 0; after the cleanup of the regression table,
      success is 1 and the reclaimed bytes are 1112, the input_rowsets_total_size the BE logs for the changelog
      compaction that filtered both rows. promtool check metrics on the /metrics of the BE reports no parsing
      error; the only finding on the new series is "no help text", which every BE series gets.
- Behavior changed: No (new metrics)
- Does this need documentation: Yes (doris-website, with the other changelog and IVM monitoring docs)

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@hello-stephen

Copy link
Copy Markdown
Contributor

Thank you for your contribution to Apache Doris.
Don't know what should be done next? See How to process your PR.

Please clearly describe your PR:

  1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
  2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
  3. What features were added. Why was this function added?
  4. Which code was refactored and why was this part of the code refactored?
  5. Which functions were optimized and what is the difference before and after the optimization?

@morningman

Copy link
Copy Markdown
Contributor Author

/review

@morningman

Copy link
Copy Markdown
Contributor Author

run buildall

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewed the exact PR head 5c30820 against base 6991e76 using the authoritative diff. Three verified issues are included inline.

The feature goal is clear and the metric registration/export wiring is consistent: the grouped success/failed counter series, reclaimed-bytes counter, and timestamp gauge are registered once and use the expected Prometheus names. The local and cloud compaction flows were traced through selection, TTL filtering, merge/modify, commit/abort, and status propagation. No data-version, delete-bitmap, persistence, protocol, configuration, static-initialization, or memory-ownership regression was found.

Concurrency review found two issues: local cumulative execution can lose the reacquire lock after preparation and return before recording a failed TTL cleanup; and the process-wide last-success gauge uses an unconditional atomic store, so an older timestamp can overwrite a newer one when successful cleanups interleave. The tests also leave global TTL metric values modified in the monolithic doris_be_test process, making later tests order-dependent.

Testing and observability checkpoints were inspected statically. The changed BE tests, sync-point cleanup, regression scraper, metric labels, and backend aggregation were reviewed, but builds, unit tests, regression tests, benchmarks, and runtime endpoint checks were not executed under the review contract. The PR has no user-provided focus items and no existing inline P0/P1 findings to carry forward.

This bounded review reached round 3. Delivery is verified as a non-converged review: the latest assigned subagent set did not all return NO_NEW_VALUABLE_FINDINGS after the timestamp finding, and some follow-up passes were interrupted by model-capacity errors. Main-agent verification covered the full changed-file list and all remaining candidates; the residual limit is subagent consensus and lack of runtime execution evidence.

Review did not converge after 3 rounds. This automated review cannot pass the review check.

At the three-round cap, convergence was not reached: the latest assigned subagent set did not all return NO_NEW_VALUABLE_FINDINGS after the timestamp race was discovered, and R1/R4 follow-up passes were interrupted by temporary model-capacity errors. The main agent independently verified all candidates and the full changed-file list. Runtime builds, tests, regression execution, and live metric endpoint checks remain unexecuted because this contract is static-only.

SCOPED_ATTACH_TASK(_mem_tracker);

st = CompactionMixin::execute_compact();
record_changelog_ttl_cleanup(st.ok());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Record TTL cleanup failure when the cumulative lock is unavailable. After preparation has selected expired inputs, another task can hold this lock before execute reacquires it; the TRY_LOCK_FAILED return at lines 115-118 bypasses record_changelog_ttl_cleanup, so the failed cleanup counter undercounts exactly the execution failure this metric is meant to expose. Route this early return through the same failure recording path while keeping the no-expired-input no-op.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. The window is real: the lock is released between prepare_compact and execute_compact, and a manual compaction through /api/compaction/run, a clone or a disk migration can take it in between. But a compaction that loses the lock there has not started its cleanup, and counting it would make the series disagree with itself and with cloud mode.

  • It is the same condition prepare_compact checks, found later: both return TRY_LOCK_FAILED with "The tablet is under cumulative compaction", and a compaction that meets it in prepare_compact is not counted. Counting it only in the execution would count the same contention or not depending on whether it began while the task was queued. A lock held for long is met in the preparation of the later rounds, and would not show either way.
  • Cloud mode has the same gate and does not count it: the compaction job is requested from the meta service at the head of the pool task (_request_tablet_global_compaction_lock), and when it is refused, JOB_TABLET_BUSY for example, the task returns before execute_compact, so record_compaction_failure is not reached. In both modes, counting starts once the compaction holds the cumulative compaction of the tablet: the lock taken again in shared-nothing mode, the job in cloud mode.
  • When the holder is another cumulative compaction, the manual one for example, it picks the expired rowsets first and counts the cleanup itself as it ends. Counting the one that lost the lock as failed would report one cleanup as a success and a failure.
  • The compaction that loses the lock sets last_cumu_compaction_failure_time, and the TTL scanner submits the tablet again after min_compaction_failure_interval_ms; the expired rowsets are still there. It is a retry, not a cleanup that cannot make progress.

The description said "does not get past its preparation", which leaves out the lock taken again in the execution. I reworded that sentence to name it.

So I'm keeping it as it is.

if (rowset->end_version() > _changelog_ttl_visible_version ||
!changelog_rowset_expired(*rowset->rowset_meta(), _changelog_ttl_cutoff_tso)) {
if (!is_expired_changelog_rowset(rowset)) {
_data_input_rowsets.push_back(rowset);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Publish the maximum success timestamp. Two successful cleanups can interleave between UnixSeconds() and this unconditional set_value: an older timestamp can overwrite a newer one, making changelog_ttl_last_success_timestamp_seconds move backwards and trigger stale-cleanup alerts. Update with an atomic max/CAS loop or serialize publication so the gauge remains monotonic.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. Two successful cleanups can interleave there, but what that costs is bounded, and a max would cost more.

  • The window is the two steps of one expression: reading the clock and the atomic store. UnixSeconds() has a resolution of one second, so two threads read the same or adjacent seconds, and the gauge can go back by about a second until the next success sets it again. A stale-cleanup alert, time() - doris_be_changelog_ttl_last_success_timestamp_seconds > threshold, needs a threshold of several rounds of scheduling and compaction; a second does not change it.
  • The other last-time series of the BE that many threads publish, fragment_last_active_time and file_cache_warm_up_rowset_last_finish_unix_ts, are stored the same way, and so is set_to_current_time() in the Prometheus clients.
  • A max would pin the gauge to the future once a cleanup succeeds while the clock is ahead, a clock set a day forward and then corrected for example: time() - gauge stays negative until real time catches up, and no stale-cleanup alert can fire in the meantime, even with every cleanup stopped. That is worse than a second of jitter. Serializing the publication avoids that, but it adds a lock for a second that no alert can observe, which the other series do without.

So I'm keeping it as it is.

for (const auto& rowset : compaction._input_rowsets) {
if (rowset->num_rows() != 0 &&
std::find(merged.begin(), merged.end(), rowset) == merged.end()) {
dropped_bytes += rowset->total_disk_size();

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] Restore the global TTL metrics after this test. DorisMetrics::instance() is shared by the monolithic doris_be_test binary, but this test leaves the timestamp gauge at 1 and the cloud counterpart leaves all four new values incremented. Snapshot and restore the new counters/gauge with Defer so later tests do not depend on test order.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks. They do stay changed, by CompactionMetricsTest.TestChangelogTtlCleanupCountedAsCompactionFinishes too, but no test depends on them, so the order does not matter.

  • The only readers of these four series in be/test are the three new tests, and each compares against values it takes right before: the counters by their difference, the timestamp against the time the test started after a success, and against the value it set or read itself after a failure. DorisMetricsTest.Normal does not read them.
  • What another suite reads as an absolute value is restored: recording a cloud success also adds to cumulative_compaction_deltas_total and cumulative_compaction_bytes_total, which DorisMetricsTest.Normal compares as absolute values in the same process, so the cloud test restores those two with a Defer (see the comment there).
  • A test that reads these series later should compare differences too, rather than count on the tests before it to restore them.

So I'm keeping it as it is.

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-H: Total hot run time: 28559 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 5c30820a4014b56dfb7455c605b780cdf7a55c73, data reload: false

------ Round 1 ----------------------------------
============================================
q1	17575	5180	5061	5061
q2	2138	318	254	254
q3	10409	1402	833	833
q4	4713	463	341	341
q5	7648	795	523	523
q6	187	186	156	156
q7	753	799	605	605
q8	10101	1283	1123	1123
q9	5762	4253	4198	4198
q10	6895	1310	1030	1030
q11	437	249	239	239
q12	641	396	294	294
q13	18116	3641	3031	3031
q14	277	271	244	244
q15	q16	754	728	663	663
q17	1218	776	599	599
q18	7058	6215	6114	6114
q19	1102	970	638	638
q20	383	336	236	236
q21	5308	2122	2261	2122
q22	359	298	255	255
Total cold run time: 101834 ms
Total hot run time: 28559 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	5621	5618	5611	5611
q2	695	554	539	539
q3	5215	5425	4896	4896
q4	1996	2147	1558	1558
q5	5237	5156	5196	5156
q6	239	188	141	141
q7	2064	1864	1695	1695
q8	2863	2540	2504	2504
q9	7551	7525	7513	7513
q10	3635	3610	3207	3207
q11	595	427	389	389
q12	673	694	507	507
q13	3271	3569	3090	3090
q14	296	304	274	274
q15	q16	681	694	612	612
q17	7797	7033	6874	6874
q18	12994	12182	12872	12182
q19	929	799	805	799
q20	2161	2151	1902	1902
q21	5746	4629	4759	4629
q22	525	453	403	403
Total cold run time: 70784 ms
Total hot run time: 64481 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 151472 ms
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 5c30820a4014b56dfb7455c605b780cdf7a55c73, data reload: false

query5	4308	604	453	453
query6	426	217	184	184
query7	4800	459	233	233
query8	318	167	147	147
query9	8787	3226	3232	3226
query10	493	312	258	258
query11	5998	3836	3569	3569
query12	144	92	89	89
query13	1258	440	343	343
query14	6129	3955	3624	3624
query14_1	3423	3454	3409	3409
query15	217	204	179	179
query16	947	454	421	421
query17	1090	667	558	558
query18	2480	424	321	321
query19	199	175	137	137
query20	102	85	83	83
query21	207	123	106	106
query22	12884	12965	12823	12823
query23	13464	12893	12358	12358
query23_1	12655	12630	12590	12590
query24	7372	844	469	469
query24_1	479	486	492	486
query25	540	431	362	362
query26	1256	258	145	145
query27	2761	439	278	278
query28	4602	2061	2052	2052
query29	1568	598	456	456
query30	303	224	186	186
query31	1040	932	816	816
query32	150	99	94	94
query33	522	309	249	249
query34	898	859	515	515
query35	732	750	641	641
query36	824	784	725	725
query37	127	99	85	85
query38	1788	1702	1690	1690
query39	789	784	748	748
query39_1	734	720	753	720
query40	234	115	98	98
query41	71	67	67	67
query42	86	83	86	83
query43	343	368	314	314
query44	1333	716	720	716
query45	190	184	203	184
query46	825	965	567	567
query47	2967	2702	2682	2682
query48	307	306	223	223
query49	574	397	281	281
query50	683	272	216	216
query51	10503	10654	10455	10455
query52	78	80	69	69
query53	188	205	151	151
query54	251	192	176	176
query55	72	65	65	65
query56	226	208	212	208
query57	1659	1625	1571	1571
query58	305	261	262	261
query59	2142	2139	1969	1969
query60	301	238	225	225
query61	146	148	137	137
query62	383	333	280	280
query63	183	164	157	157
query64	2708	969	755	755
query65	3307	3252	3252	3252
query66	1763	416	297	297
query67	20151	20189	20223	20189
query68	3319	1005	622	622
query69	401	294	246	246
query70	828	777	764	764
query71	296	233	214	214
query72	2849	2588	2282	2282
query73	524	526	309	309
query74	4665	4503	4318	4318
query75	2340	2283	1918	1918
query76	2418	1019	569	569
query77	362	383	269	269
query78	9828	9700	9189	9189
query79	972	855	554	554
query80	869	430	352	352
query81	574	313	273	273
query82	571	138	110	110
query83	271	198	180	180
query84	276	129	104	104
query85	972	408	373	373
query86	356	242	231	231
query87	2026	1964	1797	1797
query88	3803	2820	2810	2810
query89	343	289	243	243
query90	1706	167	168	167
query91	165	155	127	127
query92	100	87	91	87
query93	1019	996	576	576
query94	497	314	249	249
query95	580	323	353	323
query96	692	485	245	245
query97	2506	2434	2326	2326
query98	163	153	145	145
query99	774	762	639	639
Total cold run time: 235609 ms
Total hot run time: 151472 ms

@hello-stephen

Copy link
Copy Markdown
Contributor
ClickBench: Total hot run time: 24.33 s
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 5c30820a4014b56dfb7455c605b780cdf7a55c73, data reload: false

query1	0.01	0.01	0.00
query2	0.09	0.05	0.04
query3	0.26	0.09	0.09
query4	1.61	0.11	0.10
query5	0.23	0.25	0.24
query6	1.17	0.68	0.68
query7	0.04	0.01	0.00
query8	0.05	0.04	0.03
query9	0.40	0.33	0.36
query10	0.58	0.62	0.61
query11	0.21	0.14	0.14
query12	0.18	0.15	0.14
query13	0.50	0.49	0.49
query14	1.03	1.00	1.03
query15	0.62	0.60	0.60
query16	0.32	0.35	0.34
query17	1.19	1.12	1.10
query18	0.21	0.18	0.20
query19	2.16	1.97	2.03
query20	0.01	0.01	0.01
query21	15.41	0.19	0.14
query22	4.96	0.05	0.05
query23	16.31	0.31	0.12
query24	2.77	0.56	0.47
query25	0.10	0.07	0.06
query26	1.32	0.21	0.14
query27	0.05	0.05	0.04
query28	4.08	0.85	0.36
query29	12.50	4.19	3.27
query30	0.28	0.13	0.10
query31	2.78	0.55	0.33
query32	3.22	0.60	0.51
query33	3.21	3.24	3.21
query34	15.39	3.99	3.36
query35	3.34	3.32	3.30
query36	0.55	0.49	0.44
query37	0.09	0.06	0.06
query38	0.05	0.04	0.04
query39	0.04	0.03	0.03
query40	0.18	0.15	0.14
query41	0.08	0.03	0.02
query42	0.04	0.02	0.03
query43	0.04	0.03	0.03
Total cold run time: 97.66 s
Total hot run time: 24.33 s

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 100.00% (4/4) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 77.56% (36396/46929)
Line Coverage 62.81% (411377/654917)
Region Coverage 59.20% (347894/587643)
Branch Coverage 60.15% (161421/268343)

@morningman
morningman merged commit 2b8908b into apache:master Nov 2, 2026
55 of 56 checks passed
@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

PR approved by anyone and no changes requested.

@github-actions github-actions Bot added the approved Indicates a PR has been approved by one committer. label Nov 2, 2026
@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

PR approved by at least one committer and no changes requested.

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants