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

yiguolei pushed a commit to branch branch-4.2
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-4.2 by this push:
     new 08f19f63ae2 branch-4.2: [fix](fe) Avoid Meta Service queries during 
streaming job replay #69498 (#69537)
08f19f63ae2 is described below

commit 08f19f63ae2c735ae3cd5614740302d8f4789472
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Mon Oct 26 14:21:44 2026 +0800

    branch-4.2: [fix](fe) Avoid Meta Service queries during streaming job 
replay #69498 (#69537)
    
    Cherry-picked from #69498
    
    ---------
    
    Co-authored-by: wudi <[email protected]>
    Co-authored-by: JNSimba <[email protected]>
---
 .../insert/streaming/StreamingInsertJob.java       |  5 +--
 .../StreamingInsertJobOffsetPersistenceTest.java   | 44 ++++++++++++++++++++++
 2 files changed, 46 insertions(+), 3 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/job/extensions/insert/streaming/StreamingInsertJob.java
 
b/fe/fe-core/src/main/java/org/apache/doris/job/extensions/insert/streaming/StreamingInsertJob.java
index 71f94723427..7343a7b723d 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/job/extensions/insert/streaming/StreamingInsertJob.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/job/extensions/insert/streaming/StreamingInsertJob.java
@@ -1125,7 +1125,7 @@ public class StreamingInsertJob extends 
AbstractJob<StreamingJobSchedulerTask, M
             modifyPropertiesInternal(replayJob.getProperties());
             if (replayPersistInfo != null) {
                 setOffsetProviderPersist(replayPersistInfo);
-                if (tvfType != null && !Config.isCloudMode()) {
+                if (tvfType != null) {
                     
offsetProvider.restoreFromPersistInfo(offsetProviderPersist);
                 }
             } else {
@@ -1137,9 +1137,8 @@ public class StreamingInsertJob extends 
AbstractJob<StreamingJobSchedulerTask, M
                             offsetProviderPersist, 
offsetProvider.getPersistInfo());
                 }
             }
-            // When the pause state is restarted, it also needs to be updated
             if (Config.isCloudMode()) {
-                replayOnCloudMode();
+                this.jobStatistic = replayJob.getJobStatistic();
             }
         } catch (Exception e) {
             // should not happen
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/job/extensions/insert/streaming/StreamingInsertJobOffsetPersistenceTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/job/extensions/insert/streaming/StreamingInsertJobOffsetPersistenceTest.java
index 65d94c8e672..9ee3668ca92 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/job/extensions/insert/streaming/StreamingInsertJobOffsetPersistenceTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/job/extensions/insert/streaming/StreamingInsertJobOffsetPersistenceTest.java
@@ -387,6 +387,50 @@ public class StreamingInsertJobOffsetPersistenceTest {
         Assert.assertFalse(recovered.hasMoreDataToConsume());
     }
 
+    @Test
+    public void 
testCloudReplayDoesNotFetchProgressAndPendingFailurePreventsDispatch() throws 
Exception {
+        TestStreamingInsertJob job = Mockito.spy(newJob(new 
S3SourceOffsetProvider(), 1021L));
+        Deencapsulation.setField(job, "tvfType", S3TableValuedFunction.NAME);
+        Deencapsulation.setField(job, "runningStreamTask", null);
+        
job.offsetProvider.restoreFromPersistInfo("{\"endFile\":\"data/a.csv\"}");
+        StreamingInsertJob replayJob = new StreamingInsertJob();
+        Deencapsulation.setField(replayJob, "jobId", 9001L);
+        Deencapsulation.setField(replayJob, "properties", new HashMap<String, 
String>());
+        Deencapsulation.setField(replayJob, "tvfType", 
S3TableValuedFunction.NAME);
+        replayJob.setJobStatus(JobStatus.PAUSED);
+        replayJob.getProperties().put(StreamingJobProperties.OFFSET_PROPERTY, 
"{\"fileName\":\"data/b.csv\"}");
+        replayJob.setOffsetProviderPersist("{\"endFile\":\"data/b.csv\"}");
+        replayJob.getJobStatistic().setScannedRows(10);
+        replayJob.getJobStatistic().setLoadBytes(218);
+        replayJob.getJobStatistic().setFileNumber(1);
+        replayJob.getJobStatistic().setFileSize(138);
+        replayJob.getJobStatistic().setFilteredRows(2);
+        StreamingInsertJob replayRecord = GsonUtils.GSON.fromJson(
+                GsonUtils.GSON.toJson(replayJob, StreamingInsertJob.class), 
StreamingInsertJob.class);
+        Mockito.doThrow(new JobException("MS 
unavailable")).when(job).replayOnCloudMode();
+
+        try (MockedStatic<Config> config = Mockito.mockStatic(Config.class)) {
+            config.when(Config::isCloudMode).thenReturn(true);
+
+            job.replayOnUpdated(replayRecord);
+
+            Mockito.verify(job, Mockito.never()).replayOnCloudMode();
+            Assert.assertEquals(JobStatus.PAUSED, job.getJobStatus());
+            Assert.assertEquals("{\"endFile\":\"data/b.csv\"}", 
job.getOffsetProviderPersist());
+            Assert.assertEquals("{\"fileName\":\"data/b.csv\"}", 
job.offsetProvider.getShowCurrentOffset());
+            Assert.assertEquals(replayJob.getJobStatistic().toJson(), 
job.getJobStatistic().toJson());
+
+            job.setJobStatus(JobStatus.PENDING);
+            new StreamingJobSchedulerTask(job).run();
+
+            Mockito.verify(job).replayOnCloudMode();
+            Assert.assertEquals(JobStatus.PAUSED, job.getJobStatus());
+            Assert.assertTrue(job.getFailureReason().getMsg().contains("MS 
unavailable"));
+            Mockito.verify(job, Mockito.never()).replayOffsetProviderIfNeed();
+            Mockito.verify(job, Mockito.never()).createStreamingTask();
+        }
+    }
+
     @Test
     public void testReplayUpdatedRestoresFinalStateAndRemovesCallback() {
         TestStreamingInsertJob job = newJob(new JdbcSourceOffsetProvider(), 
1013L);


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

Reply via email to