From 0795300304b0cd824c22712c25ba5ba2b3b638f3 Mon Sep 17 00:00:00 2001 From: Rob Austin Date: Wed, 22 Oct 2014 12:37:56 +0100 Subject: [PATCH] HCOLL-167 added a executorService.awaitTermination(5, TimeUnit.SECONDS); --- .../map/AbstractChannelReplicator.java | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/openhft/chronicle/map/AbstractChannelReplicator.java b/src/main/java/net/openhft/chronicle/map/AbstractChannelReplicator.java index 7fa64bdde..9cae22389 100644 --- a/src/main/java/net/openhft/chronicle/map/AbstractChannelReplicator.java +++ b/src/main/java/net/openhft/chronicle/map/AbstractChannelReplicator.java @@ -30,10 +30,7 @@ import java.net.InetSocketAddress; import java.nio.channels.*; import java.util.Queue; import java.util.Set; -import java.util.concurrent.ConcurrentLinkedQueue; -import java.util.concurrent.CopyOnWriteArraySet; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import java.util.concurrent.*; import static java.lang.Math.round; import static java.nio.channels.SelectionKey.OP_WRITE; @@ -135,6 +132,19 @@ abstract class AbstractChannelReplicator implements Closeable { isClosed = true; closeables.closeQuietly(); executorService.shutdownNow(); + + + try { + // we HAVE to be sure we have terminated before calling close() on the + // ReplicatedChronicleMap + // if this thread is still running and you close() the ReplicatedChronicleMap without + // fulling terminating this, you can cause the ReplicatedChronicleMap to attempt to + // process data on a map that has been closed, which would result in a + // core dump. + executorService.awaitTermination(5, TimeUnit.SECONDS); + } catch (InterruptedException e) { + LOG.error("",e); + } } void closeEarlyAndQuietly(SelectableChannel channel) {