Author: cnauroth
Date: Tue Jun 17 17:11:24 2014
New Revision: 1603226
URL: http://svn.apache.org/r1603226
Log:
HADOOP-10557. Merging change r1603222 from trunk to branch-2.
Modified:
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/CHANGES.txt
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CommandWithDestination.java
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CopyCommands.java
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/site/apt/FileSystemShell.apt.vm
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/test/resources/testConf.xml
Modified:
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/CHANGES.txt?rev=1603226&r1=1603225&r2=1603226&view=diff
==============================================================================
---
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/CHANGES.txt
(original)
+++
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/CHANGES.txt
Tue Jun 17 17:11:24 2014
@@ -88,6 +88,9 @@ Release 2.5.0 - UNRELEASED
HADOOP-10666. Remove Copyright /d/d/d/d Apache Software Foundation from
the source files license header. (Henry Saputra via wang)
+ HADOOP-10557. FsShell -cp -pa option for preserving extended ACLs.
+ (Akira Ajisaka via cnauroth)
+
OPTIMIZATIONS
BUG FIXES
Modified:
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CommandWithDestination.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CommandWithDestination.java?rev=1603226&r1=1603225&r2=1603226&view=diff
==============================================================================
---
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CommandWithDestination.java
(original)
+++
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CommandWithDestination.java
Tue Jun 17 17:11:24 2014
@@ -25,6 +25,7 @@ import java.net.URISyntaxException;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.LinkedList;
+import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.NoSuchElementException;
@@ -39,6 +40,9 @@ import org.apache.hadoop.fs.PathIsDirect
import org.apache.hadoop.fs.PathIsNotDirectoryException;
import org.apache.hadoop.fs.PathNotFoundException;
import org.apache.hadoop.fs.PathOperationException;
+import org.apache.hadoop.fs.permission.AclEntry;
+import org.apache.hadoop.fs.permission.AclUtil;
+import org.apache.hadoop.fs.permission.FsPermission;
import org.apache.hadoop.io.IOUtils;
/**
@@ -88,7 +92,7 @@ abstract class CommandWithDestination ex
}
protected static enum FileAttribute {
- TIMESTAMPS, OWNERSHIP, PERMISSION, XATTR;
+ TIMESTAMPS, OWNERSHIP, PERMISSION, ACL, XATTR;
public static FileAttribute getAttribute(char symbol) {
for (FileAttribute attribute : values()) {
@@ -306,11 +310,22 @@ abstract class CommandWithDestination ex
src.stat.getOwner(),
src.stat.getGroup());
}
- if (shouldPreserve(FileAttribute.PERMISSION)) {
+ if (shouldPreserve(FileAttribute.PERMISSION) ||
+ shouldPreserve(FileAttribute.ACL)) {
target.fs.setPermission(
target.path,
src.stat.getPermission());
}
+ if (shouldPreserve(FileAttribute.ACL)) {
+ FsPermission perm = src.stat.getPermission();
+ if (perm.getAclBit()) {
+ List<AclEntry> srcEntries =
+ src.fs.getAclStatus(src.path).getEntries();
+ List<AclEntry> srcFullEntries =
+ AclUtil.getAclFromPermAndEntries(perm, srcEntries);
+ target.fs.setAcl(target.path, srcFullEntries);
+ }
+ }
if (shouldPreserve(FileAttribute.XATTR)) {
Map<String, byte[]> srcXAttrs = src.fs.getXAttrs(src.path);
if (srcXAttrs != null) {
Modified:
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CopyCommands.java
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CopyCommands.java?rev=1603226&r1=1603225&r2=1603226&view=diff
==============================================================================
---
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CopyCommands.java
(original)
+++
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/shell/CopyCommands.java
Tue Jun 17 17:11:24 2014
@@ -133,16 +133,18 @@ class CopyCommands {
static class Cp extends CommandWithDestination {
public static final String NAME = "cp";
- public static final String USAGE = "[-f] [-p | -p[topx]] <src> ... <dst>";
+ public static final String USAGE = "[-f] [-p | -p[topax]] <src> ... <dst>";
public static final String DESCRIPTION =
"Copy files that match the file pattern <src> to a " +
"destination. When copying multiple files, the destination " +
"must be a directory. Passing -p preserves status " +
- "[topx] (timestamps, ownership, permission, XAttr). " +
+ "[topax] (timestamps, ownership, permission, ACLs, XAttr). " +
"If -p is specified with no <arg>, then preserves " +
- "timestamps, ownership, permission. Passing -f " +
- "overwrites the destination if it already exists.\n";
-
+ "timestamps, ownership, permission. If -pa is specified, " +
+ "then preserves permission also because ACL is a super-set of " +
+ "permission. Passing -f overwrites the destination if it " +
+ "already exists.\n";
+
@Override
protected void processOptions(LinkedList<String> args) throws IOException {
popPreserveOption(args);
Modified:
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/site/apt/FileSystemShell.apt.vm
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/site/apt/FileSystemShell.apt.vm?rev=1603226&r1=1603225&r2=1603226&view=diff
==============================================================================
---
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/site/apt/FileSystemShell.apt.vm
(original)
+++
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/site/apt/FileSystemShell.apt.vm
Tue Jun 17 17:11:24 2014
@@ -159,7 +159,7 @@ count
cp
- Usage: <<<hdfs dfs -cp [-f] [-p | -p[topx]] URI [URI ...] <dest> >>>
+ Usage: <<<hdfs dfs -cp [-f] [-p | -p[topax]] URI [URI ...] <dest> >>>
Copy files from source to destination. This command allows multiple sources
as well in which case the destination must be a directory.
@@ -169,8 +169,10 @@ cp
* The -f option will overwrite the destination if it already exists.
* The -p option will preserve file attributes [topx] (timestamps,
- ownership, permission, XAttr). If -p is specified with no <arg>,
- then preserves timestamps, ownership, permission.
+ ownership, permission, ACL, XAttr). If -p is specified with no <arg>,
+ then preserves timestamps, ownership, permission. If -pa is specified,
+ then preserves permission also because ACL is a super-set of
+ permission.
Example:
Modified:
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/test/resources/testConf.xml
URL:
http://svn.apache.org/viewvc/hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/test/resources/testConf.xml?rev=1603226&r1=1603225&r2=1603226&view=diff
==============================================================================
---
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/test/resources/testConf.xml
(original)
+++
hadoop/common/branches/branch-2/hadoop-common-project/hadoop-common/src/test/resources/testConf.xml
Tue Jun 17 17:11:24 2014
@@ -296,7 +296,7 @@
<comparators>
<comparator>
<type>RegexpComparator</type>
- <expected-output>^-cp \[-f\] \[-p \| -p\[topx\]\] <src> \.\.\.
<dst> :\s*</expected-output>
+ <expected-output>^-cp \[-f\] \[-p \| -p\[topax\]\] <src>
\.\.\. <dst> :\s*</expected-output>
</comparator>
<comparator>
<type>RegexpComparator</type>
@@ -308,15 +308,19 @@
</comparator>
<comparator>
<type>RegexpComparator</type>
- <expected-output>^( |\t)*\[topx\] \(timestamps, ownership,
permission, XAttr\). If -p is specified with no( )*</expected-output>
+ <expected-output>^( |\t)*\[topax\] \(timestamps, ownership,
permission, ACLs, XAttr\). If -p is specified( )*</expected-output>
</comparator>
<comparator>
<type>RegexpComparator</type>
- <expected-output>^( |\t)*<arg>, then preserves timestamps,
ownership, permission. Passing -f overwrites( )*</expected-output>
+ <expected-output>^( |\t)*with no <arg>, then preserves
timestamps, ownership, permission. If -pa is( )*</expected-output>
</comparator>
<comparator>
<type>RegexpComparator</type>
- <expected-output>^\s*the destination if it already exists.(
)*</expected-output>
+ <expected-output>^( |\t)*specified, then preserves permission also
because ACL is a super-set of( )*</expected-output>
+ </comparator>
+ <comparator>
+ <type>RegexpComparator</type>
+ <expected-output>^\s*permission. Passing -f overwrites the
destination if it already exists.( )*</expected-output>
</comparator>
</comparators>
</test>