HBASE-7728 deadlock occurs between hlog roller and hlog syncer (Ted Yu)
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1441631 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
997c8f8d6b
commit
003a05896e
|
@ -827,6 +827,7 @@ class FSHLog implements HLog, Syncable {
|
||||||
}
|
}
|
||||||
if (this.writer != null) {
|
if (this.writer != null) {
|
||||||
this.writer.close();
|
this.writer.close();
|
||||||
|
this.writer = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1081,35 +1082,43 @@ class FSHLog implements HLog, Syncable {
|
||||||
// issue the sync to HDFS. If sync is successful, then update
|
// issue the sync to HDFS. If sync is successful, then update
|
||||||
// syncedTillHere to indicate that transactions till this
|
// syncedTillHere to indicate that transactions till this
|
||||||
// number has been successfully synced.
|
// number has been successfully synced.
|
||||||
|
IOException ioe = null;
|
||||||
|
List<Entry> pending = null;
|
||||||
synchronized (flushLock) {
|
synchronized (flushLock) {
|
||||||
if (txid <= this.syncedTillHere) {
|
if (txid <= this.syncedTillHere) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
doneUpto = this.unflushedEntries.get();
|
doneUpto = this.unflushedEntries.get();
|
||||||
List<Entry> pending = logSyncerThread.getPendingWrites();
|
pending = logSyncerThread.getPendingWrites();
|
||||||
try {
|
try {
|
||||||
logSyncerThread.hlogFlush(tempWriter, pending);
|
logSyncerThread.hlogFlush(tempWriter, pending);
|
||||||
} catch(IOException io) {
|
} 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
|
// HBASE-4387, HBASE-5623, retry with updateLock held
|
||||||
tempWriter = this.writer;
|
tempWriter = this.writer;
|
||||||
logSyncerThread.hlogFlush(tempWriter, pending);
|
logSyncerThread.hlogFlush(tempWriter, pending);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// another thread might have sync'ed avoid double-sync'ing
|
// another thread might have sync'ed avoid double-sync'ing
|
||||||
if (txid <= this.syncedTillHere) {
|
if (txid <= this.syncedTillHere) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
tempWriter.sync();
|
if (tempWriter != null) tempWriter.sync();
|
||||||
} catch(IOException ex) {
|
} catch(IOException ex) {
|
||||||
synchronized (this.updateLock) {
|
synchronized (this.updateLock) {
|
||||||
// HBASE-4387, HBASE-5623, retry with updateLock held
|
// HBASE-4387, HBASE-5623, retry with updateLock held
|
||||||
// TODO: we don't actually need to do it for concurrent close - what is the point
|
// TODO: we don't actually need to do it for concurrent close - what is the point
|
||||||
// of syncing new unrelated writer? Keep behavior for now.
|
// of syncing new unrelated writer? Keep behavior for now.
|
||||||
tempWriter = this.writer;
|
tempWriter = this.writer;
|
||||||
tempWriter.sync();
|
if (tempWriter != null) tempWriter.sync();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
this.syncedTillHere = Math.max(this.syncedTillHere, doneUpto);
|
this.syncedTillHere = Math.max(this.syncedTillHere, doneUpto);
|
||||||
|
|
Loading…
Reference in New Issue