diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index 287ffcbbc63..eaaea5d8dbd 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -27,6 +27,9 @@ Release 2.6.1 - UNRELEASED HDFS-8046. Allow better control of getContentSummary (kihwal) + HDFS-8384. Allow NN to startup if there are files having a lease but are not + under construction. (jing9) + OPTIMIZATIONS HDFS-8480. Fix performance and timeout issues in HDFS-7929 by using diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java index 19edbb54ac1..362b14743f7 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java @@ -4693,7 +4693,10 @@ public class FSNamesystem implements Namesystem, FSClusterStats, assert hasWriteLock(); FileUnderConstructionFeature uc = pendingFile.getFileUnderConstructionFeature(); - Preconditions.checkArgument(uc != null); + if (uc == null) { + throw new IOException("Cannot finalize file " + src + + " because it is not under construction"); + } leaseManager.removeLease(uc.getClientName(), src); pendingFile.recordModification(latestSnapshot); diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/LeaseManager.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/LeaseManager.java index e13a5c67e9e..55ce0bb8ff6 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/LeaseManager.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/LeaseManager.java @@ -116,7 +116,11 @@ public class LeaseManager { final INodeFile cons; try { cons = this.fsnamesystem.getFSDirectory().getINode(path).asFile(); - Preconditions.checkState(cons.isUnderConstruction()); + if (!cons.isUnderConstruction()) { + LOG.warn("The file " + cons.getFullPathName() + + " is not under construction but has lease."); + continue; + } } catch (UnresolvedLinkException e) { throw new AssertionError("Lease files should reside on this FS"); } @@ -444,8 +448,12 @@ public class LeaseManager { // verify that path exists in namespace try { INodeFile node = INodeFile.valueOf(fsnamesystem.dir.getINode(p), p); - Preconditions.checkState(node.isUnderConstruction()); - inodes.put(p, node); + if (node.isUnderConstruction()) { + inodes.put(p, node); + } else { + LOG.warn("Ignore the lease of file " + p + + " for checkpoint since the file is not under construction"); + } } catch (IOException ioe) { LOG.error(ioe); }