You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ec...@apache.org on 2014/08/01 00:08:16 UTC

[40/50] [abbrv] git commit: [HBASE-11379] fixed exception-handling in the writing of .regioninfo files

[HBASE-11379] fixed exception-handling in the writing of .regioninfo files

Summary: error exceptions when writing .regioninfo files were not being handled properly

Test Plan: n/a

Reviewers: elliott, daviddeng

Reviewed By: daviddeng

Subscribers: elliott, hbase-eng@

Differential Revision: https://phabricator.fb.com/D1418950

git-svn-id: svn+ssh://tubbs/svnhive/hadoop/branches/titan/VENDOR.hbase/hbase-trunk@43315 e7acf4d4-3532-417f-9e73-7a9ae25a1f51


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/451e39bf
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/451e39bf
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/451e39bf

Branch: refs/heads/0.89-fb
Commit: 451e39bf9c8c6820054ddb9c9be7830be5b9847b
Parents: 797de59
Author: yuq <yu...@e7acf4d4-3532-417f-9e73-7a9ae25a1f51>
Authored: Fri Jul 4 00:39:41 2014 +0000
Committer: Elliott Clark <el...@fb.com>
Committed: Thu Jul 31 14:44:24 2014 -0700

----------------------------------------------------------------------
 .../org/apache/hadoop/hbase/HRegionInfo.java    | 41 ++++++++++----------
 .../org/apache/hadoop/hbase/master/HMaster.java | 32 +++++++--------
 .../hadoop/hbase/regionserver/HRegion.java      |  4 +-
 .../client/TestHBaseFsckFixRegionInfo.java      |  4 --
 4 files changed, 36 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/451e39bf/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java b/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java
index 63701cb..54832ac 100644
--- a/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java
+++ b/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java
@@ -708,13 +708,12 @@ public class HRegionInfo extends VersionedWritable implements WritableComparable
    * This method writes the .regioninfo file. This method is synchronized so that no two threads
    * attempt to write the same .regioninfo file at the same time.
    * @param conf
-   * @return true if the write was successful
    * @throws IOException
    */
