Skip to content

[opt](Ann) Cancel index building if input rows is less than the min_train_rows - #60358

Merged
yiguolei merged 12 commits into
apache:masterfrom
RoanHeNaN:opt-index-train
Mar 25, 2026
Merged

[opt](Ann) Cancel index building if input rows is less than the min_train_rows#60358
yiguolei merged 12 commits into
apache:masterfrom
RoanHeNaN:opt-index-train

Conversation

@RoanHeNaN

@RoanHeNaN RoanHeNaN commented Jan 29, 2026

Copy link
Copy Markdown
Contributor

Before this change, when the amount of data used to train the index was less than the required amount, import or compaction might fail, which severely impacted user experience. Now, in such cases, it automatically determines whether training and index generation are needed. When the amount is completely insufficient, index construction is skipped, and during queries, it falls back to brute-force computation.

For the calculation of min_train_rows:

  1. IVF requires no less than nlist rows.
  2. PQ requires no less than 2^pq_nbits * 100 rows.

Take the max of the two as the required minimum number of rows.

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
  • Behavior changed:

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

    • No.
    • Yes.

Check List (For Reviewer who merge this PR)

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

@Thearas

Thearas commented Jan 29, 2026

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?

@RoanHeNaN

Copy link
Copy Markdown
Contributor Author

run buildall

@doris-robot

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

------ Round 1 ----------------------------------
q1	17658	5294	5080	5080
q2	2057	308	197	197
q3	10222	1366	759	759
q4	10235	809	322	322
q5	8411	2221	1913	1913
q6	224	182	159	159
q7	917	794	612	612
q8	9271	1453	1097	1097
q9	5600	4835	4952	4835
q10	6868	1977	1568	1568
q11	519	300	281	281
q12	388	381	230	230
q13	17815	4041	3216	3216
q14	250	242	217	217
q15	908	828	822	822
q16	674	685	627	627
q17	700	807	453	453
q18	7125	6961	7340	6961
q19	1609	1057	628	628
q20	413	377	242	242
q21	2926	2225	2188	2188
q22	374	332	300	300
Total cold run time: 105164 ms
Total hot run time: 32707 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5574	5599	5572	5572
q2	268	364	303	303
q3	2335	2883	2628	2628
q4	1466	1993	1451	1451
q5	4751	4512	4437	4437
q6	225	178	138	138
q7	2157	1949	1790	1790
q8	2605	2482	2781	2482
q9	7446	7426	7540	7426
q10	2759	2888	2416	2416
q11	513	452	432	432
q12	618	711	546	546
q13	3562	4003	3204	3204
q14	266	299	265	265
q15	843	799	792	792
q16	642	677	634	634
q17	1078	1268	1338	1268
q18	7603	7378	7336	7336
q19	838	777	803	777
q20	1952	2032	1896	1896
q21	4485	4218	4033	4033
q22	582	550	517	517
Total cold run time: 52568 ms
Total hot run time: 50343 ms

@doris-robot

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

query1	0.05	0.05	0.04
query2	0.10	0.05	0.05
query3	0.26	0.09	0.09
query4	1.61	0.11	0.10
query5	0.27	0.25	0.25
query6	1.16	0.69	0.67
query7	0.03	0.03	0.03
query8	0.05	0.04	0.04
query9	0.57	0.49	0.50
query10	0.56	0.54	0.55
query11	0.14	0.10	0.09
query12	0.14	0.11	0.10
query13	0.64	0.61	0.61
query14	1.04	1.07	1.05
query15	0.88	0.86	0.86
query16	0.41	0.41	0.40
query17	1.12	1.14	1.17
query18	0.23	0.22	0.21
query19	1.99	1.99	2.06
query20	0.02	0.02	0.01
query21	15.40	0.25	0.15
query22	5.20	0.06	0.05
query23	16.19	0.28	0.10
query24	0.93	0.23	0.58
query25	0.06	0.10	0.08
query26	0.15	0.14	0.13
query27	0.08	0.06	0.07
query28	3.88	1.14	0.96
query29	12.59	3.95	3.18
query30	0.27	0.13	0.11
query31	2.82	0.63	0.40
query32	3.24	0.59	0.49
query33	3.28	3.21	3.26
query34	16.37	5.37	4.73
query35	4.80	4.78	4.82
query36	0.65	0.50	0.49
query37	0.11	0.07	0.06
query38	0.08	0.04	0.04
query39	0.05	0.03	0.04
query40	0.20	0.16	0.15
query41	0.10	0.03	0.03
query42	0.04	0.03	0.03
query43	0.06	0.04	0.03
Total cold run time: 97.82 s
Total hot run time: 28.28 s

@RoanHeNaN

Copy link
Copy Markdown
Contributor Author

run buildall

@doris-robot

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

