HDFS-16642. Moving the selecting inputstream from journalnode in EditLogTailer outof FSNLock (#4497)
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/EditLogTailer.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/EditLogTailer.java
index 25596dc..f5b4da8 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/EditLogTailer.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/ha/EditLogTailer.java
@@ -328,34 +328,37 @@
@VisibleForTesting
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
// transitionToActive RPC takes the write lock before calling
// tailer.stop() -- so if we're not interruptible, it will
// deadlock.
namesystem.writeLockInterruptibly();
try {
- FSImage image = namesystem.getFSImage();
-
- long lastTxnId = image.getLastAppliedTxId();
-
- 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);
+ long currentLastTxnId = image.getLastAppliedTxId();
+ if (lastTxnId != currentLastTxnId) {
+ LOG.warn("The currentLastTxnId({}) is different from preLastTxtId({})",
+ currentLastTxnId, lastTxnId);
return 0;
- } finally {
- NameNode.getNameNodeMetrics().addEditLogFetchTime(
- timer.monotonicNow() - startTime);
}
if (LOG.isDebugEnabled()) {
LOG.debug("edit streams to load from: " + streams.size());