github-actions[bot] commented on code in PR #65453:
URL: https://github.com/apache/doris/pull/65453#discussion_r3567754806


##########
regression-test/plugins/plugin_index_change.groovy:
##########
@@ -24,21 +24,30 @@ import java.util.regex.Pattern;
 def delta_time = 1000
 
 Suite.metaClass.wait_for_last_build_index_finish = {table_name, OpTimeout ->
-    def useTime = 0
-    for(int t = delta_time; t <= OpTimeout; t += delta_time){
-        def alter_res = sql """SHOW BUILD INDEX WHERE TableName = 
"${table_name}" ORDER BY CreateTime DESC LIMIT 1;"""
+    def finished = false
+    def alter_res = []
+    for(int t = 0; t <= OpTimeout; t += delta_time){
+        alter_res = sql """SHOW BUILD INDEX WHERE TableName = "${table_name}" 
ORDER BY CreateTime DESC LIMIT 1;"""
+        if (alter_res.isEmpty()) {
+            logger.info(table_name + " has no build index job to wait for")

Review Comment:
   Allowing an empty result here fixes callers that really have no build-index 
job, but this helper is also used in cases where empty is not a completed wait. 
Some callers invoke it immediately after explicit build submissions, e.g. 
`variant_p0/with_index/load.groovy` after `build_index_on_table("inv_idx", 
table_name)` and `test_create_index_2.groovy` in cloud mode after `build index 
on ...`; if `SHOW BUILD INDEX` is still empty, the test now proceeds without 
proving the requested build ran. Other direct callers should wait on the schema 
job instead: `test_create_index_2.groovy` drops a non-cloud `NGRAM_BF` index at 
line 110, which routes to the schema-change path rather than `IndexChangeJob`, 
so empty-result success skips the real wait. Finally, when build-index rows do 
exist, `ORDER BY CreateTime DESC LIMIT 1` only checks one partition row, but FE 
creates one `IndexChangeJob` per selected partition, so one latest `FINISHED` 
row can hide sibling rows that are still `RUNNING` or `CAN
 CELLED`. Please split the no-job/schema callers from explicit 
build/delete-index callers, and have the latter pass/check the expected job 
count or job id across all relevant rows.



##########
regression-test/plugins/plugin_index_change.groovy:
##########
@@ -51,25 +60,28 @@ Suite.metaClass.build_index_on_table = {index_name, 
table_name ->
 }
 
 Suite.metaClass.wait_for_last_col_change_finish = { table_name, OpTimeout ->
-    def useTime = 0
+    def finished = false
+    def alter_res = ""
 
-    for (int t = delta_time; t <= OpTimeout; t += delta_time) {
-        def alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = 
"${table_name}" ORDER BY CreateTime DESC LIMIT 1;"""
+    for (int t = 0; t <= OpTimeout; t += delta_time) {
+        alter_res = sql """SHOW ALTER TABLE COLUMN WHERE TableName = 
"${table_name}" ORDER BY CreateTime DESC LIMIT 1;"""
         alter_res = alter_res.toString()
         if (alter_res.contains("FINISHED")) {
             sleep(3000) // wait change table state to normal
             logger.info(table_name + " latest alter job finished, detail: " + 
alter_res)
+            finished = true
+            break
+        }
+        if (t >= OpTimeout) {
             break
         }
-        useTime = t
         sleep(delta_time)
     }
-    assertTrue(useTime <= OpTimeout, "wait_for_last_col_change_finish timeout")
+    assertTrue(finished, "wait_for_last_col_change_finish timeout, latest 
result: ${alter_res}")
 }
 
 Suite.metaClass.wait_for_last_schema_change_finish = {table_name, OpTimeout ->
     wait_for_last_col_change_finish(table_name, OpTimeout)
-    wait_for_last_build_index_finish(table_name, OpTimeout)

Review Comment:
   Making this wrapper column-only fixes the schema-only callers, but it also 
skips cloud full-table drop-index cleanup jobs. In cloud mode, dropping an 
inverted index with `enable_add_index_for_new_data` goes through 
`modifyTableLightSchemaChange` and then submits per-partition index-change 
delete jobs via `buildOrDeleteTableInvertedIndices`; `SHOW ALTER TABLE COLUMN` 
can finish before those jobs are done. Callers like 
`variant_p0/with_index/load.groovy` line 52 and `test_add_drop_index.groovy` 
line 147 then create/build another index on the same table, which can race the 
unfinished cleanup and hit the existing 
`hasIndexChangeJobOnPartition`/`hasIndexChangeJobOnTable` checks. Please split 
the wrapper semantics at these drop-index call sites, or add a separate helper 
so cloud drop-index waits include the relevant build-index/delete-index jobs 
while schema-only create-index waits remain column-only.



##########
regression-test/suites/inverted_index_p0/index_change/test_index_change_4.groovy:
##########
@@ -39,12 +39,15 @@ suite("test_index_change_4") {
             if (finished_num == expected_finished_num) {
                 sleep(10000)
                 logger.info(table_name + " all build index jobs finished, 
detail: " + alter_res)
+                finished = true
+                break

Review Comment:
   This helper still has a false-success path after the fix: when `SHOW BUILD 
INDEX WHERE TableName = ...` returns no rows, `expected_finished_num` is 0 and 
`finished_num == expected_finished_num` is true, so the newly added `finished = 
true` makes the final assertion pass without observing any build-index job. 
This V1 branch calls the helper immediately after 
`build_index_on_table("idx_note", tableName)`, so zero matching jobs should 
fail or keep waiting rather than count as "all jobs finished". Please require 
at least one observed job, or pass/check the expected job count before 
accepting the all-finished condition.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to