------ Round 1 ----------------------------------
q1	17649	5271	5056	5056
q2	2031	310	192	192
q3	10203	1377	774	774
q4	10233	870	317	317
q5	8217	2199	1920	1920
q6	228	188	153	153
q7	913	729	609	609
q8	9267	1425	1124	1124
q9	5494	4904	4784	4784
q10	6859	1972	1571	1571
q11	537	299	287	287
q12	380	382	227	227
q13	17775	4072	3267	3267
q14	240	238	227	227
q15	927	827	816	816
q16	704	667	626	626
q17	656	843	448	448
q18	7587	6554	6396	6396
q19	1235	981	642	642
q20	398	357	230	230
q21	2778	2140	1836	1836
q22	364	319	274	274
Total cold run time: 104675 ms
Total hot run time: 31776 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5346	5361	5340	5340
q2	268	339	279	279
q3	2175	2705	2268	2268
q4	1383	1760	1294	1294
q5	4319	4264	4610	4264
q6	270	212	144	144
q7	2191	1950	1789	1789
q8	2588	2425	2371	2371
q9	7699	7523	7713	7523
q10	2818	3040	2681	2681
q11	537	493	456	456
q12	654	780	666	666
q13	4039	4318	3508	3508
q14	289	303	287	287
q15	925	872	826	826
q16	689	747	918	747
q17	1235	1408	1363	1363
q18	8219	8014	7840	7840
q19	905	869	889	869
q20	2079	2145	1977	1977
q21	4837	4276	4164	4164
q22	585	569	515	515
Total cold run time: 54050 ms
Total hot run time: 51171 ms

@doris-robot

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

query1	0.06	0.04	0.04
query2	0.10	0.05	0.04
query3	0.25	0.08	0.08
query4	1.61	0.11	0.10
query5	0.29	0.25	0.25
query6	1.16	0.69	0.68
query7	0.04	0.03	0.02
query8	0.05	0.04	0.05
query9	0.56	0.51	0.49
query10	0.54	0.55	0.54
query11	0.14	0.09	0.10
query12	0.14	0.11	0.10
query13	0.65	0.63	0.62
query14	1.08	1.06	1.05
query15	0.87	0.87	0.88
query16	0.39	0.40	0.40
query17	1.14	1.10	1.14
query18	0.22	0.22	0.21
query19	1.98	1.97	1.93
query20	0.02	0.02	0.01
query21	15.41	0.27	0.15
query22	5.35	0.05	0.05
query23	16.15	0.28	0.10
query24	1.24	0.49	0.59
query25	0.09	0.12	0.09
query26	0.13	0.13	0.13
query27	0.06	0.06	0.06
query28	4.31	1.16	0.97
query29	12.60	3.93	3.17
query30	0.28	0.13	0.12
query31	2.83	0.62	0.41
query32	3.23	0.60	0.49
query33	3.28	3.36	3.23
query34	16.12	5.37	4.74
query35	4.81	4.78	4.74
query36	0.64	0.50	0.48
query37	0.11	0.07	0.07
query38	0.07	0.04	0.04
query39	0.05	0.04	0.04
query40	0.20	0.16	0.17
query41	0.09	0.03	0.04
query42	0.05	0.03	0.03
query43	0.05	0.04	0.03
Total cold run time: 98.44 s
Total hot run time: 28.48 s

@RoanHeNaN

Copy link
Copy Markdown
Contributor Author

run buildall

@doris-robot

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

------ Round 1 ----------------------------------
q1	17621	5353	5180	5180
q2	2002	314	190	190
q3	10420	1335	761	761
q4	10313	809	327	327
q5	9239	2215	1949	1949
q6	211	179	150	150
q7	898	743	612	612
q8	9265	1450	1207	1207
q9	5224	4838	4833	4833
q10	6859	1973	1577	1577
q11	528	295	285	285
q12	395	383	234	234
q13	17815	4087	3231	3231
q14	247	236	218	218
q15	899	832	822	822
q16	678	687	617	617
q17	901	857	458	458
q18	7205	7057	7436	7057
q19	1577	1074	676	676
q20	420	380	246	246
q21	3086	2378	2307	2307
q22	375	331	292	292
Total cold run time: 106178 ms
Total hot run time: 33229 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5601	5502	5568	5502
q2	268	355	259	259
q3	2425	2916	2495	2495
q4	1454	2007	1464	1464
q5	4778	4470	4538	4470
q6	226	186	142	142
q7	2000	1997	1877	1877
q8	2593	2412	2445	2412
q9	7647	7506	7440	7440
q10	2612	2822	2428	2428
q11	527	458	433	433
q12	644	701	555	555
q13	3574	4067	3265	3265
q14	279	297	262	262
q15	847	813	809	809
q16	661	684	642	642
q17	1092	1227	1239	1227
q18	7582	7312	7459	7312
q19	867	835	849	835
q20	1987	2084	1909	1909
q21	4656	4359	4126	4126
q22	581	554	529	529
Total cold run time: 52901 ms
Total hot run time: 50393 ms

@doris-robot

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

