Index: src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java (revision 1441225) +++ src/main/java/org/apache/hadoop/hbase/regionserver/wal/HLog.java (working copy) @@ -1008,6 +1008,7 @@ } if (this.writer != null) { this.writer.close(); + this.writer = null; } } } finally { @@ -1303,33 +1304,41 @@ // issue the sync to HDFS. If sync is successful, then update // syncedTillHere to indicate that transactions till this // number has been successfully synced. + IOException ioe = null; + List pending = null; synchronized (flushLock) { if (txid <= this.syncedTillHere) { return; } doneUpto = this.unflushedEntries.get(); - List pending = logSyncerThread.getPendingWrites(); + pending = logSyncerThread.getPendingWrites(); try { logSyncerThread.hlogFlush(tempWriter, pending); } catch(IOException io) { - synchronized (this.updateLock) { + ioe = io; + LOG.error("syncer encountered error, will retry. txid=" + txid, ioe); + } + } + if (ioe != null && pending != null) { + synchronized (this.updateLock) { + synchronized (flushLock) { // HBASE-4387, HBASE-5623, retry with updateLock held tempWriter = this.writer; logSyncerThread.hlogFlush(tempWriter, pending); } - } + } } // another thread might have sync'ed avoid double-sync'ing if (txid <= this.syncedTillHere) { return; } try { - tempWriter.sync(); - } catch(IOException io) { + if (tempWriter != null) tempWriter.sync(); + } catch (IOException io) { synchronized (this.updateLock) { // HBASE-4387, HBASE-5623, retry with updateLock held tempWriter = this.writer; - tempWriter.sync(); + if (tempWriter != null) tempWriter.sync(); } } this.syncedTillHere = Math.max(this.syncedTillHere, doneUpto);