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

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


The following commit(s) were added to refs/heads/master by this push:
     new 0d374bf001e [Dataflow Streaming] [Multikey] Route only finalize 
commits via multi key path (#40495)
0d374bf001e is described below

commit 0d374bf001e2f2727c124267e8da1b6babc23099
Author: Arun Pandian <[email protected]>
AuthorDate: Mon Oct 12 02:58:03 2026 -0700

    [Dataflow Streaming] [Multikey] Route only finalize commits via multi key 
path (#40495)
---
 .../work/processing/StreamingWorkScheduler.java    |   8 +-
 .../worker/StreamingDataflowWorkerTest.java        | 106 ++++++++++++++++++++-
 2 files changed, 111 insertions(+), 3 deletions(-)

diff --git 
a/runners/google-cloud-dataflow-java/worker/src/main/java/org/apache/beam/runners/dataflow/worker/windmill/work/processing/StreamingWorkScheduler.java
 
b/runners/google-cloud-dataflow-java/worker/src/main/java/org/apache/beam/runners/dataflow/worker/windmill/work/processing/StreamingWorkScheduler.java
index aff42b8468f..9e6a88c62cd 100644
--- 
a/runners/google-cloud-dataflow-java/worker/src/main/java/org/apache/beam/runners/dataflow/worker/windmill/work/processing/StreamingWorkScheduler.java
+++ 
b/runners/google-cloud-dataflow-java/worker/src/main/java/org/apache/beam/runners/dataflow/worker/windmill/work/processing/StreamingWorkScheduler.java
@@ -360,8 +360,12 @@ public class StreamingWorkScheduler {
     Windmill.WorkItemCommitRequest.Builder outputBuilder =
         initializeOutputBuilder(workItem.getKey(), workItem);
     
outputBuilder.setSourceStateUpdates(Windmill.SourceState.newBuilder().setOnlyFinalize(true));
-    work.setState(Work.State.COMMIT_QUEUED);
-    work.queueCommit(outputBuilder.build(), computationState);
+    commitWorkBatch(
+        computationState,
+        ImmutableList.of(work),
+        ImmutableList.of(outputBuilder.build()),
+        ImmutableList.of(),
+        ImmutableList.of());
   }
 
   private StageInfo getStageInfo(ComputationState computationState) {
diff --git 
a/runners/google-cloud-dataflow-java/worker/src/test/java/org/apache/beam/runners/dataflow/worker/StreamingDataflowWorkerTest.java
 
b/runners/google-cloud-dataflow-java/worker/src/test/java/org/apache/beam/runners/dataflow/worker/StreamingDataflowWorkerTest.java
index 6fc19c30324..b679ca40a95 100644
--- 
a/runners/google-cloud-dataflow-java/worker/src/test/java/org/apache/beam/runners/dataflow/worker/StreamingDataflowWorkerTest.java
+++ 
b/runners/google-cloud-dataflow-java/worker/src/test/java/org/apache/beam/runners/dataflow/worker/StreamingDataflowWorkerTest.java
@@ -3638,7 +3638,111 @@ public class StreamingDataflowWorkerTest {
     commit = result.get(3L);
 
     assertThat(
-        commit,
+        removeDynamicFields(commit),
+        equalTo(
+            parseCommitRequest(
+                    "key: \"0000000000000001\" "
+                        + "sharding_key: 1 "
+                        + "work_token: 3 "
+                        + "cache_token: 3 "
+                        + "source_state_updates {"
+                        + "  only_finalize: true"
+                        + "} ")
+                .build()));
+
+    assertThat(finalizeTracker, contains(0));
+    worker.stop();
+  }
+
+  @Test
+  public void testUnboundedSourcesDrain_multiKeyBundleEnabled() throws 
Exception {
+    if (!streamingEngine) {
+      return;
+    }
+    List<Integer> finalizeTracker = Lists.newArrayList();
+    TestCountingSource.setFinalizeTracker(finalizeTracker);
+    server.clearCommitsReceived();
+
+    StreamingDataflowWorker worker =
+        makeWorker(
+            
defaultWorkerParams("--experiments=unstable_enable_multi_key_bundle")
+                .setInstructions(makeUnboundedSourcePipeline())
+                .publishCounters()
+                .build());
+    worker.start();
+
+    server
+        .whenGetWorkCalled()
+        .thenReturn(
+            buildInput(
+                "work {"
+                    + "  computation_id: \"computation\""
+                    + "  input_data_watermark: 0"
+                    + "  work {"
+                    + "    key: \"0000000000000001\""
+                    + "    sharding_key: 1"
+                    + "    work_token: 2"
+                    + "    cache_token: 3"
+                    + "    key_group { high: 0 low: 1 }"
+                    + "  }"
+                    + "}",
+                null));
+
+    Map<Long, Windmill.WorkItemCommitRequest> result = 
server.waitForAndGetCommits(1);
+    Windmill.WorkItemCommitRequest commit = result.get(2L);
+    assertEquals(1, commit.getSourceStateUpdates().getFinalizeIdsCount());
+    UnsignedLong finalizeId =
+        
UnsignedLong.fromLongBits(commit.getSourceStateUpdates().getFinalizeIds(0));
+
+    // Test drain work item with only_finalize.
+    server
+        .whenGetWorkCalled()
+        .thenReturn(
+            buildInput(
+                "work {"
+                    + "  computation_id: \"computation\""
+                    + "  input_data_watermark: 0"
+                    + "  work {"
+                    + "    key: \"0000000000000001\""
+                    + "    sharding_key: 1"
+                    + "    work_token: 3"
+                    + "    cache_token: 3"
+                    + "    key_group { high: 0 low: 1 }"
+                    + "    source_state {"
+                    + "      only_finalize: true"
+                    + "      finalize_ids: "
+                    + finalizeId
+                    + "    }"
+                    + "  }"
+                    + "}",
+                null));
+
+    result = server.waitForAndGetCommits(1);
+    commit = result.get(3L);
+
+    assertThat(
+        removeDynamicFields(commit),
+        equalTo(
+            parseCommitRequest(
+                    "key: \"0000000000000001\" "
+                        + "sharding_key: 1 "
+                        + "work_token: 3 "
+                        + "cache_token: 3 "
+                        + "source_state_updates {"
+                        + "  only_finalize: true"
+                        + "} ")
+                .build()));
+
+    List<Windmill.MultiKeyWorkItemCommitRequest> multiKeyCommits =
+        server.getMultiKeyCommitsReceived();
+    assertEquals(2, multiKeyCommits.size());
+    Windmill.MultiKeyWorkItemCommitRequest finalizeMultiKeyCommit = 
multiKeyCommits.get(1);
+    assertEquals(
+        Windmill.Uint128Proto.newBuilder().setHigh(0).setLow(1).build(),
+        finalizeMultiKeyCommit.getKeyGroup());
+    assertEquals(1, finalizeMultiKeyCommit.getRequestsCount());
+    assertThat(
+        removeDynamicFields(finalizeMultiKeyCommit.getRequests(0)),
         equalTo(
             parseCommitRequest(
                     "key: \"0000000000000001\" "

Reply via email to