query1	0.05	0.04	0.04
query2	0.09	0.04	0.04
query3	0.26	0.09	0.08
query4	1.60	0.11	0.11
query5	0.27	0.25	0.24
query6	1.16	0.70	0.69
query7	0.03	0.03	0.03
query8	0.05	0.03	0.04
query9	0.57	0.50	0.50
query10	0.55	0.55	0.53
query11	0.14	0.10	0.09
query12	0.14	0.10	0.11
query13	0.63	0.62	0.62
query14	1.07	1.06	1.04
query15	0.87	0.85	0.88
query16	0.40	0.38	0.40
query17	1.15	1.13	1.14
query18	0.22	0.21	0.21
query19	2.05	1.90	1.97
query20	0.02	0.02	0.01
query21	15.41	0.28	0.16
query22	5.32	0.05	0.04
query23	16.25	0.26	0.11
query24	0.94	0.50	0.19
query25	0.09	0.12	0.08
query26	0.16	0.13	0.13
query27	0.08	0.07	0.05
query28	3.42	1.16	0.96
query29	12.56	3.97	3.16
query30	0.30	0.13	0.12
query31	2.80	0.62	0.41
query32	3.25	0.60	0.50
query33	3.31	3.29	3.28
query34	15.83	5.39	4.75
query35	4.75	4.78	4.80
query36	0.65	0.51	0.49
query37	0.12	0.07	0.06
query38	0.08	0.04	0.04
query39	0.05	0.03	0.03
query40	0.19	0.16	0.14
query41	0.09	0.03	0.04
query42	0.04	0.04	0.03
query43	0.05	0.04	0.03
Total cold run time: 97.06 s
Total hot run time: 28.19 s

@doris-robot

Copy link
Copy Markdown

BE UT Coverage Report

Increment line coverage 64.41% (76/118) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 52.49% (19275/36720)
Line Coverage 35.98% (179143/497892)
Region Coverage 32.43% (139220/429240)
Branch Coverage 33.34% (60112/180316)

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 77.24% (95/123) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 71.51% (25741/35995)
Line Coverage 54.18% (269131/496705)
Region Coverage 51.80% (224609/433637)
Branch Coverage 53.12% (96169/181044)

@RoanHeNaN

Copy link
Copy Markdown
Contributor Author

run buildall

@doris-robot

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

------ Round 1 ----------------------------------
q1	17669	5280	5029	5029
q2	2035	307	188	188
q3	10194	1319	739	739
q4	10206	827	309	309
q5	7540	2149	1892	1892
q6	202	187	152	152
q7	856	723	609	609
q8	9257	1378	1080	1080
q9	5193	4815	4818	4815
q10	6821	1956	1568	1568
q11	515	301	277	277
q12	334	386	224	224
q13	17772	4049	3270	3270
q14	236	246	216	216
q15	893	813	828	813
q16	692	670	628	628
q17	628	813	497	497
q18	6917	6506	6452	6452
q19	1114	979	628	628
q20	380	341	229	229
q21	2624	2023	1928	1928
q22	353	310	273	273
Total cold run time: 102431 ms
Total hot run time: 31816 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5310	5251	5274	5251
q2	262	345	260	260
q3	2211	2723	2261	2261
q4	1383	1799	1319	1319
q5	4251	4183	4211	4183
q6	217	180	139	139
q7	2130	2140	1860	1860
q8	2677	2403	2386	2386
q9	7633	7421	7576	7421
q10	2877	3134	2659	2659
q11	573	473	454	454
q12	719	731	613	613
q13	3850	4445	3619	3619
q14	301	323	329	323
q15	865	856	813	813
q16	665	735	702	702
q17	1166	1340	1352	1340
q18	8058	8135	7805	7805
q19	884	852	867	852
q20	2111	2141	1898	1898
q21	4519	4286	4177	4177
q22	554	559	508	508
Total cold run time: 53216 ms
Total hot run time: 50843 ms

@doris-robot

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

query1	0.05	0.05	0.05
query2	0.10	0.04	0.04
query3	0.26	0.08	0.08
query4	1.60	0.11	0.10
query5	0.27	0.25	0.25
query6	1.19	0.66	0.67
query7	0.03	0.03	0.02
query8	0.06	0.04	0.04
query9	0.58	0.49	0.50
query10	0.55	0.55	0.55
query11	0.14	0.10	0.10
query12	0.15	0.11	0.10
query13	0.64	0.61	0.60
query14	1.06	1.06	1.06
query15	0.87	0.87	0.87
query16	0.40	0.40	0.40
query17	1.15	1.11	1.15
query18	0.23	0.21	0.21
query19	2.01	2.01	2.08
query20	0.02	0.02	0.02
query21	15.39	0.25	0.14
query22	5.07	0.06	0.05
query23	15.79	0.29	0.11
query24	2.00	0.24	0.32
query25	0.08	0.10	0.08
query26	0.14	0.12	0.13
query27	0.07	0.06	0.06
query28	3.67	1.15	0.96
query29	12.59	3.90	3.20
query30	0.28	0.13	0.12
query31	2.82	0.63	0.40
query32	3.23	0.59	0.50
query33	3.19	3.25	3.30
query34	16.41	5.37	4.71
query35	4.78	4.84	4.81
query36	0.65	0.52	0.49
query37	0.10	0.07	0.07
query38	0.07	0.05	0.04
query39	0.04	0.04	0.03
query40	0.18	0.16	0.16
query41	0.09	0.03	0.03
query42	0.04	0.03	0.03
query43	0.05	0.04	0.04
Total cold run time: 98.09 s
Total hot run time: 28.4 s

@hello-stephen

Copy link
Copy Markdown
Contributor

BE UT Coverage Report

Increment line coverage 64.41% (76/118) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 52.49% (19275/36720)
Line Coverage 35.98% (179146/497892)
Region Coverage 32.45% (139285/429240)
Branch Coverage 33.34% (60115/180316)

@RoanHeNaN

Copy link
Copy Markdown
Contributor Author

run buildall

@doris-robot

Copy link
Copy Markdown

