From 6f753da4a9bd2defcfe8f5d3558177c77865bb7e Mon Sep 17 00:00:00 2001 From: Colin Patrick Mccabe Date: Wed, 1 Apr 2015 16:02:39 -0700 Subject: [PATCH] HDFS-7922. ShortCircuitCache#close is not releasing ScheduledThreadPoolExecutors (Rakesh R via Colin P. McCabe) (cherry picked from commit 3c7adaaf3571c91fee80585472d2a81402a53e2b) --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 ++ .../hdfs/shortcircuit/ShortCircuitCache.java | 28 +++++++++++++++++++ .../shortcircuit/TestShortCircuitCache.java | 2 +- 3 files changed, 32 insertions(+), 1 deletion(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 7f1640e19db..8139b02003b 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -94,6 +94,9 @@ Release 2.8.0 - UNRELEASED HDFS-6945. BlockManager should remove a block from excessReplicateMap and decrement ExcessBlocks metric when the block is removed. (aajisaka) + HDFS-7922. ShortCircuitCache#close is not releasing + ScheduledThreadPoolExecutors (Rakesh R via Colin P. McCabe) + Release 2.7.0 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/shortcircuit/ShortCircuitCache.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/shortcircuit/ShortCircuitCache.java index 73c52d56e45..d1ec3b8e0d7 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/shortcircuit/ShortCircuitCache.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/shortcircuit/ShortCircuitCache.java @@ -916,6 +916,34 @@ public void close() { } finally { lock.unlock(); } + + releaserExecutor.shutdown(); + cleanerExecutor.shutdown(); + // wait for existing tasks to terminate + try { + if (!releaserExecutor.awaitTermination(30, TimeUnit.SECONDS)) { + LOG.error("Forcing SlotReleaserThreadPool to shutdown!"); + releaserExecutor.shutdownNow(); + } + } catch (InterruptedException e) { + releaserExecutor.shutdownNow(); + Thread.currentThread().interrupt(); + LOG.error("Interrupted while waiting for SlotReleaserThreadPool " + + "to terminate", e); + } + + // wait for existing tasks to terminate + try { + if (!cleanerExecutor.awaitTermination(30, TimeUnit.SECONDS)) { + LOG.error("Forcing CleanerThreadPool to shutdown!"); + cleanerExecutor.shutdownNow(); + } + } catch (InterruptedException e) { + cleanerExecutor.shutdownNow(); + Thread.currentThread().interrupt(); + LOG.error("Interrupted while waiting for CleanerThreadPool " + + "to terminate", e); + } IOUtils.cleanup(LOG, shmManager); } diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/shortcircuit/TestShortCircuitCache.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/shortcircuit/TestShortCircuitCache.java index 7daabd0c4c8..7d26dee610e 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/shortcircuit/TestShortCircuitCache.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/shortcircuit/TestShortCircuitCache.java @@ -203,7 +203,7 @@ public ShortCircuitReplicaInfo createShortCircuitReplicaInfo() { cache.close(); } - @Test(timeout=60000) + @Test(timeout=100000) public void testExpiry() throws Exception { final ShortCircuitCache cache = new ShortCircuitCache(2, 1, 1, 10000000, 1, 10000000, 0);