From a5568a276d7f369e3ca399f51ec88c4552a8bacc Mon Sep 17 00:00:00 2001 From: Tsz-Wo Nicholas Sze Date: Wed, 28 Jan 2015 15:59:33 -0800 Subject: [PATCH] HDFS-7681. Change ReplicaInputStreams constructor to take InputStream(s) instead of FileDescriptor(s). Contributed by Joe Pallas Conflicts: hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../server/datanode/fsdataset/ReplicaInputStreams.java | 6 +++--- .../server/datanode/fsdataset/impl/FsDatasetImpl.java | 10 ++++++++-- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index eaf3a233525..b6290ad84e2 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -288,6 +288,9 @@ Release 2.7.0 - UNRELEASED type instead of concrete classes Block and ReplicaInfo. (David Powell and Joe Pallas via szetszwo) + HDFS-7681. Change ReplicaInputStreams constructor to take InputStream(s) + instead of FileDescriptor(s). (Joe Pallas via szetszwo) + OPTIMIZATIONS HDFS-7454. Reduce memory footprint for AclEntries in NameNode. diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/ReplicaInputStreams.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/ReplicaInputStreams.java index a8bf622849c..e0928a482ef 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/ReplicaInputStreams.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/ReplicaInputStreams.java @@ -33,11 +33,11 @@ public class ReplicaInputStreams implements Closeable { private final FsVolumeReference volumeRef; /** Create an object with a data input stream and a checksum input stream. */ - public ReplicaInputStreams(FileDescriptor dataFd, FileDescriptor checksumFd, + public ReplicaInputStreams(InputStream dataStream, InputStream checksumStream, FsVolumeReference volumeRef) { this.volumeRef = volumeRef; - this.dataIn = new FileInputStream(dataFd); - this.checksumIn = new FileInputStream(checksumFd); + this.dataIn = dataStream; + this.checksumIn = checksumStream; } /** @return the data input stream. */ diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetImpl.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetImpl.java index ff10e1e5b5a..24b46012de1 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetImpl.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetImpl.java @@ -644,8 +644,14 @@ class FsDatasetImpl implements FsDatasetSpi { if (ckoff > 0) { metaInFile.seek(ckoff); } - return new ReplicaInputStreams( - blockInFile.getFD(), metaInFile.getFD(), ref); + InputStream blockInStream = new FileInputStream(blockInFile.getFD()); + try { + InputStream metaInStream = new FileInputStream(metaInFile.getFD()); + return new ReplicaInputStreams(blockInStream, metaInStream, ref); + } catch (IOException e) { + IOUtils.cleanup(null, blockInStream); + throw e; + } } catch (IOException e) { IOUtils.cleanup(null, ref); throw e;