You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jx...@apache.org on 2013/05/03 19:21:36 UTC

svn commit: r1478881 - in /hbase/branches/0.95/hbase-server/src: main/java/org/apache/hadoop/hbase/regionserver/wal/HLogFactory.java test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java

Author: jxiang
Date: Fri May  3 17:21:36 2013
New Revision: 1478881

URL: http://svn.apache.org/r1478881
Log:
HBASE-8485 Retry to open a HLog on more exceptions

Modified:
    hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogFactory.java
    hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java

Modified: hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogFactory.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogFactory.java?rev=1478881&r1=1478880&r2=1478881&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogFactory.java (original)
+++ hbase/branches/0.95/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLogFactory.java Fri May  3 17:21:36 2013
@@ -34,7 +34,6 @@ import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.regionserver.wal.HLog.Reader;
 import org.apache.hadoop.hbase.regionserver.wal.HLog.Writer;
-import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.CancelableProgressable;
 import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
 
@@ -129,7 +128,9 @@ public class HLogFactory {
             }
           } catch (IOException e) {
             String msg = e.getMessage();
-            if (msg != null && msg.contains("Cannot obtain block length")) {
+            if (msg != null && (msg.contains("Cannot obtain block length")
+                || msg.contains("Could not obtain the last block")
+                || msg.matches("Blocklist for [^ ]* has changed.*"))) {
               if (++nbAttempt == 1) {
                 LOG.warn("Lease should have recovered. This is not expected. Will retry", e);
               }

Modified: hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java?rev=1478881&r1=1478880&r2=1478881&view=diff
==============================================================================
--- hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java (original)
+++ hbase/branches/0.95/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/wal/TestHLogSplit.java Fri May  3 17:21:36 2013
@@ -889,7 +889,8 @@ public class TestHLogSplit {
     fs.initialize(fs.getUri(), conf);
 
     FileSystem spiedFs = Mockito.spy(fs);
-    // The "Cannot obtain block length" part is very important,
+    // The "Cannot obtain block length", "Could not obtain the last block",
+    // and "Blocklist for [^ ]* has changed.*" part is very important,
     // that's how it comes out of HDFS. If HDFS changes the exception
     // message, this test needs to be adjusted accordingly.
     //
@@ -898,11 +899,14 @@ public class TestHLogSplit {
     // last block is under recovery, HDFS may have problem to obtain
     // the block length, in which case, retry may help.
     Mockito.doAnswer(new Answer<FSDataInputStream>() {
+      private final String[] errors = new String[] {
+        "Cannot obtain block length", "Could not obtain the last block",
+        "Blocklist for " + OLDLOGDIR + " has changed"};
       private int count = 0;
 
       public FSDataInputStream answer(InvocationOnMock invocation) throws Throwable {
-            if (count++ < 3) {
-                throw new IOException("Cannot obtain block length");
+            if (count < 3) {
+                throw new IOException(errors[count++]);
             }
             return (FSDataInputStream)invocation.callRealMethod();
         }