[ 
https://issues.apache.org/jira/browse/BEAM-3326?focusedWorklogId=85309&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-85309
 ]

ASF GitHub Bot logged work on BEAM-3326:
----------------------------------------

                Author: ASF GitHub Bot
            Created on: 28/Mar/18 15:59
            Start Date: 28/Mar/18 15:59
    Worklog Time Spent: 10m 
      Work Description: bsidhom commented on a change in pull request #4963: 
[BEAM-3326] Abstract away closing the inbound receiver, waiting for the bundle 
to finish, waiting for outbound to complete within the ActiveBundle.
URL: https://github.com/apache/beam/pull/4963#discussion_r177800576
 
 

 ##########
 File path: 
runners/java-fn-execution/src/main/java/org/apache/beam/runners/fnexecution/control/SdkHarnessClient.java
 ##########
 @@ -146,22 +154,92 @@ private BundleProcessor(
   }
 
   /** An active bundle for a particular {@link 
BeamFnApi.ProcessBundleDescriptor}. */
-  @AutoValue
-  public abstract static class ActiveBundle<InputT> {
-    public abstract String getBundleId();
-
-    public abstract CompletionStage<BeamFnApi.ProcessBundleResponse> 
getBundleResponse();
+  public static class ActiveBundle<InputT> implements AutoCloseable {
+    private final String bundleId;
+    private final CompletionStage<BeamFnApi.ProcessBundleResponse> response;
+    private final CloseableFnDataReceiver<WindowedValue<InputT>> inputReceiver;
+    private final Map<BeamFnApi.Target, InboundDataClient> outputClients;
 
-    public abstract CloseableFnDataReceiver<WindowedValue<InputT>> 
getInputReceiver();
-    public abstract Map<BeamFnApi.Target, InboundDataClient> 
getOutputClients();
-
-    public static <InputT> ActiveBundle<InputT> create(
+    private ActiveBundle(
         String bundleId,
         CompletionStage<BeamFnApi.ProcessBundleResponse> response,
-        CloseableFnDataReceiver<WindowedValue<InputT>> dataReceiver,
+        CloseableFnDataReceiver<WindowedValue<InputT>> inputReceiver,
         Map<BeamFnApi.Target, InboundDataClient> outputClients) {
-      return new AutoValue_SdkHarnessClient_ActiveBundle<>(
-          bundleId, response, dataReceiver, outputClients);
+      this.bundleId = bundleId;
+      this.response = response;
+      this.inputReceiver = inputReceiver;
+      this.outputClients = outputClients;
+    }
+
+    /**
+     * Returns an id used to represent this bundle.
+     */
+    public String getBundleId() {
+      return bundleId;
+    }
+
+    /**
+     * Returns a {@link FnDataReceiver receiver} which consumes input elements 
forwarding them
+     * to the SDK. When
+     */
+    public FnDataReceiver<WindowedValue<InputT>> getInputReceiver() {
+      return inputReceiver;
+    }
+
+    /**
+     * Blocks till bundle processing is finished. This is comprised of:
+     * <ul>
+     *   <li>closing the {@link #getInputReceiver() input receiver}.</li>
+     *   <li>waiting for the SDK to say that processing the bundle is 
finished.</li>
+     *   <li>waiting for all inbound data clients to complete</li>
+     * </ul>
+     *
+     * <p>This method will throw an exception if bundle processing has failed.
+     * {@link Throwable#getSuppressed()} will return all the reasons as to why 
processing has
+     * failed.
+     */
+    @Override
+    public void close() throws Exception {
+      Exception exception = null;
+      try {
+        inputReceiver.close();
+      } catch (Exception e) {
+        exception = e;
+      }
+      try {
+        // We don't have to worry about the completion stage.
+        if (exception == null) {
+          MoreFutures.get(response);
+        } else {
+          // TODO: Handle aborting the bundle being processed.
+          throw new IllegalStateException("Processing bundle failed, TODO: 
abort bundle.");
+        }
+      } catch (Exception e) {
+        if (exception == null) {
+          exception = e;
+        } else {
+          exception.addSuppressed(e);
+        }
+      }
+      for (InboundDataClient outputClient : outputClients.values()) {
+        try {
+          // If we failed processing this bundle, we should cancel all inbound 
data.
+          if (exception == null) {
+            outputClient.awaitCompletion();
 
 Review comment:
   Could the failure of a single inbound client cause other clients to fail? If 
so, would this be captured by the overall bundle result? If not, you will need 
to wait for completion of the first-finished result rather than an arbitrary 
client here.

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Issue Time Tracking
-------------------

    Worklog Id:     (was: 85309)
    Time Spent: 4.5h  (was: 4h 20m)

> Execute a Stage via the portability framework in the ReferenceRunner
> --------------------------------------------------------------------
>
>                 Key: BEAM-3326
>                 URL: https://issues.apache.org/jira/browse/BEAM-3326
>             Project: Beam
>          Issue Type: New Feature
>          Components: runner-core
>            Reporter: Thomas Groh
>            Assignee: Thomas Groh
>            Priority: Major
>              Labels: portability
>          Time Spent: 4.5h
>  Remaining Estimate: 0h
>
> This is the supertask for remote execution in the Universal Local Runner 
> (BEAM-2899).
> This executes a stage remotely via portability framework APIs



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to