This is an automated email from the ASF dual-hosted git repository.

danny0405 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hudi.git


The following commit(s) were added to refs/heads/master by this push:
     new 848d33e11823 test(flink): de-flake testLookupJoin lookup-join IT 
(#19093)
848d33e11823 is described below

commit 848d33e11823f1c6bcfc237d44229315e7781d30
Author: Vova Kolmakov <[email protected]>
AuthorDate: Tue Jun 30 08:30:52 2026 +0700

    test(flink): de-flake testLookupJoin lookup-join IT (#19093)
    
    The streaming lookup join in ITTestHoodieDataSource.testLookupJoin reads 
its dimension table through HoodieLookupFunction, whose cache is populated 
lazily on the first probe row. A teardown / commit-visibility race can 
occasionally make the join emit no rows; execInsertSql awaits the insert but 
swallows the exception, so the empty result is committed to t2 and the read 
then asserts against an empty table.
    
    Both tables use uuid as the record key, so re-running the insert is an 
idempotent upsert. Retry the insert-and-read up to MAX_STREAM_READ_ATTEMPTS 
until the expected rows materialize, mirroring the existing stream-read 
de-flake pattern (submitAndFetchWithRetry).
    
    Co-authored-by: Vova Kolmakov <[email protected]>
---
 .../org/apache/hudi/table/ITTestHoodieDataSource.java | 19 ++++++++++++++++---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git 
a/hudi-flink-datasource/hudi-flink/src/test/java/org/apache/hudi/table/ITTestHoodieDataSource.java
 
b/hudi-flink-datasource/hudi-flink/src/test/java/org/apache/hudi/table/ITTestHoodieDataSource.java
index dbe596007f7a..b91cf3ef3324 100644
--- 
a/hudi-flink-datasource/hudi-flink/src/test/java/org/apache/hudi/table/ITTestHoodieDataSource.java
+++ 
b/hudi-flink-datasource/hudi-flink/src/test/java/org/apache/hudi/table/ITTestHoodieDataSource.java
@@ -1246,9 +1246,22 @@ public class ITTestHoodieDataSource {
         + "       join t1/*+ OPTIONS('lookup.join.cache.ttl'='2 day', 
'lookup.async'='" + async + "',"
         + "       'lookup.join.cache.type'='" + cacheType + "') */  "
         + "       FOR SYSTEM_TIME AS OF o.proc_time AS b on o.uuid = b.uuid";
-    execInsertSql(tableEnv, sql);
-    List<Row> result = CollectionUtil.iterableToList(
-        () -> tableEnv.sqlQuery("select * from t2").execute().collect());
+
+    // The lookup function loads the dimension table lazily on the first probe 
row, so a teardown /
+    // commit-visibility race can occasionally make the join emit no rows. 
Re-running the upsert into
+    // the uuid-keyed table t2 is idempotent, so retry until the expected rows 
materialize.
+    final int expectedNum = TestData.DATA_SET_SOURCE_INSERT.size();
+    List<Row> result = Collections.emptyList();
+    for (int attempt = 1; attempt <= MAX_STREAM_READ_ATTEMPTS; attempt++) {
+      execInsertSql(tableEnv, sql);
+      result = CollectionUtil.iterableToList(
+          () -> tableEnv.sqlQuery("select * from t2").execute().collect());
+      if (result.size() >= expectedNum) {
+        break;
+      }
+      LOG.warn("testLookupJoin collected {} of {} rows on attempt {}/{}; a 
teardown race produced an "
+          + "empty lookup join. Retrying.", result.size(), expectedNum, 
attempt, MAX_STREAM_READ_ATTEMPTS);
+    }
 
     assertRowsEquals(result, TestData.DATA_SET_SOURCE_INSERT);
   }

Reply via email to