diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index bc27db3aea1..6ab29d18a76 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -410,6 +410,8 @@ Release 2.0.1-alpha - UNRELEASED HDFS-3579. libhdfs: fix exception handling. (Colin Patrick McCabe via atm) + HDFS-3754. BlockSender doesn't shutdown ReadaheadPool threads. (eli) + BREAKDOWN OF HDFS-3042 SUBTASKS HDFS-2185. HDFS portion of ZK-based FailoverController (todd) diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockSender.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockSender.java index 133a550bd9d..d8cba720037 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockSender.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockSender.java @@ -20,7 +20,6 @@ import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; -import java.io.EOFException; import java.io.FileDescriptor; import java.io.FileInputStream; import java.io.FileNotFoundException; @@ -38,7 +37,6 @@ import org.apache.hadoop.hdfs.protocol.ExtendedBlock; import org.apache.hadoop.hdfs.protocol.HdfsConstants; import org.apache.hadoop.hdfs.protocol.datatransfer.PacketHeader; -import org.apache.hadoop.hdfs.server.common.Util; import org.apache.hadoop.hdfs.util.DataTransferThrottler; import org.apache.hadoop.io.IOUtils; import org.apache.hadoop.io.LongWritable; @@ -163,8 +161,6 @@ class BlockSender implements java.io.Closeable { */ private static final long LONG_READ_THRESHOLD_BYTES = 256 * 1024; - private static ReadaheadPool readaheadPool = - ReadaheadPool.getInstance(); /** * Constructor @@ -691,8 +687,8 @@ private void manageOsCache() throws IOException { } // Perform readahead if necessary - if (readaheadLength > 0 && readaheadPool != null) { - curReadahead = readaheadPool.readaheadStream( + if (readaheadLength > 0 && datanode.readaheadPool != null) { + curReadahead = datanode.readaheadPool.readaheadStream( clientTraceFmt, blockInFd, offset, readaheadLength, Long.MAX_VALUE, curReadahead); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java index 0ebde007542..fd226e854f2 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java @@ -146,6 +146,7 @@ import org.apache.hadoop.hdfs.web.resources.Param; import org.apache.hadoop.http.HttpServer; import org.apache.hadoop.io.IOUtils; +import org.apache.hadoop.io.ReadaheadPool; import org.apache.hadoop.ipc.ProtobufRpcEngine; import org.apache.hadoop.ipc.RPC; import org.apache.hadoop.ipc.RemoteException; @@ -278,6 +279,7 @@ public static InetSocketAddress createSocketAddr(String target) { private Configuration conf; private final String userWithLocalPathAccess; + ReadaheadPool readaheadPool; /** * Create the DataNode given a configuration and an array of dataDirs. @@ -673,6 +675,10 @@ void startDataNode(Configuration conf, blockPoolManager = new BlockPoolManager(this); blockPoolManager.refreshNamenodes(conf); + + // Create the ReadaheadPool from the DataNode context so we can + // exit without having to explicitly shutdown its thread pool. + readaheadPool = ReadaheadPool.getInstance(); } /**