Browse Source

HADOOP-17306. RawLocalFileSystem's lastModifiedTime() looses milli seconds in JDK < 10.b09 (#2387)

Vinayakumar B 4 years ago
parent
commit
8c6478b405

+ 8 - 3
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java

@@ -71,7 +71,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();
   }
@@ -693,8 +698,8 @@ public class RawLocalFileSystem extends FileSystem {
     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()));
     }

+ 25 - 0
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/TestRawLocalFileSystemContract.java

@@ -18,6 +18,7 @@
 package org.apache.hadoop.fs;
 
 import java.io.File;
+import java.io.IOException;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.test.GenericTestUtils;
@@ -167,4 +168,28 @@ public class TestRawLocalFileSystemContract extends FileSystemContractBaseTest {
     }
   }
 
+  @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();
+    }
+  }
 }