m-trieu commented on code in PR #31902:
URL: https://github.com/apache/beam/pull/31902#discussion_r1730017573


##########
runners/google-cloud-dataflow-java/worker/src/main/java/org/apache/beam/runners/dataflow/worker/windmill/client/AbstractWindmillStream.java:
##########
@@ -167,67 +170,103 @@ private StreamObserver<RequestT> requestObserver() {
   }
 
   /** Send a request to the server. */
-  protected final void send(RequestT request) {
-    lastSendTimeMs.set(Instant.now().getMillis());
-    synchronized (this) {
-      if (streamClosed.get()) {
-        throw new IllegalStateException("Send called on a client closed 
stream.");
+  protected final synchronized void send(RequestT request) {
+    if (isShutdown()) {
+      logger.debug(
+          "Send called on a shutdown stream={} to worker{}.", getClass(), 
backendWorkerToken);
+      return;
+    }
+
+    if (requestObserver.isClosed()) {
+      throw new IllegalStateException("Send called on a client closed 
stream.");
+    }
+
+    try {
+      lastSendTimeMs.set(Instant.now().getMillis());
+      requestObserver.onNext(request);
+    } catch (StreamObserverCancelledException e) {
+      if (isShutdown()) {
+        logger.debug("Stream was closed or shutdown during send.", e);
+        return;
       }
 
-      requestObserver().onNext(request);
+      logger.error(
+          "StreamObserver was unexpectedly cancelled for stream={}, worker={}. 
stacktrace={}",
+          getClass(),
+          backendWorkerToken,
+          e.getStackTrace(),
+          e);
+      throw e;
     }
   }
 
   /** Starts the underlying stream. */
   protected final void startStream() {
     // Add the stream to the registry after it has been fully constructed.
     streamRegistry.add(this);
-    while (true) {
+    while (!isShutdown.get()) {
       try {
         synchronized (this) {
+          if (isShutdown.get()) {
+            break;
+          }
           startTimeMs.set(Instant.now().getMillis());
           lastResponseTimeMs.set(0);
-          streamClosed.set(false);
-          // lazily initialize the requestObserver. Gets reset whenever the 
stream is reopened.
-          requestObserver = requestObserverSupplier.get();
+          requestObserver.reset();
           onNewStream();
-          if (clientClosed.get()) {
+          if (clientClosed.get() && !isShutdown()) {

Review Comment:
   done



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to