HDFS-16642. Moving the selecting inputstream from journalnode in EditLogTailer outof FSNLock (#4497)

This commit is contained in:
xuzq 2022-08-04 11:04:28 +08:00 committed by GitHub
parent 66dec9d322
commit 8eebf40b1a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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());