Stephen Chu created HADOOP-9705:
-----------------------------------
Summary: FsShell cp -p does not preserve directory attibutes
Key: HADOOP-9705
URL: https://issues.apache.org/jira/browse/HADOOP-9705
Project: Hadoop Common
Issue Type: Bug
Components: fs
Affects Versions: 2.0.4-alpha, 3.0.0
Reporter: Stephen Chu
HADOOP-9338 added the -p flag to preserve file attributes when copying.
However, cp -p does not preserve directory attributes. It'd be useful to add
this functionality.
For example, the following shows that the modified time is not preserved
{code}
[schu@hdfs-snapshots-1 ~]$ $HADOOP_HOME/bin/hdfs dfs -mkdir /user/schu/testDir1
[schu@hdfs-snapshots-1 ~]$ $HADOOP_HOME/bin/hdfs dfs -ls /user/schu/
Found 1 items
drwxr-xr-x - schu supergroup 0 2013-07-07 20:25 /user/schu/testDir1
[schu@hdfs-snapshots-1 ~]$ $HADOOP_HOME/bin/hdfs dfs -cp -p /user/schu/testDir1
/user/schu/testDir2
[schu@hdfs-snapshots-1 ~]$ $HADOOP_HOME/bin/hdfs dfs -ls /user/schu
Found 2 items
drwxr-xr-x - schu supergroup 0 2013-07-07 20:25 /user/schu/testDir1
drwxr-xr-x - schu supergroup 0 2013-07-07 20:35 /user/schu/testDir2
[schu@hdfs-snapshots-1 ~]$
{code}
The preserve logic is in CommandWithDestination#copyFileToTarget, which is only
called with files.
{code}
protected void processPath(PathData src, PathData dst) throws IOException {
if (src.stat.isSymlink()) {
// TODO: remove when FileContext is supported, this needs to either
// copy the symlink or deref the symlink
throw new PathOperationException(src.toString());
} else if (src.stat.isFile()) {
copyFileToTarget(src, dst);
} else if (src.stat.isDirectory() && !isRecursive()) {
throw new PathIsDirectoryException(src.toString());
}
}
{code}
{code}
/**
* Copies the source file to the target.
* @param src item to copy
* @param target where to copy the item
* @throws IOException if copy fails
*/
protected void copyFileToTarget(PathData src, PathData target) throws
IOException {
src.fs.setVerifyChecksum(verifyChecksum);
if (src != null) {
throw new PathExistsException("hi");
}
InputStream in = null;
try {
in = src.fs.open(src.path);
copyStreamToTarget(in, target);
if(preserve) {
target.fs.setTimes(
target.path,
src.stat.getModificationTime(),
src.stat.getAccessTime());
target.fs.setOwner(
target.path,
src.stat.getOwner(),
src.stat.getGroup());
target.fs.setPermission(
target.path,
src.stat.getPermission());
System.out.println("Preserving");
if (src.fs.equals(target.fs)) {
System.out.println("Same filesystems");
src.fs.preserveAttributes(src.path, target.path);
}
throw new IOException("hi");
}
} finally {
IOUtils.closeStream(in);
}
}
{code}
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira