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

Reply via email to