From e21b81276e04138301dae1aa88da7bc4a51722fd Mon Sep 17 00:00:00 2001 From: Vinayakumar B Date: Fri, 23 Oct 2020 11:30:02 +0530 Subject: [PATCH] HADOOP-17306. RawLocalFileSystem's lastModifiedTime() looses milli seconds in JDK < 10.b09 (#2387) --- .../apache/hadoop/fs/RawLocalFileSystem.java | 11 ++++++--- .../fs/TestRawLocalFileSystemContract.java | 24 +++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java index 72eeb99a4e..129409663c 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java @@ -72,7 +72,12 @@ public class RawLocalFileSystem extends FileSystem { public static void useStatIfAvailable() { useDeprecatedFileStatus = !Stat.isAvailable(); } - + + @VisibleForTesting + static void setUseDeprecatedFileStatus(boolean useDeprecatedFileStatus) { + RawLocalFileSystem.useDeprecatedFileStatus = useDeprecatedFileStatus; + } + public RawLocalFileSystem() { workingDir = getInitialWorkingDirectory(); } @@ -700,8 +705,8 @@ private static long getLastAccessTime(File f) throws IOException { DeprecatedRawLocalFileStatus(File f, long defaultBlockSize, FileSystem fs) throws IOException { super(f.length(), f.isDirectory(), 1, defaultBlockSize, - f.lastModified(), getLastAccessTime(f), - null, null, null, + Files.getLastModifiedTime(f.toPath()).toMillis(), + getLastAccessTime(f),null, null, null, new Path(f.getPath()).makeQualified(fs.getUri(), fs.getWorkingDirectory())); } diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestRawLocalFileSystemContract.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestRawLocalFileSystemContract.java index b51419d8c5..cb45c9ef81 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestRawLocalFileSystemContract.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestRawLocalFileSystemContract.java @@ -203,4 +203,28 @@ public void testPermission() throws Exception { } } + @Test + public void testMTimeAtime() throws IOException { + RawLocalFileSystem.setUseDeprecatedFileStatus(true); + try { + Path testDir = getTestBaseDir(); + String testFilename = "testmtime"; + Path path = new Path(testDir, testFilename); + Path file = new Path(path, "file"); + fs.create(file); + long now = System.currentTimeMillis(); + long mtime = (now % 1000 == 0) ? now + 1 : now; + long atime = (now % 1000 == 0) ? now + 2 : now; + fs.setTimes(file, mtime, atime); + FileStatus fileStatus = fs.getFileStatus(file); + if (!Shell.MAC) { + // HADOOP-17306 ; Skip MacOS because HFS+ does not support + // milliseconds for mtime. + assertEquals(mtime, fileStatus.getModificationTime()); + } + assertEquals(atime, fileStatus.getAccessTime()); + } finally { + RawLocalFileSystem.useStatIfAvailable(); + } + } }