BE UT Coverage Report

Increment line coverage 65.00% (78/120) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 52.49% (19277/36727)
Line Coverage 35.96% (179131/498072)
Region Coverage 32.42% (139247/429452)
Branch Coverage 33.32% (60100/180392)

@doris-robot

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

------ Round 1 ----------------------------------
q1	17637	5243	5042	5042
q2	2007	319	205	205
q3	10207	1340	735	735
q4	10215	876	312	312
q5	7497	2114	1983	1983
q6	202	179	148	148
q7	894	718	603	603
q8	9259	1456	1090	1090
q9	5479	4794	4791	4791
q10	6855	1946	1588	1588
q11	542	281	282	281
q12	377	373	222	222
q13	17787	4054	3225	3225
q14	244	243	229	229
q15	910	848	818	818
q16	671	683	612	612
q17	653	817	518	518
q18	6877	6435	6455	6435
q19	1573	1007	605	605
q20	413	336	238	238
q21	2638	2051	1930	1930
q22	363	324	278	278
Total cold run time: 103300 ms
Total hot run time: 31888 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5470	5261	5327	5261
q2	261	338	261	261
q3	2165	2693	2251	2251
q4	1369	1751	1347	1347
q5	4293	4201	4168	4168
q6	231	190	141	141
q7	2075	2095	1808	1808
q8	2629	2489	2435	2435
q9	7796	7398	7554	7398
q10	2851	3003	2584	2584
q11	555	489	460	460
q12	655	799	673	673
q13	3954	4456	3600	3600
q14	291	310	301	301
q15	921	855	830	830
q16	676	720	681	681
q17	1201	1398	1374	1374
q18	8065	7902	8201	7902
q19	867	876	863	863
q20	2103	2245	1995	1995
q21	5202	4557	4124	4124
q22	602	555	519	519
Total cold run time: 54232 ms
Total hot run time: 50976 ms

@doris-robot

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

query1	0.06	0.05	0.05
query2	0.10	0.05	0.05
query3	0.26	0.09	0.08
query4	1.61	0.11	0.11
query5	0.27	0.25	0.25
query6	1.16	0.67	0.67
query7	0.03	0.02	0.03
query8	0.06	0.04	0.04
query9	0.57	0.49	0.50
query10	0.56	0.57	0.56
query11	0.15	0.09	0.09
query12	0.14	0.10	0.10
query13	0.63	0.62	0.63
query14	1.06	1.04	1.06
query15	0.88	0.85	0.88
query16	0.40	0.41	0.42
query17	1.14	1.07	1.14
query18	0.22	0.21	0.21
query19	2.02	1.94	2.09
query20	0.03	0.01	0.02
query21	15.39	0.24	0.15
query22	5.43	0.05	0.05
query23	16.24	0.28	0.10
query24	1.50	0.25	0.50
query25	0.13	0.05	0.06
query26	0.13	0.14	0.14
query27	0.08	0.05	0.06
query28	4.30	1.14	0.97
query29	12.55	3.95	3.13
query30	0.27	0.14	0.11
query31	2.82	0.65	0.40
query32	3.24	0.59	0.49
query33	3.21	3.28	3.27
query34	16.36	5.36	4.75
query35	4.88	4.84	4.83
query36	0.64	0.50	0.48
query37	0.11	0.07	0.07
query38	0.08	0.04	0.04
query39	0.04	0.03	0.03
query40	0.19	0.17	0.15
query41	0.09	0.03	0.03
query42	0.04	0.03	0.03
query43	0.05	0.04	0.03
Total cold run time: 99.12 s
Total hot run time: 28.26 s

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 86.40% (108/125) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 71.71% (25816/36002)
Line Coverage 54.37% (270171/496885)
Region Coverage 51.91% (225208/433849)
Branch Coverage 53.37% (96657/181120)

@RoanHeNaN
RoanHeNaN marked this pull request as ready for review January 31, 2026 14:55
@RoanHeNaN
RoanHeNaN marked this pull request as draft February 1, 2026 01:13
@RoanHeNaN
RoanHeNaN marked this pull request as ready for review February 3, 2026 08:19
@airborne12

Copy link
Copy Markdown
Member

/review

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

Code Review Summary

PR: WIP Cancel index building if input rows is less than the min_train_rows

This PR adds logic to skip ANN index building when training data is insufficient, with fallback to brute-force search at query time. The core idea is sound but several issues should be addressed before merging.

Critical Issues

  1. Excessive [DEBUG] LOG(INFO) in index_file_reader.cpp: ~15 verbose debug log statements at INFO level will flood production logs on every index file read operation. These must be removed or downgraded to VLOG_DEBUG before merge. This file is in the hot path for ALL inverted index reads, not just ANN.

  2. Lost load timing metrics: When load_index was moved from query()/range_search() to try_load_index(), the SCOPED_TIMER(&(stats->load_index_costs_ns)) and DorisMetrics::instance()->ann_index_load_costs_ms tracking were dropped entirely. Load cost is no longer being measured.

  3. Stale LOG_INFO in ann_index_iterator.cpp:52: LOG_INFO("_context of ann index iterator is {}", ...) fires on every query call and should be removed.

