You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by la...@apache.org on 2014/03/14 02:04:59 UTC

svn commit: r1577404 - /hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java

Author: larsh
Date: Fri Mar 14 01:04:59 2014
New Revision: 1577404

URL: http://svn.apache.org/r1577404
Log:
HBASE-10722 [0.94] HRegion.computeHDFSBlocksDistribution does not account for links and reference files.

Modified:
    hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java

Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1577404&r1=1577403&r2=1577404&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Fri Mar 14 01:04:59 2014
@@ -104,10 +104,13 @@ import org.apache.hadoop.hbase.filter.Fi
 import org.apache.hadoop.hbase.filter.FilterBase;
 import org.apache.hadoop.hbase.filter.IncompatibleFilterException;
 import org.apache.hadoop.hbase.filter.WritableByteArrayComparable;
+import org.apache.hadoop.hbase.io.HFileLink;
 import org.apache.hadoop.hbase.io.HeapSize;
+import org.apache.hadoop.hbase.io.Reference;
 import org.apache.hadoop.hbase.io.TimeRange;
 import org.apache.hadoop.hbase.io.hfile.BlockCache;
 import org.apache.hadoop.hbase.io.hfile.CacheConfig;
+import org.apache.hadoop.hbase.io.hfile.HFile;
 import org.apache.hadoop.hbase.ipc.CoprocessorProtocol;
 import org.apache.hadoop.hbase.ipc.HBaseRPC;
 import org.apache.hadoop.hbase.ipc.HBaseServer;
@@ -736,15 +739,30 @@ public class HRegion implements HeapSize
    * @param tableDescriptor HTableDescriptor of the table
    * @param regionEncodedName encoded name of the region
    * @return The HDFS blocks distribution for the given region.
- * @throws IOException
+   * @throws IOException
    */
   static public HDFSBlocksDistribution computeHDFSBlocksDistribution(
     Configuration conf, HTableDescriptor tableDescriptor,
     String regionEncodedName) throws IOException {
-    HDFSBlocksDistribution hdfsBlocksDistribution =
-      new HDFSBlocksDistribution();
     Path tablePath = FSUtils.getTablePath(FSUtils.getRootDir(conf),
       tableDescriptor.getName());
+    return computeHDFSBlocksDistribution(conf, tableDescriptor, regionEncodedName, tablePath);
+  }
+
+  /**
+   * This is a helper function to compute HDFS block distribution on demand
+   * @param conf configuration
+   * @param tableDescriptor HTableDescriptor of the table
+   * @param regionEncodedName encoded name of the region
+   * @param tablePath The table's directory
+   * @return The HDFS blocks distribution for the given region.
+   * @throws IOException
+   */
+  static public HDFSBlocksDistribution computeHDFSBlocksDistribution(
+    Configuration conf, HTableDescriptor tableDescriptor,
+    String regionEncodedName, Path tablePath) throws IOException {
+    HDFSBlocksDistribution hdfsBlocksDistribution =
+      new HDFSBlocksDistribution();
     FileSystem fs = tablePath.getFileSystem(conf);
 
     for (HColumnDescriptor family: tableDescriptor.getFamilies()) {
@@ -756,6 +774,17 @@ public class HRegion implements HeapSize
       hfilesStatus = fs.listStatus(storeHomeDir);
 
       for (FileStatus hfileStatus : hfilesStatus) {
+        Path p = hfileStatus.getPath();
+        if (HFileLink.isHFileLink(p)) {
+          hfileStatus = new HFileLink(conf, p).getFileStatus(fs);
+        } else if (StoreFile.isReference(p)) {
+          p = StoreFile.getReferredToFile(p);
+          if (HFileLink.isHFileLink(p)) {
+            hfileStatus = new HFileLink(conf, p).getFileStatus(fs);
+          } else {
+            hfileStatus = fs.getFileStatus(p);
+          }
+        }
         HDFSBlocksDistribution storeFileBlocksDistribution =
           FSUtils.computeHDFSBlocksDistribution(fs, hfileStatus, 0,
           hfileStatus.getLen());