瀏覽代碼

HADOOP-14430 the accessTime of FileStatus returned by SFTPFileSystem's
getFileStatus method is always 0.
Contributed by Hongyuan Li.

Steve Loughran 8 年之前
父節點
當前提交
1efba62fd7

+ 1 - 1
hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/sftp/SFTPFileSystem.java

@@ -279,7 +279,7 @@ public class SFTPFileSystem extends FileSystem {
     // block sizes on server. The assumption could be less than ideal.
     long blockSize = DEFAULT_BLOCK_SIZE;
     long modTime = attr.getMTime() * 1000; // convert to milliseconds
-    long accessTime = 0;
+    long accessTime = attr.getATime() * 1000L;
     FsPermission permission = getPermissions(sftpFile);
     // not be able to get the real user group name, just use the user and group
     // id

+ 14 - 0
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/sftp/TestSFTPFileSystem.java

@@ -19,6 +19,8 @@ package org.apache.hadoop.fs.sftp;
 
 import java.io.IOException;
 import java.net.URI;
+import java.nio.file.Files;
+import java.nio.file.attribute.BasicFileAttributes;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -28,6 +30,7 @@ import org.apache.hadoop.fs.FSDataInputStream;
 import org.apache.hadoop.fs.FSDataOutputStream;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.LocalFileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.test.GenericTestUtils;
 import org.apache.hadoop.util.Shell;
@@ -306,4 +309,15 @@ public class TestSFTPFileSystem {
     sftpFs.rename(file1, file2);
   }
 
+  @Test
+  public void testGetAccessTime() throws IOException {
+    Path file = touch(localFs, name.getMethodName().toLowerCase());
+    LocalFileSystem local = (LocalFileSystem)localFs;
+    java.nio.file.Path path = (local).pathToFile(file).toPath();
+    long accessTime1 = Files.readAttributes(path, BasicFileAttributes.class)
+        .lastAccessTime().toMillis();
+    long accessTime2 = sftpFs.getFileStatus(file).getAccessTime();
+    assertEquals(accessTime1, accessTime2);
+  }
+
 }