Minor Issues

  1. SQ comment/value mismatch in faiss_ann_index.cpp: Comment says "use a minimum of 20 training vectors" but code sets quantizer_min = 1.

  2. Unreachable code in ann_index_writer.cpp:198: return Status::OK() after the if/else block is dead code since all branches already return.

  3. _float_array not cleared in finish(): Unlike the original code, the new code doesn't call _float_array.clear() after processing, keeping memory allocated unnecessarily.

Observations

  • The _need_save_index flag + min_train_rows logic is well-structured for handling the edge cases (empty segment, small remainder after chunks, fully small segment).
  • Adding try_load_index() to gracefully handle missing index files (when building was skipped) is the right approach.
  • Good test coverage for the writer logic with multiple edge case scenarios.
  • The PR title says [WIP] which may indicate these debug logs are intentionally temporary, but they should definitely not be merged to master.


LOG(INFO) << "[DEBUG] IndexFileReader::_init_from start, index_path_prefix: "
<< _index_path_prefix << ", index_file_full_path: " << index_file_full_path
<< ", read_buffer_size: " << read_buffer_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.

Critical: Remove debug logging before merge. This file has ~15 [DEBUG] LOG(INFO) statements that will fire on every index file read (not just ANN index). This is the hot path for all inverted index operations and will flood production logs. These should be removed entirely or downgraded to VLOG_DEBUG.


// _context may be unset in some test scenarios; pass nullptr IOContext in that case.
io::IOContext* io_ctx = (_context != nullptr) ? _context->io_ctx : nullptr;
LOG_INFO("_context of ann index iterator is {}", (_context != nullptr) ? "not null" : "null");

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.

Remove this LOG_INFO. This fires on every ANN query call and provides no diagnostic value in production. It was likely added for debugging.

double load_costs_ms = static_cast<double>(stats->load_index_costs_ns.value()) / 1000.0;
DorisMetrics::instance()->ann_index_load_costs_ms->increment(
static_cast<int64_t>(load_costs_ms));
Status st = load_index(io_ctx);

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.

Lost metrics tracking. The original code had:

SCOPED_TIMER(&(stats->load_index_costs_ns));
RETURN_IF_ERROR(load_index(io_ctx));
double load_costs_ms = ...
DorisMetrics::instance()->ann_index_load_costs_ms->increment(...);

By moving load to try_load_index() (which has no stats parameter), both load_index_costs_ns timing and ann_index_load_costs_ms metrics are completely lost. You should either pass the stats object to try_load_index() or record the timing at the call site in segment_iterator.cpp.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@zhiqiang-hhhh need check this

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.

} else if (_params.quantizer == FaissBuildParameter::Quantizer::SQ4 ||
_params.quantizer == FaissBuildParameter::Quantizer::SQ8) {
// For SQ, use a minimum of 20 training vectors, similar to IVF's nlist * 2 with nlist=10
quantizer_min = 1;

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.

Comment/code mismatch. Comment says "use a minimum of 20 training vectors, similar to IVF's nlist * 2 with nlist=10" but the code sets quantizer_min = 1. Should this be quantizer_min = 20? Or if 1 is correct, the comment should be updated.

}

return _vector_index->save(_dir.get());
return Status::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.

Dead code. This return Status::OK() is unreachable because every branch in the if (_float_array.empty()) ... else ... block above already returns. Consider removing it to avoid confusion.

