You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2011/02/04 23:56:20 UTC

svn commit: r1067323 - in /hbase/trunk: CHANGES.txt src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java

Author: stack
Date: Fri Feb  4 22:56:20 2011
New Revision: 1067323

URL: http://svn.apache.org/viewvc?rev=1067323&view=rev
Log:
HBASE-3502 Can't open region because can't open .regioninfo because AlreadyBeingCreatedException

Modified:
    hbase/trunk/CHANGES.txt
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java

Modified: hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1067323&r1=1067322&r2=1067323&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Fri Feb  4 22:56:20 2011
@@ -42,6 +42,8 @@ Release 0.91.0 - Unreleased
    HBASE-3495  Shell is failing on subsequent split calls
    HBASE-3400  Coprocessor Support for Generic Interfaces
                (Ed Kohlwey via Gary Helmling)
+   HBASE-3502  Can't open region because can't open .regioninfo because
+               AlreadyBeingCreatedException
 
 
   IMPROVEMENTS

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1067323&r1=1067322&r2=1067323&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Fri Feb  4 22:56:20 2011
@@ -424,16 +424,17 @@ public class HRegion implements HeapSize
    * @throws IOException
    */
   private void checkRegioninfoOnFilesystem() 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
-    //
-    Path regioninfo = new Path(this.regiondir, REGIONINFO_FILE);
-    if (this.fs.exists(regioninfo) &&
-        this.fs.getFileStatus(regioninfo).getLen() > 0) {
+    Path regioninfoPath = new Path(this.regiondir, REGIONINFO_FILE);
+    if (this.fs.exists(regioninfoPath) &&
+        this.fs.getFileStatus(regioninfoPath).getLen() > 0) {
       return;
     }
-    FSDataOutputStream out = this.fs.create(regioninfo, true);
+    // Create in tmpdir and then move into place in case we crash after
+    // create but before close.  If we don't successfully close the file,
+    // subsequent region reopens will fail the below because create is
+    // registered in NN.
+    Path tmpPath = new Path(getTmpDir(), REGIONINFO_FILE);
+    FSDataOutputStream out = this.fs.create(tmpPath, true);
     try {
       this.regionInfo.write(out);
       out.write('\n');
@@ -442,6 +443,10 @@ public class HRegion implements HeapSize
     } finally {
       out.close();
     }
+    if (!fs.rename(tmpPath, regioninfoPath)) {
+      throw new IOException("Unable to rename " + tmpPath + " to " +
+        regioninfoPath);
+    }
   }
 
   /** @return a HRegionInfo object for this region */