summaryrefslogtreecommitdiff
path: root/hadoop-hdfs-project/hadoop-hdfs/src/main
diff options
context:
space:
mode:
authorXiao Chen <xiao@apache.org>2018-06-03 22:29:52 -0700
committerXiao Chen <xiao@apache.org>2018-06-03 22:33:34 -0700
commit9efb4b7db00d79aded52997ec89a1be94ecdd268 (patch)
tree247ea1fcd3bd72d9a1af4675663106e94bf1a553 /hadoop-hdfs-project/hadoop-hdfs/src/main
parent9c4cbed8d19ec0f486af454de6b117d77a0a0b84 (diff)
HDFS-13339. Volume reference can't be released and may lead to deadlock when DataXceiver does a check volume. Contributed by liaoyuxiangqin and Zsolt Venczel.
Diffstat (limited to 'hadoop-hdfs-project/hadoop-hdfs/src/main')
-rw-r--r--hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/checker/DatasetVolumeChecker.java13
1 files changed, 12 insertions, 1 deletions
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/checker/DatasetVolumeChecker.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/checker/DatasetVolumeChecker.java
index 6ab6425ad7..3889e2317c 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/checker/DatasetVolumeChecker.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/checker/DatasetVolumeChecker.java
@@ -46,6 +46,7 @@ import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
@@ -103,6 +104,8 @@ public class DatasetVolumeChecker {
private static final VolumeCheckContext IGNORED_CONTEXT =
new VolumeCheckContext();
+ private final ExecutorService checkVolumeResultHandlerExecutorService;
+
/**
* @param conf Configuration object.
* @param timer {@link Timer} object used for throttling checks.
@@ -163,6 +166,12 @@ public class DatasetVolumeChecker {
.setNameFormat("DataNode DiskChecker thread %d")
.setDaemon(true)
.build()));
+
+ checkVolumeResultHandlerExecutorService = Executors.newCachedThreadPool(
+ new ThreadFactoryBuilder()
+ .setNameFormat("VolumeCheck ResultHandler thread %d")
+ .setDaemon(true)
+ .build());
}
/**
@@ -292,7 +301,9 @@ public class DatasetVolumeChecker {
numVolumeChecks.incrementAndGet();
Futures.addCallback(olf.get(),
new ResultHandler(volumeReference, new HashSet<>(), new HashSet<>(),
- new AtomicLong(1), callback));
+ new AtomicLong(1), callback),
+ checkVolumeResultHandlerExecutorService
+ );
return true;
} else {
IOUtils.cleanup(null, volumeReference);