From 1107bd399c790467b22e55291c2611fd1c16e156 Mon Sep 17 00:00:00 2001 From: Yongjun Zhang Date: Wed, 7 Oct 2015 23:20:10 -0700 Subject: [PATCH] HDFS-8164. cTime is 0 in VERSION file for newly formatted NameNode. Contributed by Xiao Chen. --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../hdfs/server/namenode/FSNamesystem.java | 12 +++++++++ .../hdfs/server/namenode/NNStorage.java | 2 +- .../hdfs/server/namenode/TestFSImage.java | 26 ++++++++++++++++++- 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index e05a61847c4..1116f800fb2 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -1491,6 +1491,9 @@ Release 2.8.0 - UNRELEASED HDFS-9170. Move libhdfs / fuse-dfs / libwebhdfs to hdfs-client. (wheat9) + HDFS-8164. cTime is 0 in VERSION file for newly formatted NameNode. + (Xiao Chen via Yongjun Zhang) + OPTIMIZATIONS HDFS-8026. Trace FSOutputSummer#writeChecksumChunks rather than 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 a94b61ce8b5..a5b6c777cee 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 @@ -1520,6 +1520,18 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean, } } + /** + * Get the creation time of the file system. + * Notice that this time is initialized to NameNode format time, and updated + * to upgrade time during upgrades. + * @return time in milliseconds. + * See {@link org.apache.hadoop.util.Time#now()}. + */ + @VisibleForTesting + long getCTime() { + return fsImage == null ? 0 : fsImage.getStorage().getCTime(); + } + /** * Version of @see #getNamespaceInfo() that is not protected by a lock. */ diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorage.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorage.java index 14647f020e5..d872c039590 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorage.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/NNStorage.java @@ -573,7 +573,7 @@ public class NNStorage extends Storage implements Closeable, public static NamespaceInfo newNamespaceInfo() throws UnknownHostException { return new NamespaceInfo(newNamespaceID(), newClusterID(), - newBlockPoolID(), 0L); + newBlockPoolID(), Time.now()); } public void format() throws IOException { diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSImage.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSImage.java index e45d08d6c58..0c7398c16d5 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSImage.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestFSImage.java @@ -62,6 +62,7 @@ import org.apache.hadoop.hdfs.server.namenode.NNStorage.NameNodeDirType; import org.apache.hadoop.hdfs.util.MD5FileUtils; import org.apache.hadoop.test.GenericTestUtils; import org.apache.hadoop.test.PathUtils; +import org.apache.hadoop.util.Time; import org.junit.Test; import static org.junit.Assert.assertArrayEquals; @@ -368,7 +369,30 @@ public class TestFSImage { } } } - + + /** + * Ensure ctime is set during namenode formatting. + */ + @Test(timeout=60000) + public void testCtime() throws Exception { + Configuration conf = new Configuration(); + MiniDFSCluster cluster = null; + try { + final long pre = Time.now(); + cluster = new MiniDFSCluster.Builder(conf).numDataNodes(1).build(); + cluster.waitActive(); + final long post = Time.now(); + final long ctime = cluster.getNamesystem().getCTime(); + + assertTrue(pre <= ctime); + assertTrue(ctime <= post); + } finally { + if (cluster != null) { + cluster.shutdown(); + } + } + } + /** * In this test case, I have created an image with a file having * preferredblockSize = 0. We are trying to read this image (since file with