Skip to content

[feature](ivm) Report how a refresh task refreshed an IVM MV, and count the refresh tasks on the Master - #69856

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

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

Conversation

@morningman

@morningman morningman commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

What problem does this PR solve?

Issue Number: #69907

Related PR: None

Problem Summary:

In short. A refresh of an IVM materialized view can keep the MV up incrementally or quietly recompute it, and nothing tells the two apart: tasks("type"="mv") does not say which kinds of work a task committed, and /metrics has no IVM series at all. This PR makes each refresh task of an IVM MV report how it refreshed the MV (IvmRefreshMethod in tasks()) and why it failed or fell back, keeps a refresh summary on the MV for the IVM status table that follows, and counts the tasks on the Master in five new counters.

Background. An IVM MV is refreshed by a task that runs one or more attempts: the incremental attempt (the delta of its base tables' streams, after rebuilding the MV partitions an invalidation marked), a partition rebuild, and a whole-MV rebuild. A request that may fall back (AUTO, INCREMENTAL FALLBACK, PARTITIONS FALLBACK) moves on to the next attempt when one gives up, for example to COMPLETE after the delta meets a MIN/MAX boundary. tasks() already reports RefreshMode (which partitions the task covered), IvmFallbackReason (why the incremental attempt gave up, or why a strict request failed) and IvmRebuiltPartitions.

The problem, and what it cost.

  • An operator cannot tell a refresh that kept the MV up incrementally from one that recomputed it. RefreshMode says COMPLETE for any whole-MV scope, and IvmFallbackReason is set even when the attempt that replaced the delta wrote nothing, or when a strict request failed.
  • No alert can watch IVM refreshes. The asynchronous MV counters (async_materialized_view_task_success_num, _failed_num, _skip_num) cover every MV and say nothing about the method, the fallbacks, or why tasks fail. An MV that falls back to COMPLETE on every run, the expensive failure mode of IVM, goes unnoticed until the load of the cluster shows it.
  • A task that the full MV task queue turns away never runs, and nothing counts it.
  • The task history keeps only max_persistence_task_count tasks, so how many times in a row an MV has failed, or when it last fell back, cannot be read back from it.

How this PR fixes it.

  • MTMVTask notes each batch that commits data (the delta, a partition rebuild, a whole-MV rebuild) and decides IvmRefreshMethod once, as the task publishes its result: NONE, INCREMENTAL, PARTITION_REBUILD, COMPLETE, or MIXED when more than one kind committed, typically the rebuild of invalidated partitions before the delta. tasks("type"="mv") gets the IvmRefreshMethod column, NULL while a task runs and for a task of an MV that is not an IVM MV.
  • A task falls back when the incremental attempt gives up and an attempt replacing it commits data. Not fallbacks: building the first baseline of an MV no refresh has succeeded on, the rebuild of invalidated partitions before the delta, an explicit COMPLETE or PARTITIONS request, and a fallback that commits nothing.
  • A failed task reports why: the IvmFailureReason a request that may not fall back failed with, or else the stage it failed in, QUERY_UNUSABLE, PARTITION_SYNC_FAILED, EXECUTION_FAILED or OTHER, told apart by where the failure was thrown rather than by its message.
  • The method, the failure reason and whether the task fell back are journaled with the task, as new Gson fields that an older FE ignores. The MV keeps an IvmRefreshSummary, updated from each task result in MTMV.addTaskResult, which the Master and the replay of the same journal record run alike, from what the record carries: consecutive failures, the latest success and failure (with the reason and the error message, cut to 512 characters), the latest method and run time, and the fallback count with the latest reason. A canceled task leaves it as it is. Nothing reads it in this PR; information_schema.ivm_mv_status and the per-MV series of a follow-up PR do.
  • Five counters, counted on the Master as each task of an IVM MV ends. Every label combination is registered up front, so each of the 61 series exists from 0:
Series Type Labels Value
doris_fe_ivm_refresh_tasks_total counter result=success/no_change/failed/canceled, method=none/incremental/partition_rebuild/complete/mixed refresh tasks that ended; no_change is a SUCCESS that committed nothing
doris_fe_ivm_refresh_duration_seconds_total counter method the run time, StartTime to FinishTime, of the tasks that succeeded or failed; a canceled task has no finish time
doris_fe_ivm_fallbacks_total counter reason=the IvmFailureReason values, incomplete_refresh_snapshot tasks that fell back
doris_fe_ivm_refresh_failures_total counter reason=the IvmFailureReason values, the four stages tasks that failed
doris_fe_ivm_schedule_rejected_total counter tasks the full MV task queue turned away

Like the other FE event counters they live in the registry of every FE and only the Master counts in them, so a query sums them over the FEs; a restart or a new Master starts them from 0.

  • AbstractTask.onRejected, a new hook that TaskProcessor.addTask calls when the executor queue rejects a task. Both the instant dispatch (JobScheduler) and the timer dispatch (DispatchTaskHandler) add tasks through it, and MTMVTask counts the rejection for an IVM MV. A timer-dispatched task that is turned away is canceled as before, so it also counts as canceled.

Results. Before this PR, tasks() has no method column and /metrics has none of these series. After it, on a local cluster, one IVM MV refreshed through each case (regression test_ivm_refresh_method_metrics):

Refresh tasks(): Status, IvmRefreshMethod, IvmFallbackReason Counters that moved, besides the run time
first AUTO refresh of a new MV SUCCESS, COMPLETE, NULL tasks{success,complete}
INCREMENTAL after an insert SUCCESS, INCREMENTAL, NULL tasks{success,incremental}
INCREMENTAL with nothing new SUCCESS, NONE, NULL tasks{no_change,none}
INCREMENTAL after deleting the row that holds a group's minimum FAILED, NONE, MIN_MAX_BOUNDARY_HIT tasks{failed,none}, failures{min_max_boundary_hit}
INCREMENTAL FALLBACK in the same state SUCCESS, COMPLETE, MIN_MAX_BOUNDARY_HIT tasks{success,complete}, fallbacks{min_max_boundary_hit}
COMPLETE SUCCESS, COMPLETE, NULL tasks{success,complete}
INCREMENTAL after truncating a base partition and inserting into another SUCCESS, MIXED, NULL tasks{success,mixed}

The first refresh of a new MV finds every partition still to be filled and goes straight to COMPLETE; it counts no fallback. The MV holds what its base table does after each case.

Classes, and how they call each other.

  • IvmRefreshMethod, IvmRefreshFailureStage (org.apache.doris.mtmv.ivm): the methods, and the stages a failure is reported by.
  • MTMVTask: notes committed batches (recordCommitted), decides whether giving up the incremental attempt is a fallback (givingUpTheIncrementalAttemptIsAFallback), moves the failure stage along, settles the method and the failure reason in after(), and counts the task (recordIvmRefreshMetrics) and a rejection (onRejected).
  • IvmRefreshSummary (org.apache.doris.mtmv.ivm): persisted on MTMV and updated by update(MTMVTask) from MTMV.addTaskResult; MTMV.hasSucceededIvmRefresh tells the first baseline apart.
  • MetricRepo: registers the five counters. DoubleCounterMetric (new) keeps a total in seconds without rounding each addition.
  • AbstractTask.onRejected (new, empty by default), called by TaskProcessor.addTask.
MTMVTask.run()                                            worker thread
  ├─ executeIvmAttempt
  │    ├─ rebuild invalidated partitions ──► recordCommitted(PARTITION_REBUILD)
  │    └─ delta (IvmIncrRefreshManager) ───► recordCommitted(INCREMENTAL)
  │    gave up ─► fallingBack = givingUpTheIncrementalAttemptIsAFallback()
  ├─ PARTITIONS / COMPLETE attempts ───────► recordCommitted(...)   ivmFallback once fallingBack
  └─ failureStage: QUERY_UNUSABLE ─► PARTITION_SYNC_FAILED ─► EXECUTION_FAILED, or an IvmFailureReason

onSuccess / onFail / cancel ─► after()
  ├─ ivmRefreshMethod, ivmFailureReason settled
  ├─ recordIvmRefreshMetrics() ─► MetricRepo.COUNTER_IVM_*            Master only
  └─ Env.addMTMVTaskResult ─► MTMV.addTaskResult ─► IvmRefreshSummary.update(task)
                                (journaled as ADD_TASK; the replay calls addTaskResult the same way)

TaskProcessor.addTask ── queue full ─► task.onRejected() ─► MTMVTask: COUNTER_IVM_SCHEDULE_REJECTED

Nothing else changes: no thrift or proto change, no new config, and the existing columns and series stay as they are.

Release note

tasks("type"="mv") has a new column IvmRefreshMethod: how a refresh task of an IVM materialized view refreshed it (NONE, INCREMENTAL, PARTITION_REBUILD, COMPLETE or MIXED). New FE metrics doris_fe_ivm_refresh_tasks_total{result,method}, doris_fe_ivm_refresh_duration_seconds_total{method}, doris_fe_ivm_fallbacks_total{reason}, doris_fe_ivm_refresh_failures_total{reason} and doris_fe_ivm_schedule_rejected_total.

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: MTMVTaskTest checks the method each kind of committed batch gives, that the rebuild of invalidated partitions before the delta is MIXED and no fallback, that only what commits after the incremental attempt gave up makes a fallback, that building the first baseline is not one, the stage a failure reports (query, partition sync, execution) and the IVM reason of a strict request, the IvmRefreshMethod column, and that the report is journaled while what it is decided from is not. IvmRefreshSummaryTest checks consecutive failures across success, no change, failure and cancel, the latest success and failure, the error message cut, and the fallback count. MTMVTest checks that the Master and the replay of the same journal records end with the same summary with a task history of one, and that an MV that is not an IVM MV keeps none. IvmRefreshMetricsTest checks that every series is there from 0 and how each result is counted; TaskProcessorTest that only the task the full queue rejects is told so. The mtmv, IVM, metric and job executor tests with CreateMTMVCommandTest, ShowCreateMTMVTest and DropMaterializedViewTest pass: 60 classes, 884 cases.

    Regression test: mtmv_p0/ivm/test_ivm_refresh_method_metrics (nonConcurrent: it asserts which counters of the Master moved), twice on a local shared-nothing cluster; not run in cloud mode.

    Manual: promtool check metrics on the /metrics of the Master reports no parsing error and no lint finding on the new series.

  • 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

…nt the refresh tasks on the Master

### What problem does this PR solve?

Issue Number: None

Related PR: None

Problem Summary:

A refresh request of an IVM materialized view does not say how the MV gets refreshed: an AUTO or INCREMENTAL
FALLBACK request may end in the incremental refresh, a partition rebuild, a whole-MV rebuild, or several of them,
and nothing reports which. tasks("type"="mv") shows the refresh mode (the partitions covered) and the fallback
reason the incremental attempt gave, but not whether the refresh that replaced it wrote anything, so "the refresh
fell back to recomputing the MV" cannot be told from the task list, let alone alerted on. /metrics has only the
counters of all asynchronous MVs (success, failed, skip), with no result by method, no fallback and no reason.

This change makes a refresh task of an IVM MV report the kinds of work that committed data, and counts the tasks on
the Master:

- MTMVTask notes each batch that commits -- the delta of the incremental attempt, a partition rebuild, a whole-MV
  rebuild -- and decides, once, as the task ends, IvmRefreshMethod: NONE, INCREMENTAL, PARTITION_REBUILD,
  COMPLETE, or MIXED when more than one kind committed (typically the rebuild of invalidated partitions that an
  incremental attempt runs before the delta). tasks("type"="mv") gets the IvmRefreshMethod column.
- A task falls back when the incremental attempt gives up and an attempt replacing it commits data. Building the
  first baseline of an MV no refresh has succeeded on is not a fallback, though the attempt names
  INCOMPLETE_REFRESH_SNAPSHOT; neither is the rebuild of invalidated partitions before the delta, nor an explicit
  COMPLETE or PARTITIONS request, nor a fallback that commits nothing.
- A failed task reports why: the IvmFailureReason a request that may not fall back failed with, or else the stage
  the failure happened in (QUERY_UNUSABLE, PARTITION_SYNC_FAILED, EXECUTION_FAILED, OTHER), told apart by where it
  was thrown rather than by its message.
- The method, the failure reason and whether the task fell back are journaled with the task. The MV keeps a
  refresh summary updated from each task result, on the Master and in the replay of the same journal record
  alike: consecutive failures, the latest success and failure (with the reason and the error message, cut to 512
  characters), the latest method and run time, and the fallback count with the latest reason. It does not depend
  on how many tasks the history keeps, and a follower that takes over has the same summary. Nothing reads it yet;
  the IVM status system table and the per-MV series that follow read it.
- New counters, every label combination registered from 0, incremented on the Master as a task of an IVM MV ends:

  | Series | Labels |
  | --- | --- |
  | doris_fe_ivm_refresh_tasks_total | result=success/no_change/failed/canceled, method |
  | doris_fe_ivm_refresh_duration_seconds_total | method; tasks that succeeded or failed, StartTime to FinishTime |
  | doris_fe_ivm_fallbacks_total | reason=the IvmFailureReason values, incomplete_refresh_snapshot |
  | doris_fe_ivm_refresh_failures_total | reason=the IvmFailureReason values, the four stages |
  | doris_fe_ivm_schedule_rejected_total | -- tasks the full MV task queue turned away |

  no_change is a SUCCESS that committed nothing. A canceled task has no finish time, so it adds no run time and
  counts no fallback. A rejected task never runs: it is counted where the task queue turns it away, which both
  the instant and the timer dispatch go through, by a new AbstractTask.onRejected hook; the timer dispatch
  cancels the task it could not queue, as before, so that one also counts as canceled. The counters live in the
  registry of every FE like the other FE event counters, and only the Master counts in them, so a query sums
  them over the FEs.

### Release note

tasks("type"="mv") has a new column IvmRefreshMethod. New FE metrics doris_fe_ivm_refresh_tasks_total,
doris_fe_ivm_refresh_duration_seconds_total, doris_fe_ivm_fallbacks_total, doris_fe_ivm_refresh_failures_total
and doris_fe_ivm_schedule_rejected_total.

### Check List (For Author)

- Test: Unit Test, Regression test, Manual test
    - Unit Test: the mtmv, IVM, metric and job executor tests with CreateMTMVCommandTest, ShowCreateMTMVTest and
      DropMaterializedViewTest, 60 classes and 884 cases, among them the new cases of MTMVTaskTest, MTMVTest,
      IvmRefreshSummaryTest, IvmRefreshMetricsTest and TaskProcessorTest
    - Regression test: mtmv_p0/ivm/test_ivm_refresh_method_metrics (nonConcurrent), twice on a local
      shared-nothing cluster; not run in cloud mode
    - Manual test: promtool check metrics on the /metrics of the Master reports no parsing error and no lint
      finding on the new series
- Behavior changed: No (a new column and 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

@hello-stephen

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

------ Round 1 ----------------------------------
============================================
q1	17576	5151	5050	5050
q2	2107	343	252	252
q3	10232	1376	825	825
q4	4696	504	341	341
q5	7429	801	530	530
q6	183	190	159	159
q7	748	789	602	602
q8	9241	1333	1009	1009
q9	5452	4206	4206	4206
q10	6813	1295	1046	1046
q11	442	256	229	229
q12	632	401	292	292
q13	18090	3550	3037	3037
q14	270	271	245	245
q15	q16	703	718	680	680
q17	1223	756	583	583
q18	6925	6154	6086	6086
q19	1115	951	607	607
q20	383	338	220	220
q21	5203	2129	2272	2129
q22	349	292	252	252
Total cold run time: 99812 ms
Total hot run time: 28380 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	5567	5576	5565	5565
q2	685	552	533	533
q3	5206	5382	4920	4920
q4	1962	2135	1549	1549
q5	5246	5169	5548	5169
q6	264	199	167	167
q7	2294	2071	1840	1840
q8	3030	2712	2663	2663
q9	8018	7989	8067	7989
q10	4055	3662	3309	3309
q11	631	440	423	423
q12	685	699	527	527
q13	3464	3929	3252	3252
q14	309	324	298	298
q15	q16	727	706	663	663
q17	8346	7011	6903	6903
q18	12953	12193	12889	12193
q19	951	782	797	782
q20	2135	2137	1919	1919
q21	5611	4546	4649	4546
q22	503	463	418	418
Total cold run time: 72642 ms
Total hot run time: 65628 ms

@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.

Static review of the complete authoritative diff for PR #69856. The task-method classification, failure-stage mapping, persisted IVM summary/replay path, metric registration and terminal updates, task TVF schema, queue dispatch hooks, FE tests, and the new regression case were covered. No existing inline review threads or user focus points were present. The metric key sets and summary defaults were verified; the suspected old-image and queue-accounting concerns were dismissed under the repository's IVM compatibility and documented timer-dispatch behavior. No builds or tests were run because this is a static-only review. One P1 remains: cancel(false) can publish the IVM report before an in-flight worker records a commit that finishes after cancellation, leaving tasks(), metrics, and the persisted summary stale relative to committed work.

Review converged after 2 round(s).

throw new JobException(e.getMessage(), e);
}
recordCommitted(refreshMode == RefreshMode.COMPLETE
? IvmRefreshMethod.COMPLETE : IvmRefreshMethod.PARTITION_REBUILD);

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.

[P1] Make cancellation publish the IVM report only after the worker is quiescent. cancel(false) reaches after() without waiting; after() computes ivmRefreshMethod and records metrics/journals the task, but an in-flight incremental refresh can return successfully after cancellation and then call recordCommitted, which only updates the transient set and never revises the published method or counters. A STOP can therefore leave the MV with committed incremental or partition data while tasks() and the persisted summary say NONE (and miss the fallback). Use one quiescent or atomic terminal snapshot for cancellation, metrics, and journaling so late commits cannot escape the report.

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 race is real, but its reach is narrower than described, and the report already follows the cut master applies to a canceled task.

  • Only a cancel publishes from another thread. onSuccess and onFail run after() on the worker once run() has returned, so a task that succeeds or fails is quiescent when it is reported.
  • A canceled task does not touch the summary: IvmRefreshSummary.update returns on CANCELED, and recordIvmRefreshMetrics counts no fallback and no duration for it. So the summary cannot end up saying NONE, and no fallback is missed. What can come out short is the canceled task's own IvmRefreshMethod, and the method label its doris_fe_ivm_refresh_tasks_total{result="canceled"} count goes to.
  • Only a batch whose transaction was already committing when the cancel landed can be missed. A statement that has not started is rejected by registerExecutor, a running one is aborted by the coordinator cancel, and refreshPartitions checks CANCELED after its statement and throws before recordCommitted. In practice the window is the commit of the delta.
  • That is the cut master already applies to what a canceled task publishes. after() runs on the cancel thread without waiting for the worker, and publishes copies of the partition snapshots and the epochs, so a batch that commits afterwards is not part of the result ([feature](ivm) Track the refresh baseline per MV partition, not by a rebuild barrier #68390, see the comment in after()). The method is decided at the same point, so it agrees with the snapshots the task publishes. Counting a late batch in the method while its snapshots stay out would make the record contradict itself.
  • Waiting for the worker to stop is a change to the cancellation of the job framework. cancel(false) comes from DROP MATERIALIZED VIEW and from an ALTER that rebuilds the job (JobManager.dropJobInternal sets STOPPED), and it deliberately does not block on a refresh in flight; cancel(true) only waits for the statement (waitNotRunning), not for what the worker records after it. That is outside the scope of this PR. The other half of the suggestion, one terminal snapshot for the report, the metrics and the journal, is what after() does now: the method, the failure reason, the counters and the journaled record are all decided there, once.

So I'm keeping it as it is.

@hello-stephen

Copy link
Copy Markdown
Contributor
TPC-DS: Total hot run time: 150816 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 509e28fdbbccb0ade6312156bbb31785dfaf4076, data reload: false

query5	4318	596	442	442
query6	429	203	187	187
query7	4798	454	229	229
query8	334	167	147	147
query9	8792	3191	3193	3191
query10	470	317	268	268
query11	6036	3857	3553	3553
query12	146	98	89	89
query13	1264	448	342	342
query14	6148	3903	3598	3598
query14_1	3379	3419	3385	3385
query15	203	197	182	182
query16	939	433	398	398
query17	863	659	545	545
query18	2435	416	312	312
query19	208	171	145	145
query20	88	88	82	82
query21	210	124	106	106
query22	12924	12978	12751	12751
query23	13406	12709	12282	12282
query23_1	12677	12593	12492	12492
query24	7354	828	473	473
query24_1	482	485	485	485
query25	540	415	364	364
query26	1266	257	136	136
query27	2756	449	272	272
query28	4624	2051	2057	2051
query29	1558	608	475	475
query30	290	217	187	187
query31	1006	922	810	810
query32	143	93	91	91
query33	528	303	244	244
query34	883	878	512	512
query35	734	754	642	642
query36	815	809	737	737
query37	130	100	81	81
query38	1776	1711	1662	1662
query39	791	776	737	737
query39_1	733	716	751	716
query40	229	125	102	102
query41	72	70	74	70
query42	94	88	84	84
query43	351	370	317	317
query44	1327	708	710	708
query45	183	180	167	167
query46	850	995	573	573
query47	2682	3025	2884	2884
query48	296	308	229	229
query49	699	400	292	292
query50	698	301	217	217
query51	10413	10190	10186	10186
query52	76	78	67	67
query53	182	211	157	157
query54	247	182	177	177
query55	69	67	63	63
query56	248	208	220	208
query57	1641	1605	1562	1562
query58	285	265	255	255
query59	2147	2161	2024	2024
query60	292	241	224	224
query61	147	147	146	146
query62	384	330	280	280
query63	196	152	157	152
query64	2792	917	767	767
query65	3319	3251	3274	3251
query66	1780	412	288	288
query67	20037	20060	19938	19938
query68	2953	1018	618	618
query69	395	270	254	254
query70	861	800	810	800
query71	302	235	207	207
query72	2664	2584	2316	2316
query73	511	531	298	298
query74	4616	4470	4340	4340
query75	2312	2268	1921	1921
query76	2315	999	603	603
query77	349	366	281	281
query78	9683	9730	9175	9175
query79	997	863	538	538
query80	1084	462	345	345
query81	587	318	266	266
query82	573	131	115	115
query83	276	190	178	178
query84	307	120	99	99
query85	1074	418	368	368
query86	364	240	230	230
query87	1987	1946	1829	1829
query88	3763	2784	2777	2777
query89	335	295	240	240
query90	1688	166	164	164
query91	154	145	120	120
query92	96	85	89	85
query93	1008	1030	577	577
query94	527	313	261	261
query95	575	383	302	302
query96	684	485	240	240
query97	2447	2439	2302	2302
query98	164	150	150	150
query99	765	763	646	646
Total cold run time: 234512 ms
Total hot run time: 150816 ms

@hello-stephen

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

query1	0.01	0.00	0.01
query2	0.10	0.05	0.05
query3	0.26	0.08	0.08
query4	1.60	0.10	0.10
query5	0.23	0.24	0.24
query6	1.18	0.68	0.67
query7	0.04	0.01	0.01
query8	0.06	0.04	0.04
query9	0.39	0.34	0.31
query10	0.56	0.56	0.57
query11	0.19	0.15	0.14
query12	0.19	0.15	0.15
query13	0.48	0.48	0.49
query14	1.02	1.01	1.02
query15	0.63	0.60	0.60
query16	0.32	0.35	0.31
query17	1.14	1.15	1.14
query18	0.20	0.19	0.20
query19	2.12	1.98	2.00
query20	0.02	0.02	0.01
query21	15.49	0.20	0.14
query22	4.83	0.05	0.05
query23	16.28	0.32	0.12
query24	2.73	0.45	0.37
query25	0.11	0.08	0.06
query26	1.09	0.22	0.15
query27	0.05	0.04	0.05
query28	3.99	0.86	0.34
query29	12.55	4.23	3.35
query30	0.28	0.13	0.09
query31	2.77	0.56	0.33
query32	3.23	0.59	0.50
query33	3.15	3.28	3.15
query34	15.34	3.97	3.39
query35	3.35	3.33	3.34
query36	0.55	0.44	0.44
query37	0.09	0.07	0.06
query38	0.05	0.04	0.03
query39	0.04	0.03	0.03
query40	0.17	0.15	0.14
query41	0.08	0.03	0.02
query42	0.04	0.03	0.03
query43	0.04	0.04	0.03
Total cold run time: 97.04 s
Total hot run time: 24.26 s

@hello-stephen

Copy link
Copy Markdown
Contributor

FE UT Coverage Report

Increment line coverage 94.44% (153/162) 🎉
Increment coverage report
Complete coverage report

@hello-stephen

Copy link
Copy Markdown
Contributor

FE Regression Coverage Report

Increment line coverage 72.84% (118/162) 🎉
Increment coverage report
Complete coverage report

@yujun777 yujun777 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.

LGTM

@morningman
morningman merged commit 9dc9dc7 into apache:master Nov 2, 2026
46 of 47 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants