Bladeren bron

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

Vinayakumar B 4 jaren geleden
bovenliggende
commit
d259928035

+ 8 - 3
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 @@ 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()));
     }

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

@@ -203,4 +203,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();
+    }
+  }
 }