// It happens to have not enough data to train.
// If we have data to add before, we still need to save the index.
if (_need_save_index) {
RETURN_IF_ERROR(_vector_index->add(num_rows, _float_array.data()));

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.

Potential correctness concern: When _need_save_index == true (previous chunks were trained+added) but the remaining rows are fewer than min_train_rows, you call add() without train(). For IVF indexes, this means the remaining vectors are added to an index whose quantizer was trained on previous batches. This is generally fine for FAISS since the quantizer is already trained, but it means these vectors won't benefit from the last batch's clustering. Worth a comment explaining this is intentional.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

@zhiqiang-hhhh need check this

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.

@zhiqiang-hhhh need check this

A comment has been added.

RoanHeNaN added a commit to RoanHeNaN/doris that referenced this pull request Mar 3, 2026
1. Remove excessive [DEBUG] LOG(INFO) statements from index_file_reader.cpp that would flood production logs
2. Restore load timing metrics tracking by adding SCOPED_TIMER and DorisMetrics in segment_iterator.cpp and vectorized_fn_call.cpp
3. Remove stale LOG_INFO in ann_index_iterator.cpp that fires on every query
4. Fix SQ quantizer comment/value mismatch in faiss_ann_index.cpp
5. Remove unreachable return Status::OK() in ann_index_writer.cpp
6. Add _float_array.clear() calls to avoid keeping memory allocated unnecessarily
7. Add comment explaining IVF correctness when adding vectors without training
@RoanHeNaN

Copy link
Copy Markdown
Contributor Author

run buildall

@doris-robot

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

------ Round 1 ----------------------------------
============================================
q1	17638	4478	4309	4309
q2	q3	10645	816	528	528
q4	4706	370	249	249
q5	7867	1196	1008	1008
q6	232	174	145	145
q7	827	871	687	687
q8	10642	1493	1306	1306
q9	5897	5000	4553	4553
q10	6856	1880	1641	1641
q11	455	262	242	242
q12	754	569	466	466
q13	17825	4260	3434	3434
q14	252	227	209	209
q15	944	799	790	790
q16	761	722	685	685
q17	725	873	403	403
q18	6593	5388	5251	5251
q19	1124	974	611	611
q20	505	718	468	468
q21	4596	1966	1431	1431
q22	365	304	261	261
Total cold run time: 100209 ms
Total hot run time: 28677 ms

----- Round 2, with runtime_filter_mode=off -----
============================================
q1	4745	4585	4659	4585
q2	q3	1811	2217	1773	1773
q4	874	1215	767	767
q5	4041	4389	4318	4318
q6	182	182	151	151
q7	1818	1656	1667	1656
q8	2555	2714	2576	2576
q9	7415	7388	7485	7388
q10	2574	2828	2410	2410
q11	680	466	414	414
q12	504	589	447	447
q13	3968	4446	3618	3618
q14	283	293	277	277
q15	871	843	792	792
q16	737	763	706	706
q17	1198	1621	1304	1304
q18	7174	6868	6596	6596
q19	883	850	1056	850
q20	2074	2160	2052	2052
q21	4053	3466	3409	3409
q22	460	448	391	391
Total cold run time: 48900 ms
Total hot run time: 46480 ms

@doris-robot

Copy link
Copy Markdown
TPC-DS: Total hot run time: 184982 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 d3a1290ce5d22e7fc0ba9f2b94c427aa024fab27, data reload: false

query5	4353	612	530	530
query6	321	214	196	196
query7	4209	457	288	288
query8	325	248	240	240
query9	8685	2749	2725	2725
query10	489	372	352	352
query11	17010	16800	16648	16648
query12	181	130	127	127
query13	1258	440	368	368
query14	5802	3245	3024	3024
query14_1	2836	2845	2843	2843
query15	204	223	176	176
query16	955	465	405	405
query17	1088	696	585	585
query18	2427	446	337	337
query19	201	199	184	184
query20	135	125	123	123
query21	214	135	123	123
query22	4976	5997	5537	5537
query23	17745	17158	17093	17093
query23_1	17180	17155	17075	17075
query24	7349	1598	1238	1238
query24_1	1217	1236	1202	1202
query25	564	456	415	415
query26	1229	257	161	161
query27	2787	468	279	279
query28	4523	1879	1872	1872
query29	767	568	467	467
query30	312	240	210	210
query31	865	733	650	650
query32	83	73	76	73
query33	515	345	282	282
query34	942	911	564	564
query35	635	682	619	619
query36	1088	1132	970	970
query37	133	94	87	87
query38	2922	2915	2924	2915
query39	897	866	845	845
query39_1	853	836	826	826
query40	235	150	135	135
query41	61	70	58	58
query42	108	102	101	101
query43	373	374	359	359
query44	
query45	202	187	190	187
query46	870	979	604	604
query47	2135	2164	2059	2059
query48	311	319	229	229
query49	645	463	381	381
query50	672	291	211	211
query51	4110	4087	4063	4063
query52	108	106	97	97
query53	285	345	288	288
query54	295	269	255	255
query55	88	84	83	83
query56	320	303	300	300
query57	1364	1338	1287	1287
query58	292	274	264	264
query59	2576	2721	2567	2567
query60	347	337	319	319
query61	156	148	147	147
query62	632	602	517	517
query63	309	279	273	273
query64	4938	1272	997	997
query65	
query66	1483	478	352	352
query67	16362	16683	16398	16398
query68	
query69	411	325	310	310
query70	1005	1009	992	992
query71	343	315	304	304
query72	3050	2835	2556	2556
query73	539	554	327	327
query74	10004	10009	9776	9776
query75	2868	2795	2484	2484
query76	2277	1049	698	698
query77	353	378	326	326
query78	11133	11387	10674	10674
query79	2582	791	641	641
query80	1798	613	549	549
query81	568	283	249	249
query82	994	151	119	119
query83	326	265	243	243
query84	252	117	98	98
query85	895	477	436	436
query86	419	308	297	297
query87	3145	3106	2994	2994
query88	3533	2638	2632	2632
query89	421	370	350	350
query90	1989	181	177	177
query91	167	156	131	131
query92	77	74	68	68
query93	1293	830	513	513
query94	626	308	303	303
query95	591	336	329	329
query96	629	503	224	224
query97	2476	2506	2430	2430
query98	235	222	220	220
query99	1003	1024	908	908
Total cold run time: 254835 ms
Total hot run time: 184982 ms

@RoanHeNaN

Copy link
Copy Markdown
Contributor Author

run buildall

@doris-robot

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

------ Round 1 ----------------------------------
orders	Doris	NULL	NULL	0	0	0	NULL	0	NULL	NULL	2023-12-26 18:27:23	2023-12-26 18:42:55	NULL	utf-8	NULL	NULL	
============================================
q1	17599	4517	4278	4278
q2	q3	10644	834	556	556
q4	4689	352	247	247
q5	7607	1209	1022	1022
q6	174	174	147	147
q7	799	861	685	685
q8	9958	1500	1375	1375
q9	5507	4706	4724	4706
q10	6330	1980	1689	1689
q11	484	241	241	241
q12	768	589	471	471
q13	18050	2936	2190	2190
q14	234	232	211	211
q15	q16	741	756	678	678
q17	734	874	436	436
q18	6337	5348	5172	5172
q19	1125	990	619	619
q20	550	496	373	373
q21	4479	2006	1652	1652
q22	382	354	271	271
Total cold run time: 97191 ms
Total hot run time: 27019 ms

----- Round 2, with runtime_filter_mode=off -----
orders	Doris	NULL	NULL	150000000	42	6422171781	NULL	22778155	NULL	NULL	2023-12-26 18:27:23	2023-12-26 18:42:55	NULL	utf-8	NULL	NULL	
============================================
q1	4711	4591	4625	4591
q2	q3	4022	4348	3851	3851
q4	938	1201	822	822
q5	4086	4388	4346	4346
q6	186	175	141	141
q7	1762	1677	1524	1524
q8	2555	2760	2630	2630
q9	7489	7548	7335	7335
q10	3756	3978	3567	3567
q11	542	468	431	431
q12	528	601	485	485
q13	2852	3300	2364	2364
q14	289	302	277	277
q15	q16	731	785	717	717
q17	1216	1459	1418	1418
q18	7290	6900	6736	6736
q19	948	854	941	854
q20	2094	2180	2229	2180
q21	4055	3579	3432	3432
q22	481	457	373	373
Total cold run time: 50531 ms
Total hot run time: 48074 ms

@doris-robot

Copy link
Copy Markdown
TPC-DS: Total hot run time: 168267 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 7d4eebc18c19c9ea9c458886211009154621ee6d, data reload: false

query5	4347	664	500	500
query6	351	231	225	225
query7	4229	484	271	271
query8	352	249	239	239
query9	8737	2712	2702	2702
query10	494	399	357	357
query11	7028	5078	4891	4891
query12	180	130	125	125
query13	1274	482	345	345
query14	5808	3733	3389	3389
query14_1	2810	2859	2820	2820
query15	204	198	176	176
query16	996	483	465	465
query17	907	730	632	632
query18	2451	459	355	355
query19	214	209	188	188
query20	139	132	128	128
query21	218	135	109	109
query22	13277	14001	14502	14001
query23	16432	15838	15874	15838
query23_1	15762	15916	15744	15744
query24	7164	1603	1220	1220
query24_1	1222	1229	1239	1229
query25	563	467	411	411
query26	1234	275	148	148
query27	2767	494	292	292
query28	4486	1829	1840	1829
query29	818	558	480	480
query30	298	210	188	188
query31	1000	952	874	874
query32	82	74	72	72
query33	522	332	289	289
query34	937	874	533	533
query35	635	684	596	596
query36	1084	1098	929	929
query37	138	98	83	83
query38	2938	2903	2937	2903
query39	858	837	801	801
query39_1	809	812	787	787
query40	237	153	134	134
query41	62	58	61	58
query42	260	254	256	254
query43	241	256	219	219
query44	
query45	201	196	183	183
query46	880	1010	609	609
query47	2100	2137	2046	2046
query48	312	314	226	226
query49	638	467	388	388
query50	715	275	211	211
query51	4095	3993	4045	3993
query52	264	269	258	258
query53	286	341	286	286
query54	308	283	274	274
query55	91	89	86	86
query56	320	317	293	293
query57	1946	1808	1726	1726
query58	289	275	274	274
query59	2780	2943	2739	2739
query60	349	337	322	322
query61	157	153	153	153
query62	627	582	529	529
query63	307	278	272	272
query64	5079	1269	971	971
query65	
query66	1450	459	383	383
query67	24313	24282	24174	24174
query68	
query69	404	334	308	308
query70	937	933	959	933
query71	345	315	307	307
query72	2789	2221	2471	2221
query73	530	542	323	323
query74	9628	9542	9386	9386
query75	2870	2750	2473	2473
query76	2286	1031	688	688
query77	365	367	313	313
query78	10814	11140	10408	10408
query79	1130	787	569	569
query80	681	650	537	537
query81	478	256	231	231
query82	1336	155	121	121
query83	341	274	250	250
query84	301	122	103	103
query85	889	580	532	532
query86	373	305	304	304
query87	3153	3085	3106	3085
query88	3573	2655	2644	2644
query89	435	381	342	342
query90	1966	181	168	168
query91	169	162	134	134
query92	77	73	72	72
query93	900	861	518	518
query94	466	300	298	298
query95	583	335	309	309
query96	647	516	231	231
query97	2488	2516	2393	2393
query98	232	223	228	223
query99	1022	1005	821	821
Total cold run time: 248872 ms
Total hot run time: 168267 ms

@hello-stephen

Copy link
Copy Markdown
Contributor

BE UT Coverage Report

Increment line coverage 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 52.81% (19854/37595)
Line Coverage 36.32% (185474/510671)
Region Coverage 32.58% (143702/441119)
Branch Coverage 33.76% (62874/186235)

@hello-stephen

Copy link
Copy Markdown
Contributor

BE Regression && UT Coverage Report

Increment line coverage 100% (0/0) 🎉

Increment coverage report
Complete coverage report

Category Coverage
Function Coverage 71.79% (26419/36798)
Line Coverage 54.60% (277912/508950)
Region Coverage 51.82% (230687/445156)
Branch Coverage 53.26% (99448/186719)

@airborne12 airborne12 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM

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

Copy link
Copy Markdown
Contributor

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

@github-actions

Copy link
Copy Markdown
Contributor

PR approved by anyone and no changes requested.

@yiguolei
yiguolei merged commit 28a82a4 into apache:master Mar 25, 2026
30 of 31 checks passed
HappenLee pushed a commit to HappenLee/incubator-doris that referenced this pull request Mar 31, 2026
…rain_rows (apache#60358)

Before this change, when the amount of data used to train the index was
less than the required amount, import or compaction might fail, which
severely impacted user experience. Now, in such cases, it automatically
determines whether training and index generation are needed. When the
amount is completely insufficient, index construction is skipped, and
during queries, it falls back to brute-force computation.

For the calculation of min_train_rows:
1. IVF requires no less than nlist rows.
2. PQ requires no less than 2^pq_nbits * 100 rows.

Take the max of the two as the required minimum number of rows.

### Check List (For Author)

- Test <!-- At least one of them must be included. -->
    - [ ] 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 <!-- Add your reason?  -->

- Behavior changed:
    - [ ] No.
    - [ ] Yes. <!-- Explain the behavior change -->

- Does this need documentation?
    - [ ] No.
- [ ] Yes. <!-- Add document PR link here. eg:
apache/doris-website#1214 -->

### Check List (For Reviewer who merge this PR)

- [ ] Confirm the release note
- [ ] Confirm test cases
- [ ] Confirm document
- [ ] Add branch pick label <!-- Add branch pick label that this PR
should merge into -->
@RoanHeNaN
RoanHeNaN deleted the opt-index-train branch April 8, 2026 06:18
RoanHeNaN added a commit to RoanHeNaN/doris that referenced this pull request Apr 8, 2026
…rain_rows (apache#60358)

Before this change, when the amount of data used to train the index was
less than the required amount, import or compaction might fail, which
severely impacted user experience. Now, in such cases, it automatically
determines whether training and index generation are needed. When the
amount is completely insufficient, index construction is skipped, and
during queries, it falls back to brute-force computation.

For the calculation of min_train_rows:
1. IVF requires no less than nlist rows.
2. PQ requires no less than 2^pq_nbits * 100 rows.

Take the max of the two as the required minimum number of rows.

### Check List (For Author)

- Test <!-- At least one of them must be included. -->
    - [ ] 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 <!-- Add your reason?  -->

- Behavior changed:
    - [ ] No.
    - [ ] Yes. <!-- Explain the behavior change -->

- Does this need documentation?
    - [ ] No.
- [ ] Yes. <!-- Add document PR link here. eg:
apache/doris-website#1214 -->

### Check List (For Reviewer who merge this PR)

- [ ] Confirm the release note
- [ ] Confirm test cases
- [ ] Confirm document
- [ ] Add branch pick label <!-- Add branch pick label that this PR
should merge into -->
RoanHeNaN added a commit to RoanHeNaN/doris that referenced this pull request Apr 8, 2026
yiguolei pushed a commit that referenced this pull request Apr 9, 2026
…es (#62215)

## Summary
- backport PR #60358, #61160 and #62178 into branch-4.1 as a single
commit
- add IVF on-disk ANN index support, related cache/runtime changes, and
FE session/property updates
- bring over ANN regression coverage updates for IVF, IVF on-disk,
small-segment and min-train-rows scenarios
morningman added a commit to morningman/doris that referenced this pull request Aug 5, 2026
…lect compaction profile BE by tablet replica apache#62178 apache#65552

Backport two upstream regression-test fixes that never reached branch-4.0.
Both cause recurring failures in the daily branch-4.0 P0 pipeline.

1. ann_index_basic vs ivf_index_test table-name collision (apache#62178)

ann_index_basic and ivf_index_test run in the same regression database
(ann_index_p0) and both used tbl_ann_l2 / tbl_ann_ip. With suiteParallel=10
they can run concurrently: FE logs of the failing run show ivf_index_test
dropping and recreating tbl_ann_ip 230ms after ann_index_basic created it,
then inserting 6 rows. ann_index_basic then reads the neighbor's table by
name and fails. This also explains the historical intermittent empty result
of sql_ip_asc (query landing between the neighbor's create and publish);
the insert itself publishes in ~80ms, so the visibility-window theory
behind the waitRowsVisible gate (apache#65942) was wrong, and the 30s gate now
times out against the neighbor's 6-row table instead.

Rename the shared tables with basic_/ivf_ prefixes as upstream did in
9c226f5 (apache#62178) and drop the gate. ann_index_basic.groovy becomes
byte-identical to the upstream post-fix file. ivf_index_test takes only
the renames because the upstream file also carries the apache#60358 behavior
change (insufficient train rows no longer throws) which branch-4.0 BE
does not have. No .out changes needed.

2. test_compaction_profile_action queries an arbitrary BE (apache#65552)

The suite built the /api/compaction/profile URL from
backendId_to_backendIP.keySet()[0]. On a multi-BE pipeline (4 BEs,
replication forced to 3) the chosen BE has ~1/4 chance of not hosting the
tablet replica, so the tablet_id filter returns an empty list (observed
5/26 failures; the case is currently muted as DORIS-26131). Derive the
endpoint from the BackendId of the selected tablet row as upstream did in
fd16ebd (apache#65552); the file becomes byte-identical to the upstream
post-fix version.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

approved Indicates a PR has been approved by one committer. dev/4.1.0-merged reviewed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants