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

This commit is contained in:
Vinayakumar B 2020-10-23 11:30:02 +05:30
parent f363c3b315
commit 8c6478b405
No known key found for this signature in database
GPG Key ID: E4EAD9C3D0215A71
2 changed files with 33 additions and 3 deletions

View File

@ -71,7 +71,12 @@ public class RawLocalFileSystem extends FileSystem {
public static void useStatIfAvailable() { public static void useStatIfAvailable() {
useDeprecatedFileStatus = !Stat.isAvailable(); useDeprecatedFileStatus = !Stat.isAvailable();
} }
@VisibleForTesting
static void setUseDeprecatedFileStatus(boolean useDeprecatedFileStatus) {
RawLocalFileSystem.useDeprecatedFileStatus = useDeprecatedFileStatus;
}
public RawLocalFileSystem() { public RawLocalFileSystem() {
workingDir = getInitialWorkingDirectory(); workingDir = getInitialWorkingDirectory();
} }
@ -693,8 +698,8 @@ public class RawLocalFileSystem extends FileSystem {
DeprecatedRawLocalFileStatus(File f, long defaultBlockSize, FileSystem fs) DeprecatedRawLocalFileStatus(File f, long defaultBlockSize, FileSystem fs)
throws IOException { throws IOException {
super(f.length(), f.isDirectory(), 1, defaultBlockSize, super(f.length(), f.isDirectory(), 1, defaultBlockSize,
f.lastModified(), getLastAccessTime(f), Files.getLastModifiedTime(f.toPath()).toMillis(),
null, null, null, getLastAccessTime(f),null, null, null,
new Path(f.getPath()).makeQualified(fs.getUri(), new Path(f.getPath()).makeQualified(fs.getUri(),
fs.getWorkingDirectory())); fs.getWorkingDirectory()));
} }

View File

@ -18,6 +18,7 @@
package org.apache.hadoop.fs; package org.apache.hadoop.fs;
import java.io.File; import java.io.File;
import java.io.IOException;
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.test.GenericTestUtils; 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();
}
}
} }