|
@@ -61,15 +61,19 @@ public class TestErasureCodingPolicies {
|
|
private MiniDFSCluster cluster;
|
|
private MiniDFSCluster cluster;
|
|
private DistributedFileSystem fs;
|
|
private DistributedFileSystem fs;
|
|
private static final int BLOCK_SIZE = 1024;
|
|
private static final int BLOCK_SIZE = 1024;
|
|
- private static final ErasureCodingPolicy EC_POLICY =
|
|
|
|
- StripedFileTestUtil.getDefaultECPolicy();
|
|
|
|
|
|
+ private ErasureCodingPolicy ecPolicy;
|
|
private FSNamesystem namesystem;
|
|
private FSNamesystem namesystem;
|
|
|
|
|
|
|
|
+ public ErasureCodingPolicy getEcPolicy() {
|
|
|
|
+ return StripedFileTestUtil.getDefaultECPolicy();
|
|
|
|
+ }
|
|
|
|
+
|
|
@Rule
|
|
@Rule
|
|
public Timeout timeout = new Timeout(60 * 1000);
|
|
public Timeout timeout = new Timeout(60 * 1000);
|
|
|
|
|
|
@Before
|
|
@Before
|
|
public void setupCluster() throws IOException {
|
|
public void setupCluster() throws IOException {
|
|
|
|
+ ecPolicy = getEcPolicy();
|
|
conf = new HdfsConfiguration();
|
|
conf = new HdfsConfiguration();
|
|
conf.setInt(DFSConfigKeys.DFS_BLOCK_SIZE_KEY, BLOCK_SIZE);
|
|
conf.setInt(DFSConfigKeys.DFS_BLOCK_SIZE_KEY, BLOCK_SIZE);
|
|
DFSTestUtil.enableAllECPolicies(conf);
|
|
DFSTestUtil.enableAllECPolicies(conf);
|
|
@@ -100,8 +104,7 @@ public class TestErasureCodingPolicies {
|
|
DFSTestUtil.createFile(fs, replicatedFile, 0, (short) 3, 0L);
|
|
DFSTestUtil.createFile(fs, replicatedFile, 0, (short) 3, 0L);
|
|
|
|
|
|
// set ec policy on dir
|
|
// set ec policy on dir
|
|
- fs.setErasureCodingPolicy(dir,
|
|
|
|
- StripedFileTestUtil.getDefaultECPolicy().getName());
|
|
|
|
|
|
+ fs.setErasureCodingPolicy(dir, ecPolicy.getName());
|
|
// create a file which should be using ec
|
|
// create a file which should be using ec
|
|
final Path ecSubDir = new Path(dir, "ecSubDir");
|
|
final Path ecSubDir = new Path(dir, "ecSubDir");
|
|
final Path ecFile = new Path(ecSubDir, "ecFile");
|
|
final Path ecFile = new Path(ecSubDir, "ecFile");
|
|
@@ -153,7 +156,7 @@ public class TestErasureCodingPolicies {
|
|
fs.mkdir(testDir, FsPermission.getDirDefault());
|
|
fs.mkdir(testDir, FsPermission.getDirDefault());
|
|
|
|
|
|
/* Normal creation of an erasure coding directory */
|
|
/* Normal creation of an erasure coding directory */
|
|
- fs.setErasureCodingPolicy(testDir, EC_POLICY.getName());
|
|
|
|
|
|
+ fs.setErasureCodingPolicy(testDir, ecPolicy.getName());
|
|
|
|
|
|
/* Verify files under the directory are striped */
|
|
/* Verify files under the directory are striped */
|
|
final Path ECFilePath = new Path(testDir, "foo");
|
|
final Path ECFilePath = new Path(testDir, "foo");
|
|
@@ -169,7 +172,7 @@ public class TestErasureCodingPolicies {
|
|
fs.mkdir(notEmpty, FsPermission.getDirDefault());
|
|
fs.mkdir(notEmpty, FsPermission.getDirDefault());
|
|
final Path oldFile = new Path(notEmpty, "old");
|
|
final Path oldFile = new Path(notEmpty, "old");
|
|
fs.create(oldFile);
|
|
fs.create(oldFile);
|
|
- fs.setErasureCodingPolicy(notEmpty, EC_POLICY.getName());
|
|
|
|
|
|
+ fs.setErasureCodingPolicy(notEmpty, ecPolicy.getName());
|
|
final Path newFile = new Path(notEmpty, "new");
|
|
final Path newFile = new Path(notEmpty, "new");
|
|
fs.create(newFile);
|
|
fs.create(newFile);
|
|
INode oldInode = namesystem.getFSDirectory().getINode(oldFile.toString());
|
|
INode oldInode = namesystem.getFSDirectory().getINode(oldFile.toString());
|
|
@@ -181,10 +184,10 @@ public class TestErasureCodingPolicies {
|
|
final Path dir1 = new Path("/dir1");
|
|
final Path dir1 = new Path("/dir1");
|
|
final Path dir2 = new Path(dir1, "dir2");
|
|
final Path dir2 = new Path(dir1, "dir2");
|
|
fs.mkdir(dir1, FsPermission.getDirDefault());
|
|
fs.mkdir(dir1, FsPermission.getDirDefault());
|
|
- fs.setErasureCodingPolicy(dir1, EC_POLICY.getName());
|
|
|
|
|
|
+ fs.setErasureCodingPolicy(dir1, ecPolicy.getName());
|
|
fs.mkdir(dir2, FsPermission.getDirDefault());
|
|
fs.mkdir(dir2, FsPermission.getDirDefault());
|
|
try {
|
|
try {
|
|
- fs.setErasureCodingPolicy(dir2, EC_POLICY.getName());
|
|
|
|
|
|
+ fs.setErasureCodingPolicy(dir2, ecPolicy.getName());
|
|
} catch (IOException e) {
|
|
} catch (IOException e) {
|
|
fail("Nested erasure coding policies are supported");
|
|
fail("Nested erasure coding policies are supported");
|
|
}
|
|
}
|
|
@@ -193,7 +196,7 @@ public class TestErasureCodingPolicies {
|
|
final Path fPath = new Path("/file");
|
|
final Path fPath = new Path("/file");
|
|
fs.create(fPath);
|
|
fs.create(fPath);
|
|
try {
|
|
try {
|
|
- fs.setErasureCodingPolicy(fPath, EC_POLICY.getName());
|
|
|
|
|
|
+ fs.setErasureCodingPolicy(fPath, ecPolicy.getName());
|
|
fail("Erasure coding policy on file");
|
|
fail("Erasure coding policy on file");
|
|
} catch (IOException e) {
|
|
} catch (IOException e) {
|
|
assertExceptionContains("erasure coding policy for a file", e);
|
|
assertExceptionContains("erasure coding policy for a file", e);
|
|
@@ -213,11 +216,11 @@ public class TestErasureCodingPolicies {
|
|
// Already set directory-level policies should still be in effect
|
|
// Already set directory-level policies should still be in effect
|
|
Path disabledPolicy = new Path(dir1, "afterDisabled");
|
|
Path disabledPolicy = new Path(dir1, "afterDisabled");
|
|
Assert.assertEquals("Dir does not have policy set",
|
|
Assert.assertEquals("Dir does not have policy set",
|
|
- EC_POLICY,
|
|
|
|
|
|
+ ecPolicy,
|
|
fs.getErasureCodingPolicy(dir1));
|
|
fs.getErasureCodingPolicy(dir1));
|
|
fs.create(disabledPolicy).close();
|
|
fs.create(disabledPolicy).close();
|
|
Assert.assertEquals("File did not inherit dir's policy",
|
|
Assert.assertEquals("File did not inherit dir's policy",
|
|
- EC_POLICY,
|
|
|
|
|
|
+ ecPolicy,
|
|
fs.getErasureCodingPolicy(disabledPolicy));
|
|
fs.getErasureCodingPolicy(disabledPolicy));
|
|
|
|
|
|
// Also check loading disabled EC policies from fsimage
|
|
// Also check loading disabled EC policies from fsimage
|
|
@@ -227,10 +230,10 @@ public class TestErasureCodingPolicies {
|
|
cluster.restartNameNodes();
|
|
cluster.restartNameNodes();
|
|
|
|
|
|
Assert.assertEquals("Dir does not have policy set",
|
|
Assert.assertEquals("Dir does not have policy set",
|
|
- EC_POLICY,
|
|
|
|
|
|
+ ecPolicy,
|
|
fs.getErasureCodingPolicy(dir1));
|
|
fs.getErasureCodingPolicy(dir1));
|
|
Assert.assertEquals("File does not have policy set",
|
|
Assert.assertEquals("File does not have policy set",
|
|
- EC_POLICY,
|
|
|
|
|
|
+ ecPolicy,
|
|
fs.getErasureCodingPolicy(disabledPolicy));
|
|
fs.getErasureCodingPolicy(disabledPolicy));
|
|
}
|
|
}
|
|
|
|
|
|
@@ -240,8 +243,8 @@ public class TestErasureCodingPolicies {
|
|
final Path dstECDir = new Path("/dstEC");
|
|
final Path dstECDir = new Path("/dstEC");
|
|
fs.mkdir(srcECDir, FsPermission.getDirDefault());
|
|
fs.mkdir(srcECDir, FsPermission.getDirDefault());
|
|
fs.mkdir(dstECDir, FsPermission.getDirDefault());
|
|
fs.mkdir(dstECDir, FsPermission.getDirDefault());
|
|
- fs.setErasureCodingPolicy(srcECDir, EC_POLICY.getName());
|
|
|
|
- fs.setErasureCodingPolicy(dstECDir, EC_POLICY.getName());
|
|
|
|
|
|
+ fs.setErasureCodingPolicy(srcECDir, ecPolicy.getName());
|
|
|
|
+ fs.setErasureCodingPolicy(dstECDir, ecPolicy.getName());
|
|
final Path srcFile = new Path(srcECDir, "foo");
|
|
final Path srcFile = new Path(srcECDir, "foo");
|
|
fs.create(srcFile);
|
|
fs.create(srcFile);
|
|
|
|
|
|
@@ -275,8 +278,7 @@ public class TestErasureCodingPolicies {
|
|
public void testReplication() throws IOException {
|
|
public void testReplication() throws IOException {
|
|
final Path testDir = new Path("/ec");
|
|
final Path testDir = new Path("/ec");
|
|
fs.mkdir(testDir, FsPermission.getDirDefault());
|
|
fs.mkdir(testDir, FsPermission.getDirDefault());
|
|
- fs.setErasureCodingPolicy(testDir,
|
|
|
|
- StripedFileTestUtil.getDefaultECPolicy().getName());
|
|
|
|
|
|
+ fs.setErasureCodingPolicy(testDir, ecPolicy.getName());
|
|
final Path fooFile = new Path(testDir, "foo");
|
|
final Path fooFile = new Path(testDir, "foo");
|
|
// create ec file with replication=0
|
|
// create ec file with replication=0
|
|
fs.create(fooFile, FsPermission.getFileDefault(), true,
|
|
fs.create(fooFile, FsPermission.getFileDefault(), true,
|
|
@@ -330,10 +332,10 @@ public class TestErasureCodingPolicies {
|
|
private void verifyErasureCodingInfo(
|
|
private void verifyErasureCodingInfo(
|
|
String src, ErasureCodingPolicy usingECPolicy) throws IOException {
|
|
String src, ErasureCodingPolicy usingECPolicy) throws IOException {
|
|
HdfsFileStatus hdfsFileStatus = fs.getClient().getFileInfo(src);
|
|
HdfsFileStatus hdfsFileStatus = fs.getClient().getFileInfo(src);
|
|
- ErasureCodingPolicy ecPolicy = hdfsFileStatus.getErasureCodingPolicy();
|
|
|
|
- assertNotNull(ecPolicy);
|
|
|
|
|
|
+ ErasureCodingPolicy actualPolicy = hdfsFileStatus.getErasureCodingPolicy();
|
|
|
|
+ assertNotNull(actualPolicy);
|
|
assertEquals("Actually used ecPolicy should be equal with target ecPolicy",
|
|
assertEquals("Actually used ecPolicy should be equal with target ecPolicy",
|
|
- usingECPolicy, ecPolicy);
|
|
|
|
|
|
+ usingECPolicy, actualPolicy);
|
|
}
|
|
}
|
|
|
|
|
|
@Test
|
|
@Test
|
|
@@ -342,13 +344,13 @@ public class TestErasureCodingPolicies {
|
|
ECSchema rsSchema = new ECSchema("rs", 4, 2);
|
|
ECSchema rsSchema = new ECSchema("rs", 4, 2);
|
|
String policyName = "RS-4-2-128k";
|
|
String policyName = "RS-4-2-128k";
|
|
int cellSize = 128 * 1024;
|
|
int cellSize = 128 * 1024;
|
|
- ErasureCodingPolicy ecPolicy =
|
|
|
|
|
|
+ ErasureCodingPolicy invalidPolicy =
|
|
new ErasureCodingPolicy(policyName, rsSchema, cellSize, (byte) -1);
|
|
new ErasureCodingPolicy(policyName, rsSchema, cellSize, (byte) -1);
|
|
String src = "/ecDir4-2";
|
|
String src = "/ecDir4-2";
|
|
final Path ecDir = new Path(src);
|
|
final Path ecDir = new Path(src);
|
|
try {
|
|
try {
|
|
fs.mkdir(ecDir, FsPermission.getDirDefault());
|
|
fs.mkdir(ecDir, FsPermission.getDirDefault());
|
|
- fs.getClient().setErasureCodingPolicy(src, ecPolicy.getName());
|
|
|
|
|
|
+ fs.getClient().setErasureCodingPolicy(src, invalidPolicy.getName());
|
|
fail("HadoopIllegalArgumentException should be thrown for"
|
|
fail("HadoopIllegalArgumentException should be thrown for"
|
|
+ "setting an invalid erasure coding policy");
|
|
+ "setting an invalid erasure coding policy");
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
@@ -429,8 +431,7 @@ public class TestErasureCodingPolicies {
|
|
Path ecfile = new Path(ecdir, "ecfile");
|
|
Path ecfile = new Path(ecdir, "ecfile");
|
|
fs.setPermission(new Path("/"), new FsPermission((short)0777));
|
|
fs.setPermission(new Path("/"), new FsPermission((short)0777));
|
|
userfs.mkdirs(ecdir);
|
|
userfs.mkdirs(ecdir);
|
|
- final String ecPolicyName = StripedFileTestUtil.getDefaultECPolicy()
|
|
|
|
- .getName();
|
|
|
|
|
|
+ final String ecPolicyName = ecPolicy.getName();
|
|
useradmin.setErasureCodingPolicy(ecdir, ecPolicyName);
|
|
useradmin.setErasureCodingPolicy(ecdir, ecPolicyName);
|
|
assertEquals("Policy not present on dir",
|
|
assertEquals("Policy not present on dir",
|
|
ecPolicyName,
|
|
ecPolicyName,
|
|
@@ -537,12 +538,12 @@ public class TestErasureCodingPolicies {
|
|
final Path filePath1 = new Path(dirPath, "file1");
|
|
final Path filePath1 = new Path(dirPath, "file1");
|
|
|
|
|
|
fs.mkdirs(dirPath);
|
|
fs.mkdirs(dirPath);
|
|
- fs.setErasureCodingPolicy(dirPath, EC_POLICY.getName());
|
|
|
|
|
|
+ fs.setErasureCodingPolicy(dirPath, ecPolicy.getName());
|
|
|
|
|
|
// null EC policy name value means inheriting parent directory's policy
|
|
// null EC policy name value means inheriting parent directory's policy
|
|
fs.createFile(filePath0).build().close();
|
|
fs.createFile(filePath0).build().close();
|
|
ErasureCodingPolicy ecPolicyOnFile = fs.getErasureCodingPolicy(filePath0);
|
|
ErasureCodingPolicy ecPolicyOnFile = fs.getErasureCodingPolicy(filePath0);
|
|
- assertEquals(EC_POLICY, ecPolicyOnFile);
|
|
|
|
|
|
+ assertEquals(ecPolicy, ecPolicyOnFile);
|
|
|
|
|
|
// Test illegal EC policy name
|
|
// Test illegal EC policy name
|
|
final String illegalPolicyName = "RS-DEFAULT-1-2-64k";
|
|
final String illegalPolicyName = "RS-DEFAULT-1-2-64k";
|
|
@@ -560,7 +561,8 @@ public class TestErasureCodingPolicies {
|
|
final ErasureCodingPolicy ecPolicyOnDir =
|
|
final ErasureCodingPolicy ecPolicyOnDir =
|
|
SystemErasureCodingPolicies.getByID(
|
|
SystemErasureCodingPolicies.getByID(
|
|
SystemErasureCodingPolicies.RS_3_2_POLICY_ID);
|
|
SystemErasureCodingPolicies.RS_3_2_POLICY_ID);
|
|
- ecPolicyOnFile = EC_POLICY;
|
|
|
|
|
|
+ ecPolicyOnFile = SystemErasureCodingPolicies.getByID(
|
|
|
|
+ SystemErasureCodingPolicies.RS_6_3_POLICY_ID);
|
|
fs.setErasureCodingPolicy(dirPath, ecPolicyOnDir.getName());
|
|
fs.setErasureCodingPolicy(dirPath, ecPolicyOnDir.getName());
|
|
fs.createFile(filePath0).ecPolicyName(ecPolicyOnFile.getName())
|
|
fs.createFile(filePath0).ecPolicyName(ecPolicyOnFile.getName())
|
|
.build().close();
|
|
.build().close();
|
|
@@ -578,11 +580,11 @@ public class TestErasureCodingPolicies {
|
|
final Path filePath = new Path(dirPath, "file");
|
|
final Path filePath = new Path(dirPath, "file");
|
|
|
|
|
|
fs.mkdirs(dirPath);
|
|
fs.mkdirs(dirPath);
|
|
- fs.setErasureCodingPolicy(dirPath, EC_POLICY.getName());
|
|
|
|
|
|
+ fs.setErasureCodingPolicy(dirPath, ecPolicy.getName());
|
|
|
|
|
|
final String ecPolicyName = "RS-10-4-64k";
|
|
final String ecPolicyName = "RS-10-4-64k";
|
|
fs.createFile(filePath).build().close();
|
|
fs.createFile(filePath).build().close();
|
|
- assertEquals(EC_POLICY, fs.getErasureCodingPolicy(filePath));
|
|
|
|
|
|
+ assertEquals(ecPolicy, fs.getErasureCodingPolicy(filePath));
|
|
fs.delete(filePath, true);
|
|
fs.delete(filePath, true);
|
|
|
|
|
|
fs.createFile(filePath)
|
|
fs.createFile(filePath)
|