From 1c20a323f3941e1b4790332247ca1fe26e960477 Mon Sep 17 00:00:00 2001 From: "weijie.tong" Date: Thu, 14 Sep 2017 20:02:55 +0800 Subject: [PATCH] DRILL-5749: solve deadlock occured between foreman and netty threads closes #943 --- .../java/org/apache/drill/exec/rpc/RequestIdMap.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/exec/rpc/src/main/java/org/apache/drill/exec/rpc/RequestIdMap.java b/exec/rpc/src/main/java/org/apache/drill/exec/rpc/RequestIdMap.java index 804834ca7cc..e286bebc49d 100644 --- a/exec/rpc/src/main/java/org/apache/drill/exec/rpc/RequestIdMap.java +++ b/exec/rpc/src/main/java/org/apache/drill/exec/rpc/RequestIdMap.java @@ -17,9 +17,6 @@ */ package org.apache.drill.exec.rpc; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelFuture; - import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; @@ -30,6 +27,9 @@ import com.carrotsearch.hppc.procedures.IntObjectProcedure; import com.google.common.base.Preconditions; +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelFuture; + /** * Manages the creation of rpc futures for a particular socket <--> socket * connection. Generally speaking, there will be two threads working with this @@ -54,10 +54,12 @@ void channelClosed(Throwable ex) { isOpen.set(false); if (ex != null) { final RpcException e = RpcException.mapException(ex); + IntObjectHashMap> clonedMap; synchronized (map) { - map.forEach(new SetExceptionProcedure(e)); + clonedMap = map.clone(); map.clear(); } + clonedMap.forEach(new SetExceptionProcedure(e)); } }