HDFS-8853. Erasure Coding: Provide ECSchema validation when setting EC policy. Contributed by J.Andreina.
Change-Id: I9211d9728480225a407d82e6c0bea1a928adfa11
This commit is contained in:
parent
f62237bc2f
commit
96d6b516b2
@ -415,3 +415,6 @@
|
||||
|
||||
HDFS-8833. Erasure coding: store EC schema and cell size in INodeFile and
|
||||
eliminate notion of EC zones. (zhz)
|
||||
|
||||
HDFS-8853. Erasure Coding: Provide ECSchema validation when setting EC
|
||||
policy. (andreina via zhz)
|
||||
|
@ -28,6 +28,8 @@
|
||||
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.google.common.collect.Lists;
|
||||
|
||||
import org.apache.hadoop.HadoopIllegalArgumentException;
|
||||
import org.apache.hadoop.fs.XAttr;
|
||||
import org.apache.hadoop.fs.XAttrSetFlag;
|
||||
import org.apache.hadoop.fs.permission.FsAction;
|
||||
@ -105,6 +107,26 @@ static List<XAttr> createErasureCodingPolicyXAttr(final FSNamesystem fsn,
|
||||
// System default erasure coding policy will be used since no specified.
|
||||
if (ecPolicy == null) {
|
||||
ecPolicy = ErasureCodingPolicyManager.getSystemDefaultPolicy();
|
||||
} else {
|
||||
// If ecPolicy is specified check if it is one among active policies.
|
||||
boolean validPolicy = false;
|
||||
ErasureCodingPolicy[] activePolicies =
|
||||
FSDirErasureCodingOp.getErasureCodingPolicies(fsd.getFSNamesystem());
|
||||
for (ErasureCodingPolicy activePolicy : activePolicies) {
|
||||
if (activePolicy.equals(ecPolicy)) {
|
||||
validPolicy = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!validPolicy) {
|
||||
List<String> ecPolicyNames = new ArrayList<String>();
|
||||
for (ErasureCodingPolicy activePolicy : activePolicies) {
|
||||
ecPolicyNames.add(activePolicy.getName());
|
||||
}
|
||||
throw new HadoopIllegalArgumentException("Policy [ " +
|
||||
ecPolicy.getName()+ " ] does not match any of the " +
|
||||
"supported policies. Please select any one of " + ecPolicyNames);
|
||||
}
|
||||
}
|
||||
|
||||
final XAttr ecXAttr;
|
||||
|
@ -26,6 +26,7 @@
|
||||
import org.apache.hadoop.hdfs.server.namenode.FSNamesystem;
|
||||
import org.apache.hadoop.hdfs.server.namenode.INode;
|
||||
import org.apache.hadoop.hdfs.protocol.ErasureCodingPolicy;
|
||||
import org.apache.hadoop.io.erasurecode.ECSchema;
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
@ -208,4 +209,26 @@ private void verifyErasureCodingInfo(
|
||||
assertEquals("Actually used ecPolicy should be equal with target ecPolicy",
|
||||
usingECPolicy, ecPolicy);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCreationErasureCodingZoneWithInvalidPolicy()
|
||||
throws IOException {
|
||||
ECSchema rsSchema = new ECSchema("rs", 4, 2);
|
||||
String policyName = "RS-4-2-128k";
|
||||
int cellSize = 128 * 1024;
|
||||
ErasureCodingPolicy ecPolicy=
|
||||
new ErasureCodingPolicy(policyName,rsSchema,cellSize);
|
||||
String src = "/ecZone4-2";
|
||||
final Path ecDir = new Path(src);
|
||||
try {
|
||||
fs.mkdir(ecDir, FsPermission.getDirDefault());
|
||||
fs.getClient().setErasureCodingPolicy(src, ecPolicy);
|
||||
fail("HadoopIllegalArgumentException should be thrown for"
|
||||
+ "setting an invalid erasure coding policy");
|
||||
} catch (Exception e) {
|
||||
assertExceptionContains("Policy [ RS-4-2-128k ] does not match " +
|
||||
"any of the supported policies",e);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user