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

swuferhong pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/fluss.git


The following commit(s) were added to refs/heads/main by this push:
     new af38e9cff [server] Fix flaky 
RebalanceManagerITCase.testRebalanceWithRemoteLog (#3313)
af38e9cff is described below

commit af38e9cffe18a53c895d19b234d1de10f0bf78cf
Author: Kaixuan Duan <[email protected]>
AuthorDate: Mon Jun 1 11:29:36 2026 +0800

    [server] Fix flaky RebalanceManagerITCase.testRebalanceWithRemoteLog (#3313)
---
 .../rebalance/RebalanceManagerITCase.java          | 25 ++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git 
a/fluss-server/src/test/java/org/apache/fluss/server/coordinator/rebalance/RebalanceManagerITCase.java
 
b/fluss-server/src/test/java/org/apache/fluss/server/coordinator/rebalance/RebalanceManagerITCase.java
index 16d06492c..a99370908 100644
--- 
a/fluss-server/src/test/java/org/apache/fluss/server/coordinator/rebalance/RebalanceManagerITCase.java
+++ 
b/fluss-server/src/test/java/org/apache/fluss/server/coordinator/rebalance/RebalanceManagerITCase.java
@@ -55,6 +55,7 @@ import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
 
 import static org.apache.fluss.record.TestData.DATA1;
 import static org.apache.fluss.record.TestData.DATA1_SCHEMA;
@@ -148,7 +149,7 @@ public class RebalanceManagerITCase {
         RemoteLogManager remoteLogManager = 
tabletServer.getReplicaManager().getRemoteLogManager();
         RemoteLogTablet remoteLogTablet = remoteLogManager.remoteLogTablet(tb);
 
-        RemoteLogManifest manifest = remoteLogTablet.currentManifest();
+        RemoteLogManifest manifest = 
waitForRemoteLogManifestReady(remoteLogTablet);
         
assertThat(manifest.getPhysicalTablePath().getTablePath()).isEqualTo(DATA1_TABLE_PATH);
         assertThat(manifest.getTableBucket()).isEqualTo(tb);
         int remoteLogSize = manifest.getRemoteLogSegmentList().size();
@@ -219,7 +220,10 @@ public class RebalanceManagerITCase {
         RemoteLogManifest newManifest = leaderRlt.currentManifest();
         
assertThat(newManifest.getPhysicalTablePath().getTablePath()).isEqualTo(DATA1_TABLE_PATH);
         assertThat(newManifest.getTableBucket()).isEqualTo(tb);
-        
assertThat(newManifest.getRemoteLogSegmentList().size()).isEqualTo(remoteLogSize);
+        // remoteLogSize is captured when async copy may not finish all 
segments yet,
+        // so the new leader's manifest can contain more segments than 
remoteLogSize.
+        assertThat(newManifest.getRemoteLogSegmentList().size())
+                .isGreaterThanOrEqualTo(remoteLogSize);
     }
 
     private void fromCoordinatorContext(
@@ -314,4 +318,21 @@ public class RebalanceManagerITCase {
         FLUSS_CLUSTER_EXTENSION.waitUntilSomeLogSegmentsCopyToRemote(
                 new TableBucket(tb.getTableId(), 0));
     }
+
+    /**
+     * Wait until the in-memory remote log manifest is ready with at least one 
segment. {@link
+     * FlussClusterExtension#waitUntilSomeLogSegmentsCopyToRemote} only 
ensures ZK has manifest
+     * handle, but the in-memory manifest may not be updated yet.
+     */
+    private RemoteLogManifest waitForRemoteLogManifestReady(RemoteLogTablet 
remoteLogTablet) {
+        AtomicReference<RemoteLogManifest> manifestRef = new 
AtomicReference<>();
+        retry(
+                Duration.ofMinutes(2),
+                () -> {
+                    RemoteLogManifest m = remoteLogTablet.currentManifest();
+                    
assertThat(m.getRemoteLogSegmentList().size()).isGreaterThan(0);
+                    manifestRef.set(m);
+                });
+        return manifestRef.get();
+    }
 }

Reply via email to