HDFS-16642. Moving the selecting inputstream from journalnode in EditLogTailer outof FSNLock (#4497)
This commit is contained in:
parent
66dec9d322
commit
8eebf40b1a
@ -328,34 +328,37 @@ public Void run() throws Exception {
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public long doTailEdits() throws IOException, InterruptedException {
|
public long doTailEdits() throws IOException, InterruptedException {
|
||||||
|
Collection<EditLogInputStream> streams;
|
||||||
|
FSImage image = namesystem.getFSImage();
|
||||||
|
|
||||||
|
long lastTxnId = image.getLastAppliedTxId();
|
||||||
|
LOG.debug("lastTxnId: {}", lastTxnId);
|
||||||
|
long startTime = timer.monotonicNow();
|
||||||
|
try {
|
||||||
|
streams = editLog.selectInputStreams(lastTxnId + 1, 0,
|
||||||
|
null, inProgressOk, true);
|
||||||
|
} catch (IOException ioe) {
|
||||||
|
// This is acceptable. If we try to tail edits in the middle of an edits
|
||||||
|
// log roll, i.e. the last one has been finalized but the new inprogress
|
||||||
|
// edits file hasn't been started yet.
|
||||||
|
LOG.warn("Edits tailer failed to find any streams. Will try again " +
|
||||||
|
"later.", ioe);
|
||||||
|
return 0;
|
||||||
|
} finally {
|
||||||
|
NameNode.getNameNodeMetrics().addEditLogFetchTime(
|
||||||
|
timer.monotonicNow() - startTime);
|
||||||
|
}
|
||||||
// Write lock needs to be interruptible here because the
|
// Write lock needs to be interruptible here because the
|
||||||
// transitionToActive RPC takes the write lock before calling
|
// transitionToActive RPC takes the write lock before calling
|
||||||
// tailer.stop() -- so if we're not interruptible, it will
|
// tailer.stop() -- so if we're not interruptible, it will
|
||||||
// deadlock.
|
// deadlock.
|
||||||
namesystem.writeLockInterruptibly();
|
namesystem.writeLockInterruptibly();
|
||||||
try {
|
try {
|
||||||
FSImage image = namesystem.getFSImage();
|
long currentLastTxnId = image.getLastAppliedTxId();
|
||||||
|
if (lastTxnId != currentLastTxnId) {
|
||||||
long lastTxnId = image.getLastAppliedTxId();
|
LOG.warn("The currentLastTxnId({}) is different from preLastTxtId({})",
|
||||||
|
currentLastTxnId, lastTxnId);
|
||||||
if (LOG.isDebugEnabled()) {
|
|
||||||
LOG.debug("lastTxnId: " + lastTxnId);
|
|
||||||
}
|
|
||||||
Collection<EditLogInputStream> streams;
|
|
||||||
long startTime = timer.monotonicNow();
|
|
||||||
try {
|
|
||||||
streams = editLog.selectInputStreams(lastTxnId + 1, 0,
|
|
||||||
null, inProgressOk, true);
|
|
||||||
} catch (IOException ioe) {
|
|
||||||
// This is acceptable. If we try to tail edits in the middle of an edits
|
|
||||||
// log roll, i.e. the last one has been finalized but the new inprogress
|
|
||||||
// edits file hasn't been started yet.
|
|
||||||
LOG.warn("Edits tailer failed to find any streams. Will try again " +
|
|
||||||
"later.", ioe);
|
|
||||||
return 0;
|
return 0;
|
||||||
} finally {
|
|
||||||
NameNode.getNameNodeMetrics().addEditLogFetchTime(
|
|
||||||
timer.monotonicNow() - startTime);
|
|
||||||
}
|
}
|
||||||
if (LOG.isDebugEnabled()) {
|
if (LOG.isDebugEnabled()) {
|
||||||
LOG.debug("edit streams to load from: " + streams.size());
|
LOG.debug("edit streams to load from: " + streams.size());
|
||||||
|
Loading…
Reference in New Issue
Block a user