HBASE-8485 Retry to open a HLog on more exceptions
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1478880 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
6784e894e2
commit
3ca2bd7339
|
@ -34,7 +34,6 @@ import org.apache.hadoop.fs.Path;
|
||||||
import org.apache.hadoop.hbase.HConstants;
|
import org.apache.hadoop.hbase.HConstants;
|
||||||
import org.apache.hadoop.hbase.regionserver.wal.HLog.Reader;
|
import org.apache.hadoop.hbase.regionserver.wal.HLog.Reader;
|
||||||
import org.apache.hadoop.hbase.regionserver.wal.HLog.Writer;
|
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.CancelableProgressable;
|
||||||
import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
|
import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;
|
||||||
|
|
||||||
|
@ -129,7 +128,9 @@ public class HLogFactory {
|
||||||
}
|
}
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
String msg = e.getMessage();
|
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) {
|
if (++nbAttempt == 1) {
|
||||||
LOG.warn("Lease should have recovered. This is not expected. Will retry", e);
|
LOG.warn("Lease should have recovered. This is not expected. Will retry", e);
|
||||||
}
|
}
|
||||||
|
|
|
@ -889,7 +889,8 @@ public class TestHLogSplit {
|
||||||
fs.initialize(fs.getUri(), conf);
|
fs.initialize(fs.getUri(), conf);
|
||||||
|
|
||||||
FileSystem spiedFs = Mockito.spy(fs);
|
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
|
// that's how it comes out of HDFS. If HDFS changes the exception
|
||||||
// message, this test needs to be adjusted accordingly.
|
// 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
|
// last block is under recovery, HDFS may have problem to obtain
|
||||||
// the block length, in which case, retry may help.
|
// the block length, in which case, retry may help.
|
||||||
Mockito.doAnswer(new Answer<FSDataInputStream>() {
|
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;
|
private int count = 0;
|
||||||
|
|
||||||
public FSDataInputStream answer(InvocationOnMock invocation) throws Throwable {
|
public FSDataInputStream answer(InvocationOnMock invocation) throws Throwable {
|
||||||
if (count++ < 3) {
|
if (count < 3) {
|
||||||
throw new IOException("Cannot obtain block length");
|
throw new IOException(errors[count++]);
|
||||||
}
|
}
|
||||||
return (FSDataInputStream)invocation.callRealMethod();
|
return (FSDataInputStream)invocation.callRealMethod();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue