Skip to content

Commit 0bf439c

Browse files
authored
HDFS-17376. Distcp creates Factor 1 replication file on target if Source is EC. (#6540)
1 parent 50d256e commit 0bf439c

File tree

2 files changed

+24
-3
lines changed

2 files changed

+24
-3
lines changed

hadoop-tools/hadoop-distcp/src/main/java/org/apache/hadoop/tools/mapred/RetriableFileCopyCommand.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,9 @@ private static ThrottledInputStream getInputStream(Path path,
380380
private static short getReplicationFactor(
381381
EnumSet<FileAttribute> fileAttributes, CopyListingFileStatus source,
382382
FileSystem targetFS, Path tmpTargetPath) {
383+
if (source.isErasureCoded()) {
384+
return targetFS.getDefaultReplication(tmpTargetPath);
385+
}
383386
return fileAttributes.contains(FileAttribute.REPLICATION)
384387
? source.getReplication()
385388
: targetFS.getDefaultReplication(tmpTargetPath);

hadoop-tools/hadoop-distcp/src/test/java/org/apache/hadoop/tools/TestDistCpWithRawXAttrs.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ public class TestDistCpWithRawXAttrs {
6262
private static final Path dir1 = new Path("/src/dir1");
6363
private static final Path subDir1 = new Path(dir1, "subdir1");
6464
private static final Path file1 = new Path("/src/file1");
65+
private static final Path FILE_2 = new Path("/src/dir1/file2");
6566
private static final String rawRootName = "/.reserved/raw";
6667
private static final String rootedDestName = "/dest";
6768
private static final String rootedSrcName = "/src";
@@ -73,7 +74,7 @@ public static void init() throws Exception {
7374
conf = new Configuration();
7475
conf.setBoolean(DFSConfigKeys.DFS_NAMENODE_XATTRS_ENABLED_KEY, true);
7576
conf.setInt(DFSConfigKeys.DFS_LIST_LIMIT, 2);
76-
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(1).format(true)
77+
cluster = new MiniDFSCluster.Builder(conf).numDataNodes(3).format(true)
7778
.build();
7879
cluster.waitActive();
7980
fs = cluster.getFileSystem();
@@ -178,7 +179,7 @@ private void doTestPreserveRawXAttrs(String src, String dest,
178179
}
179180

180181
@Test
181-
public void testPreserveEC() throws Exception {
182+
public void testPreserveAndNoPreserveEC() throws Exception {
182183
final String src = "/src";
183184
final String dest = "/dest";
184185

@@ -190,9 +191,11 @@ public void testPreserveEC() throws Exception {
190191

191192
fs.delete(new Path("/dest"), true);
192193
fs.mkdirs(subDir1);
193-
fs.create(file1).close();
194194
DistributedFileSystem dfs = (DistributedFileSystem) fs;
195195
dfs.enableErasureCodingPolicy("XOR-2-1-1024k");
196+
dfs.setErasureCodingPolicy(dir1, "XOR-2-1-1024k");
197+
fs.create(file1).close();
198+
fs.create(FILE_2).close();
196199
int res = ToolRunner.run(conf, new ECAdmin(conf), args);
197200
assertEquals("Unable to set EC policy on " + subDir1.toString(), res, 0);
198201

@@ -203,6 +206,7 @@ public void testPreserveEC() throws Exception {
203206
FileStatus srcStatus = fs.getFileStatus(new Path(src));
204207
FileStatus srcDir1Status = fs.getFileStatus(dir1);
205208
FileStatus srcSubDir1Status = fs.getFileStatus(subDir1);
209+
FileStatus srcFile2Status = fs.getFileStatus(FILE_2);
206210

207211
FileStatus destStatus = fs.getFileStatus(new Path(dest));
208212
FileStatus destDir1Status = fs.getFileStatus(destDir1);
@@ -214,12 +218,26 @@ public void testPreserveEC() throws Exception {
214218
destStatus.isErasureCoded());
215219
assertTrue("/src/dir1 is not erasure coded!",
216220
srcDir1Status.isErasureCoded());
221+
assertTrue("/src/dir1/file2 is not erasure coded",
222+
srcFile2Status.isErasureCoded());
217223
assertTrue("/dest/dir1 is not erasure coded!",
218224
destDir1Status.isErasureCoded());
219225
assertTrue("/src/dir1/subdir1 is not erasure coded!",
220226
srcSubDir1Status.isErasureCoded());
221227
assertTrue("/dest/dir1/subdir1 is not erasure coded!",
222228
destSubDir1Status.isErasureCoded());
229+
230+
// test without -p to check if src is EC then target FS default replication
231+
// is obeyed on the target file.
232+
233+
fs.delete(new Path(dest), true);
234+
DistCpTestUtils.assertRunDistCp(DistCpConstants.SUCCESS, src, dest, null,
235+
conf);
236+
FileStatus destFileStatus = fs.getFileStatus(new Path(destDir1, "file2"));
237+
assertFalse(destFileStatus.isErasureCoded());
238+
assertEquals(fs.getDefaultReplication(new Path(destDir1, "file2")),
239+
destFileStatus.getReplication());
240+
dfs.unsetErasureCodingPolicy(dir1);
223241
}
224242

225243
@Test

0 commit comments

Comments
 (0)