diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/DefaultWALProvider.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/DefaultWALProvider.java index d4299c96ffb..b618a0f7a24 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/DefaultWALProvider.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/DefaultWALProvider.java @@ -372,12 +372,20 @@ public class DefaultWALProvider implements WALProvider { // Configuration already does caching for the Class lookup. Class 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); } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALFactory.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALFactory.java index 8ef3cab0ac3..cf704ba8062 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALFactory.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/wal/WALFactory.java @@ -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);