HBASE-16062 Improper error handling in WAL Reader/Writer creation (Vladimir Rodionov)
This commit is contained in:
parent
8dea578bcf
commit
6ba67ab8d6
@ -372,12 +372,20 @@ public class DefaultWALProvider implements WALProvider {
|
||||
// Configuration already does caching for the Class lookup.
|
||||
Class<? extends Writer> logWriterClass = conf.getClass("hbase.regionserver.hlog.writer.impl",
|
||||
ProtobufLogWriter.class, Writer.class);
|
||||
Writer writer = null;
|
||||
try {
|
||||
Writer writer = logWriterClass.newInstance();
|
||||
writer = logWriterClass.newInstance();
|
||||
writer.init(fs, path, conf, overwritable);
|
||||
return writer;
|
||||
} catch (Exception e) {
|
||||
LOG.debug("Error instantiating log writer.", e);
|
||||
if (writer != null) {
|
||||
try{
|
||||
writer.close();
|
||||
} catch(IOException ee){
|
||||
LOG.error("cannot close log writer", ee);
|
||||
}
|
||||
}
|
||||
throw new IOException("cannot get log writer", e);
|
||||
}
|
||||
}
|
||||
|
@ -290,11 +290,12 @@ public class WALFactory {
|
||||
long openTimeout = timeoutMillis + startWaiting;
|
||||
int nbAttempt = 0;
|
||||
FSDataInputStream stream = null;
|
||||
DefaultWALProvider.Reader reader = null;
|
||||
while (true) {
|
||||
try {
|
||||
if (lrClass != ProtobufLogReader.class) {
|
||||
// User is overriding the WAL reader, let them.
|
||||
DefaultWALProvider.Reader reader = lrClass.newInstance();
|
||||
reader = lrClass.newInstance();
|
||||
reader.init(fs, path, conf, null);
|
||||
return reader;
|
||||
} else {
|
||||
@ -306,19 +307,27 @@ public class WALFactory {
|
||||
byte[] magic = new byte[ProtobufLogReader.PB_WAL_MAGIC.length];
|
||||
boolean isPbWal = (stream.read(magic) == magic.length)
|
||||
&& Arrays.equals(magic, ProtobufLogReader.PB_WAL_MAGIC);
|
||||
DefaultWALProvider.Reader reader =
|
||||
reader =
|
||||
isPbWal ? new ProtobufLogReader() : new SequenceFileLogReader();
|
||||
reader.init(fs, path, conf, stream);
|
||||
return reader;
|
||||
}
|
||||
} catch (IOException e) {
|
||||
try {
|
||||
if (stream != null) {
|
||||
if (stream != null) {
|
||||
try {
|
||||
stream.close();
|
||||
} catch (IOException exception) {
|
||||
LOG.warn("Could not close DefaultWALProvider.Reader" + exception.getMessage());
|
||||
LOG.debug("exception details", exception);
|
||||
}
|
||||
}
|
||||
if (reader != null) {
|
||||
try {
|
||||
reader.close();
|
||||
} catch (IOException exception) {
|
||||
LOG.warn("Could not close FSDataInputStream" + exception.getMessage());
|
||||
LOG.debug("exception details", exception);
|
||||
}
|
||||
} catch (IOException exception) {
|
||||
LOG.warn("Could not close FSDataInputStream" + exception.getMessage());
|
||||
LOG.debug("exception details", exception);
|
||||
}
|
||||
String msg = e.getMessage();
|
||||
if (msg != null && (msg.contains("Cannot obtain block length")
|
||||
@ -332,8 +341,7 @@ public class WALFactory {
|
||||
}
|
||||
if (nbAttempt > 2 && openTimeout < EnvironmentEdgeManager.currentTime()) {
|
||||
LOG.error("Can't open after " + nbAttempt + " attempts and "
|
||||
+ (EnvironmentEdgeManager.currentTime() - startWaiting)
|
||||
+ "ms " + " for " + path);
|
||||
+ (EnvironmentEdgeManager.currentTime() - startWaiting) + "ms " + " for " + path);
|
||||
} else {
|
||||
try {
|
||||
Thread.sleep(nbAttempt < 3 ? 500 : 1000);
|
||||
|
Loading…
x
Reference in New Issue
Block a user