|
@@ -36,12 +36,12 @@ import java.util.zip.GZIPOutputStream;
|
|
|
|
|
|
import com.google.common.base.Supplier;
|
|
import com.google.common.base.Supplier;
|
|
import com.google.common.collect.Lists;
|
|
import com.google.common.collect.Lists;
|
|
|
|
+
|
|
import org.apache.commons.lang.RandomStringUtils;
|
|
import org.apache.commons.lang.RandomStringUtils;
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.LogFactory;
|
|
import org.apache.commons.logging.LogFactory;
|
|
import org.apache.log4j.Level;
|
|
import org.apache.log4j.Level;
|
|
import org.junit.Test;
|
|
import org.junit.Test;
|
|
-
|
|
|
|
import org.apache.hadoop.conf.Configuration;
|
|
import org.apache.hadoop.conf.Configuration;
|
|
import org.apache.hadoop.fs.*;
|
|
import org.apache.hadoop.fs.*;
|
|
import org.apache.hadoop.fs.permission.AclEntry;
|
|
import org.apache.hadoop.fs.permission.AclEntry;
|
|
@@ -65,6 +65,7 @@ import org.apache.hadoop.test.GenericTestUtils;
|
|
import org.apache.hadoop.test.PathUtils;
|
|
import org.apache.hadoop.test.PathUtils;
|
|
import org.apache.hadoop.util.ReflectionUtils;
|
|
import org.apache.hadoop.util.ReflectionUtils;
|
|
import org.apache.hadoop.util.StringUtils;
|
|
import org.apache.hadoop.util.StringUtils;
|
|
|
|
+import org.apache.hadoop.util.Time;
|
|
import org.apache.hadoop.util.ToolRunner;
|
|
import org.apache.hadoop.util.ToolRunner;
|
|
import org.junit.rules.Timeout;
|
|
import org.junit.rules.Timeout;
|
|
import org.junit.AfterClass;
|
|
import org.junit.AfterClass;
|
|
@@ -115,6 +116,7 @@ public class TestDFSShell {
|
|
GenericTestUtils.getTestDir("TestDFSShell").getAbsolutePath());
|
|
GenericTestUtils.getTestDir("TestDFSShell").getAbsolutePath());
|
|
conf.setBoolean(DFSConfigKeys.DFS_NAMENODE_XATTRS_ENABLED_KEY, true);
|
|
conf.setBoolean(DFSConfigKeys.DFS_NAMENODE_XATTRS_ENABLED_KEY, true);
|
|
conf.setBoolean(DFSConfigKeys.DFS_NAMENODE_ACLS_ENABLED_KEY, true);
|
|
conf.setBoolean(DFSConfigKeys.DFS_NAMENODE_ACLS_ENABLED_KEY, true);
|
|
|
|
+ conf.setLong(DFSConfigKeys.DFS_NAMENODE_ACCESSTIME_PRECISION_KEY, 1000);
|
|
|
|
|
|
miniCluster = new MiniDFSCluster.Builder(conf).numDataNodes(2).build();
|
|
miniCluster = new MiniDFSCluster.Builder(conf).numDataNodes(2).build();
|
|
miniCluster.waitActive();
|
|
miniCluster.waitActive();
|
|
@@ -2002,8 +2004,12 @@ public class TestDFSShell {
|
|
DFSTestUtil.createFile(dfs, testFile2, 2 * BLOCK_SIZE, (short) 3, 0);
|
|
DFSTestUtil.createFile(dfs, testFile2, 2 * BLOCK_SIZE, (short) 3, 0);
|
|
final FileStatus status1 = dfs.getFileStatus(testDir1);
|
|
final FileStatus status1 = dfs.getFileStatus(testDir1);
|
|
final String mtime1 = fmt.format(new Date(status1.getModificationTime()));
|
|
final String mtime1 = fmt.format(new Date(status1.getModificationTime()));
|
|
|
|
+ final String atime1 = fmt.format(new Date(status1.getAccessTime()));
|
|
|
|
+ long now = Time.now();
|
|
|
|
+ dfs.setTimes(testFile2, now + 3000, now + 6000);
|
|
final FileStatus status2 = dfs.getFileStatus(testFile2);
|
|
final FileStatus status2 = dfs.getFileStatus(testFile2);
|
|
final String mtime2 = fmt.format(new Date(status2.getModificationTime()));
|
|
final String mtime2 = fmt.format(new Date(status2.getModificationTime()));
|
|
|
|
+ final String atime2 = fmt.format(new Date(status2.getAccessTime()));
|
|
|
|
|
|
final ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
final ByteArrayOutputStream out = new ByteArrayOutputStream();
|
|
System.setOut(new PrintStream(out));
|
|
System.setOut(new PrintStream(out));
|
|
@@ -2036,17 +2042,19 @@ public class TestDFSShell {
|
|
out.toString().contains(String.valueOf(octal)));
|
|
out.toString().contains(String.valueOf(octal)));
|
|
|
|
|
|
out.reset();
|
|
out.reset();
|
|
- doFsStat(dfs.getConf(), "%F %a %A %u:%g %b %y %n", testDir1, testFile2);
|
|
|
|
|
|
+ doFsStat(dfs.getConf(), "%F %a %A %u:%g %b %x %y %n", testDir1, testFile2);
|
|
|
|
|
|
n = status2.getPermission().toShort();
|
|
n = status2.getPermission().toShort();
|
|
octal = (n>>>9&1)*1000 + (n>>>6&7)*100 + (n>>>3&7)*10 + (n&7);
|
|
octal = (n>>>9&1)*1000 + (n>>>6&7)*100 + (n>>>3&7)*10 + (n&7);
|
|
assertTrue(out.toString(), out.toString().contains(mtime1));
|
|
assertTrue(out.toString(), out.toString().contains(mtime1));
|
|
|
|
+ assertTrue(out.toString(), out.toString().contains(atime1));
|
|
assertTrue(out.toString(), out.toString().contains("regular file"));
|
|
assertTrue(out.toString(), out.toString().contains("regular file"));
|
|
assertTrue(out.toString(),
|
|
assertTrue(out.toString(),
|
|
out.toString().contains(status2.getPermission().toString()));
|
|
out.toString().contains(status2.getPermission().toString()));
|
|
assertTrue(out.toString(),
|
|
assertTrue(out.toString(),
|
|
out.toString().contains(String.valueOf(octal)));
|
|
out.toString().contains(String.valueOf(octal)));
|
|
assertTrue(out.toString(), out.toString().contains(mtime2));
|
|
assertTrue(out.toString(), out.toString().contains(mtime2));
|
|
|
|
+ assertTrue(out.toString(), out.toString().contains(atime2));
|
|
}
|
|
}
|
|
|
|
|
|
private static void doFsStat(Configuration conf, String format, Path... files)
|
|
private static void doFsStat(Configuration conf, String format, Path... files)
|