From 11cf658d0a8c3fb0f0822c9fc60f18f2ae5bf629 Mon Sep 17 00:00:00 2001 From: Todd Lipcon Date: Thu, 3 Nov 2011 01:00:25 +0000 Subject: [PATCH] HDFS-2533. Remove needless synchronization on some FSDataSet methods. Contributed by Todd Lipcon. git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/trunk@1196902 13f79535-47bb-0310-9956-ffa450edef68 --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 ++ .../hdfs/server/datanode/FSDataset.java | 40 ++++++++++++++++--- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 7a9d0d6b28c..5c777e2b2fa 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -877,6 +877,9 @@ Release 0.23.0 - 2011-11-01 HDFS-2130. Switch default checksum to CRC32C. (todd) + HDFS-2533. Remove needless synchronization on some FSDataSet methods. + (todd) + BUG FIXES HDFS-2347. Fix checkpointTxnCount's comment about editlog size. diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java index 512d0b64bb0..e309dc1f475 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/FSDataset.java @@ -1258,7 +1258,7 @@ public class FSDataset implements FSDatasetInterface { /** * Get File name for a given block. */ - public synchronized File getBlockFile(String bpid, Block b) + public File getBlockFile(String bpid, Block b) throws IOException { File f = validateBlockFile(bpid, b); if(f == null) { @@ -1271,16 +1271,44 @@ public class FSDataset implements FSDatasetInterface { } @Override // FSDatasetInterface - public synchronized InputStream getBlockInputStream(ExtendedBlock b) + public InputStream getBlockInputStream(ExtendedBlock b) throws IOException { - return new FileInputStream(getBlockFile(b)); + File f = getBlockFileNoExistsCheck(b); + try { + return new FileInputStream(f); + } catch (FileNotFoundException fnfe) { + throw new IOException("Block " + b + " is not valid. " + + "Expected block file at " + f + " does not exist."); + } + } + + /** + * Return the File associated with a block, without first + * checking that it exists. This should be used when the + * next operation is going to open the file for read anyway, + * and thus the exists check is redundant. + */ + private File getBlockFileNoExistsCheck(ExtendedBlock b) + throws IOException { + File f = getFile(b.getBlockPoolId(), b.getLocalBlock()); + if (f == null) { + throw new IOException("Block " + b + " is not valid"); + } + return f; } @Override // FSDatasetInterface - public synchronized InputStream getBlockInputStream(ExtendedBlock b, + public InputStream getBlockInputStream(ExtendedBlock b, long seekOffset) throws IOException { - File blockFile = getBlockFile(b); - RandomAccessFile blockInFile = new RandomAccessFile(blockFile, "r"); + File blockFile = getBlockFileNoExistsCheck(b); + RandomAccessFile blockInFile; + try { + blockInFile = new RandomAccessFile(blockFile, "r"); + } catch (FileNotFoundException fnfe) { + throw new IOException("Block " + b + " is not valid. " + + "Expected block file at " + blockFile + " does not exist."); + } + if (seekOffset > 0) { blockInFile.seek(seekOffset); }