浏览代码

HADOOP-10130. RawLocalFS pread does not track FileSystem Statistics (Binglin Chang via Colin Patrick McCabe)

git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-2.2@1547118 13f79535-47bb-0310-9956-ffa450edef68
Colin McCabe 11 年之前
父节点
当前提交
ba291c046c

+ 3 - 0
hadoop-common-project/hadoop-common/CHANGES.txt

@@ -64,6 +64,9 @@ Release 2.2.1 - UNRELEASED
     HADOOP-9114. After defined the dfs.checksum.type as the NULL, write file and hflush will 
     HADOOP-9114. After defined the dfs.checksum.type as the NULL, write file and hflush will 
     through java.lang.ArrayIndexOutOfBoundsException (Sathish via umamahesh)
     through java.lang.ArrayIndexOutOfBoundsException (Sathish via umamahesh)
 
 
+    HADOOP-10130. RawLocalFS::LocalFSFileInputStream.pread does not track
+    FS::Statistics (Binglin Chang via Colin Patrick McCabe)
+
 Release 2.2.0 - 2013-10-13
 Release 2.2.0 - 2013-10-13
 
 
   INCOMPATIBLE CHANGES
   INCOMPATIBLE CHANGES

+ 8 - 35
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java

@@ -82,39 +82,6 @@ public class RawLocalFileSystem extends FileSystem {
     setConf(conf);
     setConf(conf);
   }
   }
   
   
-  class TrackingFileInputStream extends FileInputStream {
-    public TrackingFileInputStream(File f) throws IOException {
-      super(f);
-    }
-    
-    @Override
-    public int read() throws IOException {
-      int result = super.read();
-      if (result != -1) {
-        statistics.incrementBytesRead(1);
-      }
-      return result;
-    }
-    
-    @Override
-    public int read(byte[] data) throws IOException {
-      int result = super.read(data);
-      if (result != -1) {
-        statistics.incrementBytesRead(result);
-      }
-      return result;
-    }
-    
-    @Override
-    public int read(byte[] data, int offset, int length) throws IOException {
-      int result = super.read(data, offset, length);
-      if (result != -1) {
-        statistics.incrementBytesRead(result);
-      }
-      return result;
-    }
-  }
-
   /*******************************************************
   /*******************************************************
    * For open()'s FSInputStream.
    * For open()'s FSInputStream.
    *******************************************************/
    *******************************************************/
@@ -123,7 +90,7 @@ public class RawLocalFileSystem extends FileSystem {
     private long position;
     private long position;
 
 
     public LocalFSFileInputStream(Path f) throws IOException {
     public LocalFSFileInputStream(Path f) throws IOException {
-      this.fis = new TrackingFileInputStream(pathToFile(f));
+      fis = new FileInputStream(pathToFile(f));
     }
     }
     
     
     @Override
     @Override
@@ -158,6 +125,7 @@ public class RawLocalFileSystem extends FileSystem {
         int value = fis.read();
         int value = fis.read();
         if (value >= 0) {
         if (value >= 0) {
           this.position++;
           this.position++;
+          statistics.incrementBytesRead(1);
         }
         }
         return value;
         return value;
       } catch (IOException e) {                 // unexpected exception
       } catch (IOException e) {                 // unexpected exception
@@ -171,6 +139,7 @@ public class RawLocalFileSystem extends FileSystem {
         int value = fis.read(b, off, len);
         int value = fis.read(b, off, len);
         if (value > 0) {
         if (value > 0) {
           this.position += value;
           this.position += value;
+          statistics.incrementBytesRead(value);
         }
         }
         return value;
         return value;
       } catch (IOException e) {                 // unexpected exception
       } catch (IOException e) {                 // unexpected exception
@@ -183,7 +152,11 @@ public class RawLocalFileSystem extends FileSystem {
       throws IOException {
       throws IOException {
       ByteBuffer bb = ByteBuffer.wrap(b, off, len);
       ByteBuffer bb = ByteBuffer.wrap(b, off, len);
       try {
       try {
-        return fis.getChannel().read(bb, position);
+        int value = fis.getChannel().read(bb, position);
+        if (value > 0) {
+          statistics.incrementBytesRead(value);
+        }
+        return value;
       } catch (IOException e) {
       } catch (IOException e) {
         throw new FSError(e);
         throw new FSError(e);
       }
       }

+ 1 - 0
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/FCStatisticsBaseTest.java

@@ -57,6 +57,7 @@ public abstract class FCStatisticsBaseTest {
     FSDataInputStream fstr = fc.open(filePath);
     FSDataInputStream fstr = fc.open(filePath);
     byte[] buf = new byte[blockSize];
     byte[] buf = new byte[blockSize];
     int bytesRead = fstr.read(buf, 0, blockSize);
     int bytesRead = fstr.read(buf, 0, blockSize);
+    fstr.read(0, buf, 0, blockSize);
     Assert.assertEquals(blockSize, bytesRead);
     Assert.assertEquals(blockSize, bytesRead);
     verifyReadBytes(stats);
     verifyReadBytes(stats);
     verifyWrittenBytes(stats);
     verifyWrittenBytes(stats);

+ 2 - 1
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestLocalFsFCStatistics.java

@@ -47,7 +47,8 @@ public class TestLocalFsFCStatistics extends FCStatisticsBaseTest {
 
 
   @Override
   @Override
   protected void verifyReadBytes(Statistics stats) {
   protected void verifyReadBytes(Statistics stats) {
-    Assert.assertEquals(blockSize, stats.getBytesRead());
+    // one blockSize for read, one for pread
+    Assert.assertEquals(2*blockSize, stats.getBytesRead());
   }
   }
 
 
   @Override
   @Override