-  public synchronized boolean writeToDisk(Configuration conf) throws IOException {
+  public synchronized void writeToDisk(Configuration conf) throws IOException {
     Path rootDir = new Path(conf.get(HConstants.HBASE_DIR));
     FileSystem fs = rootDir.getFileSystem(conf);
-    return writeToDisk(conf, fs);
+    writeToDisk(conf, fs);
   }
 
   /**
@@ -722,34 +721,34 @@ public class HRegionInfo extends VersionedWritable implements WritableComparable
    * attempt to write the same .regioninfo file at the same time.
    * @param conf
    * @param fs
-   * @return true if the write is successful
    * @throws IOException
    */
-  public synchronized boolean writeToDisk(Configuration conf, FileSystem fs) throws IOException {
+  public synchronized void writeToDisk(Configuration conf, FileSystem fs) throws IOException {
     Path tableDir =
         HTableDescriptor.getTableDir(FSUtils.getRootDir(conf), this.getTableDesc().getName());
     Path regionPath = HRegion.getRegionDir(tableDir, this.getEncodedName());
     Path regionInfoPath = new Path(regionPath, HRegion.REGIONINFO_FILE);
-    FSDataOutputStream out = fs.create(regionInfoPath, true);
-    boolean successfulWrite = true;
     try {
-      // we write to file the information necessary to reconstruct this HRegionInfo via readFields()
-      // this.toString() calls tableDesc.toString(), so this file will contain back-up information
-      // for the table
-      write(out);
-      out.write(NEWLINE);
-      out.write(NEWLINE);
-      out.write(Bytes.toBytes(this.toString()));
-      LOG.debug("Rewrote .regioninfo file of " + this.getRegionNameAsString() + " at "
-          + regionInfoPath);
+      FSDataOutputStream out = fs.create(regionInfoPath);
+      try {
+        // we write to file the information necessary to reconstruct this HRegionInfo via
+        // readFields()
+        // this.toString() calls tableDesc.toString(), so this file will contain back-up information
+        // for the table
+        write(out);
+        out.write(NEWLINE);
+        out.write(NEWLINE);
+        out.write(Bytes.toBytes(this.toString()));
+        LOG.debug("Rewrote .regioninfo file of " + this.getRegionNameAsString() + " at "
+            + regionInfoPath);
+      } finally {
+        out.close();
+        LOG.debug(".regioninfo File Contents: " + this.toString());
+      }
     } catch (IOException e) {
-      successfulWrite = false;
       LOG.error("Could not rewrite the .regioninfo of " + this.getRegionNameAsString() + " at "
           + regionInfoPath, e);
-    } finally {
-      out.close();
-      LOG.debug(".regioninfo File Contents: " + this.toString());
+      throw e;
     }
-    return successfulWrite;
   }
 }

http://git-wip-us.apache.org/repos/asf/hbase/blob/451e39bf/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
index 9b51280..959a070 100755
--- a/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
+++ b/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
@@ -42,6 +42,7 @@ import java.util.Set;
 import java.util.SortedMap;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
@@ -112,6 +113,7 @@ import org.apache.hadoop.hbase.regionserver.HRegionServer;
 import org.apache.hadoop.hbase.regionserver.wal.HLog;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
+import org.apache.hadoop.hbase.util.ExceptionUtils;
 import org.apache.hadoop.hbase.util.FSUtils;
 import org.apache.hadoop.hbase.util.HasThread;
 import org.apache.hadoop.hbase.util.InfoServer;
@@ -1670,38 +1672,32 @@ HMasterRegionInterface, Watcher, StoppableMaster {
    * This method rewrites all .regioninfo files for all regions belonging to the Table whose name is
    * tableName
    * @param tableName
-   * @return true if all .regioninfo files that belong to the table are successfully rewritten.
    * @throws IOException
    * @throws ExecutionException
    * @throws InterruptedException
    */
-  public boolean writeRegionInfo(byte[] tableName) throws Exception {
+  public void writeRegionInfo(byte[] tableName) throws IOException, InterruptedException{
     List<Pair<HRegionInfo, HServerAddress>> tableRegions = getTableRegions(tableName);
     ExecutorService executor = Executors.newCachedThreadPool();
-    List<Future<Boolean>> futures = new ArrayList<>();
+    List<Future<Void>> futures = new ArrayList<>();
     for (final Pair<HRegionInfo, HServerAddress> entry : tableRegions) {
-      Callable<Boolean> writer = new Callable<Boolean>() {
+      Callable<Void> writer = new Callable<Void>() {
         
-        // return true if the write is successful
-        public Boolean call() {
+        public Void call() throws IOException {
           HRegionInfo hri = entry.getFirst();
-          try {
-            return hri.writeToDisk(conf);
-          } catch (IOException e) {
-            LOG.error("Failed to write .regioninfo for Region: " + hri.getRegionNameAsString(), e);
-            return false;
-          }
+            hri.writeToDisk(conf);
+          return null;
         }
       };
-      Future<Boolean> future = executor.submit(writer);
-      futures.add(future);
+      futures.add(executor.submit(writer));
     }
-    for (Future<Boolean> f : futures) {
-      if (!f.get()) { // if any write was not successful
-        return false;
+    for (Future<Void> f : futures) {
+      try {
+        f.get();
+      } catch (ExecutionException e) {
+        throw ExceptionUtils.toIOException(e.getCause());
       }
     }
-    return true;
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/hbase/blob/451e39bf/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
index de8ba0b..4f7b42c 100644
--- a/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
+++ b/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
@@ -617,7 +617,7 @@ public class HRegion implements HeapSize, ConfigurationObserver, HRegionIf {
     try {
       // Write HRI to a file in case we need to recover .META.
       status.setStatus("Writing region info on filesystem");
-      checkRegioninfoOnFilesystem();
+      writeRegioninfoOnFilesystem();
 
       // Remove temporary data left over from old regions
       status.setStatus("Cleaning up temporary data from old regions");
@@ -756,7 +756,7 @@ public class HRegion implements HeapSize, ConfigurationObserver, HRegionIf {
    * mangled regions.
    * @throws IOException
    */
-  private void checkRegioninfoOnFilesystem() throws IOException {
+  private void writeRegioninfoOnFilesystem() throws IOException {
     // Name of this file has two leading and trailing underscores so it doesn't
     // clash w/ a store/family name.  There is possibility, but assumption is
     // that its slim (don't want to use control character in filename because

http://git-wip-us.apache.org/repos/asf/hbase/blob/451e39bf/src/test/java/org/apache/hadoop/hbase/client/TestHBaseFsckFixRegionInfo.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/hadoop/hbase/client/TestHBaseFsckFixRegionInfo.java b/src/test/java/org/apache/hadoop/hbase/client/TestHBaseFsckFixRegionInfo.java
index 1bbdd34..ee9098f 100644
--- a/src/test/java/org/apache/hadoop/hbase/client/TestHBaseFsckFixRegionInfo.java
+++ b/src/test/java/org/apache/hadoop/hbase/client/TestHBaseFsckFixRegionInfo.java
@@ -123,10 +123,6 @@ public class TestHBaseFsckFixRegionInfo {
 
         // rewrite the original .regioninfo
         hriModified.writeToDisk(conf);
-        System.out.println("SUCCESSFULLY CORRUPTED:"
-            + !hriOriginal.toString().equals(hriModified.toString()));
-        System.out.println("Original " + hriOriginal.toString());
-        System.out.println("Modified: " + hriModified.toString());
         modifyCount++;
       }
     }