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

ethanfeng pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-celeborn.git


The following commit(s) were added to refs/heads/main by this push:
     new 9754616d [CELEBORN-330] fix deadlock when use the same netty channel 
to receive data while other thread wait the response (#1265)
9754616d is described below

commit 9754616d79cb4fa398465310f31724d52e5cbf8e
Author: Shuang <[email protected]>
AuthorDate: Thu Feb 23 17:57:43 2023 +0800

    [CELEBORN-330] fix deadlock when use the same netty channel to receive data 
while other thread wait the response (#1265)
---
 .../plugin/flink/readclient/RssBufferStream.java   | 19 +++----------
 .../common/network/server/BufferStreamManager.java | 20 ++++++++++++--
 .../service/deploy/worker/FetchHandler.scala       | 32 ++++++++++++++--------
 3 files changed, 42 insertions(+), 29 deletions(-)

diff --git 
a/client-flink/common/src/main/java/org/apache/celeborn/plugin/flink/readclient/RssBufferStream.java
 
b/client-flink/common/src/main/java/org/apache/celeborn/plugin/flink/readclient/RssBufferStream.java
index b853d43d..16cc0341 100644
--- 
a/client-flink/common/src/main/java/org/apache/celeborn/plugin/flink/readclient/RssBufferStream.java
+++ 
b/client-flink/common/src/main/java/org/apache/celeborn/plugin/flink/readclient/RssBufferStream.java
@@ -19,8 +19,6 @@ package org.apache.celeborn.plugin.flink.readclient;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.function.Supplier;
 
@@ -75,15 +73,10 @@ public class RssBufferStream {
         clientFactory.createClient(
             locations[currentLocationIndex].getHost(),
             locations[currentLocationIndex].getFetchPort());
+
+    String fileName = locations[currentLocationIndex].getFileName();
     OpenStreamWithCredit openBufferStream =
-        new OpenStreamWithCredit(
-            shuffleKey,
-            locations[currentLocationIndex].getFileName(),
-            subIndexStart,
-            subIndexEnd,
-            initialCredit);
-    long timeoutMs = conf.fetchTimeoutMs();
-    CountDownLatch latch = new CountDownLatch(1);
+        new OpenStreamWithCredit(shuffleKey, fileName, subIndexStart, 
subIndexEnd, initialCredit);
     client.sendRpc(
         openBufferStream.toByteBuffer(),
         new RpcResponseCallback() {
@@ -96,7 +89,7 @@ public class RssBufferStream {
             mapShuffleClient
                 .getReadClientHandler()
                 .registerHandler(streamId, messageConsumer, client);
-            latch.countDown();
+            logger.debug("open stream success stream id:{}, fileName: {}", 
streamId, fileName);
           }
 
           @Override
@@ -104,10 +97,6 @@ public class RssBufferStream {
             throw new RuntimeException("OpenStream failed.", e);
           }
         });
-    if (!latch.await(timeoutMs, TimeUnit.MILLISECONDS)) {
-      throw new IOException("Send openStream RPC failed to " + 
client.getSocketAddress());
-    }
-    logger.debug("rssbufferstream streamid:{}", streamId);
   }
 
   public void addCredit(ReadAddCredit addCredit) {
diff --git 
a/common/src/main/java/org/apache/celeborn/common/network/server/BufferStreamManager.java
 
b/common/src/main/java/org/apache/celeborn/common/network/server/BufferStreamManager.java
index 3cd41eba..ea87dffd 100644
--- 
a/common/src/main/java/org/apache/celeborn/common/network/server/BufferStreamManager.java
+++ 
b/common/src/main/java/org/apache/celeborn/common/network/server/BufferStreamManager.java
@@ -21,7 +21,16 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
-import java.util.*;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.PriorityQueue;
+import java.util.Queue;
+import java.util.Random;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -97,7 +106,12 @@ public class BufferStreamManager {
   }
 
   public long registerStream(
-      Channel channel, int initialCredit, int startSubIndex, int endSubIndex, 
FileInfo fileInfo)
+      Consumer<Long> callback,
+      Channel channel,
+      int initialCredit,
+      int startSubIndex,
+      int endSubIndex,
+      FileInfo fileInfo)
       throws IOException {
     long streamId = nextStreamId.getAndIncrement();
     streams.put(streamId, new StreamState(channel, fileInfo.getBufferSize()));
@@ -109,6 +123,8 @@ public class BufferStreamManager {
       mapDataPartition.addStream(streamId);
       addCredit(initialCredit, streamId);
       servingStreams.put(streamId, mapDataPartition);
+      // response streamId to channel first
+      callback.accept(streamId);
       mapDataPartition.setupDataPartitionReader(startSubIndex, endSubIndex, 
streamId);
     }
 
diff --git 
a/worker/src/main/scala/org/apache/celeborn/service/deploy/worker/FetchHandler.scala
 
b/worker/src/main/scala/org/apache/celeborn/service/deploy/worker/FetchHandler.scala
index 1504b400..98e962bb 100644
--- 
a/worker/src/main/scala/org/apache/celeborn/service/deploy/worker/FetchHandler.scala
+++ 
b/worker/src/main/scala/org/apache/celeborn/service/deploy/worker/FetchHandler.scala
@@ -18,10 +18,10 @@
 package org.apache.celeborn.service.deploy.worker
 
 import java.io.{FileNotFoundException, IOException}
-import java.nio.ByteBuffer
 import java.nio.charset.StandardCharsets
 import java.util
 import java.util.concurrent.atomic.AtomicBoolean
+import java.util.function.Consumer
 
 import com.google.common.base.Throwables
 import io.netty.util.concurrent.{Future, GenericFutureListener}
@@ -143,17 +143,25 @@ class FetchHandler(val conf: TransportConf) extends 
BaseMessageHandler with Logg
           val initialCredit = 
msg.asInstanceOf[OpenStreamWithCredit].initialCredit
           val startIndex = msg.asInstanceOf[OpenStreamWithCredit].startIndex
           val endIndex = msg.asInstanceOf[OpenStreamWithCredit].endIndex
-          val streamId =
-            bufferStreamManager.registerStream(
-              client.getChannel,
-              initialCredit,
-              startIndex,
-              endIndex,
-              fileInfo)
-          val bufferStreamHandle = new StreamHandle(streamId, 0)
-          client.getChannel.writeAndFlush(new RpcResponse(
-            request.requestId,
-            new NioManagedBuffer(bufferStreamHandle.toByteBuffer)))
+
+          val callback = new Consumer[java.lang.Long] {
+            override def accept(streamId: java.lang.Long): Unit = {
+              val bufferStreamHandle = new StreamHandle(streamId, 0)
+              client.getChannel.writeAndFlush(new RpcResponse(
+                request.requestId,
+                new NioManagedBuffer(bufferStreamHandle
+                  .toByteBuffer)))
+            }
+          }
+
+          bufferStreamManager.registerStream(
+            callback,
+            client.getChannel,
+            initialCredit,
+            startIndex,
+            endIndex,
+            fileInfo)
+
         case PartitionType.MAPGROUP =>
       } catch {
         case e: IOException =>

Reply via email to