/** * Lists all (enabled, disabled and removed) erasure coding policies registered in HDFS. * @return a list of erasure coding policies */ @Override public List<HdfsFileErasureCodingPolicy> getAllErasureCodingPolicies() throws IOException { ErasureCodingPolicyInfo[] erasureCodingPolicies = hdfsAdmin.getErasureCodingPolicies(); List<HdfsFileErasureCodingPolicy> policies = new ArrayList<>(erasureCodingPolicies.length); for (ErasureCodingPolicyInfo erasureCodingPolicy : erasureCodingPolicies) { policies.add(new HdfsFileErasureCodingPolicyImpl(erasureCodingPolicy.getPolicy().getName(), erasureCodingPolicy.getState().toString())); } return policies; }
/** * Get a {@link ErasureCodingPolicy} by policy ID, including system policy * and user defined policy. * @return ecPolicy, or null if not found */ public ErasureCodingPolicy getByID(byte id) { final ErasureCodingPolicyInfo ecpi = getPolicyInfoByID(id); if (ecpi == null) { return null; } return ecpi.getPolicy(); }
/** * Get a {@link ErasureCodingPolicy} by policy name, including system * policy and user defined policy. * @return ecPolicy, or null if not found */ public ErasureCodingPolicy getByName(String name) { final ErasureCodingPolicyInfo ecpi = getPolicyInfoByName(name); if (ecpi == null) { return null; } return ecpi.getPolicy(); }
@VisibleForTesting public List<ErasureCodingPolicy> getRemovedPolicies() { ArrayList<ErasureCodingPolicy> removedPolicies = new ArrayList<>(); for (ErasureCodingPolicyInfo info : policiesByName.values()) { final ErasureCodingPolicy ecPolicy = info.getPolicy(); if (info.isRemoved()) { removedPolicies.add(ecPolicy); } } return removedPolicies; }
/** * Enable an erasure coding policy by policyName. */ public synchronized boolean enablePolicy(String name) { final ErasureCodingPolicyInfo info = policiesByName.get(name); if (info == null) { throw new HadoopIllegalArgumentException("The policy name " + name + " does not exist"); } if (enabledPoliciesByName.containsKey(name)) { return false; } final ErasureCodingPolicy ecPolicy = info.getPolicy(); enabledPoliciesByName.put(name, ecPolicy); info.setState(ErasureCodingPolicyState.ENABLED); enabledPolicies = enabledPoliciesByName.values().toArray(new ErasureCodingPolicy[0]); LOG.info("Enable the erasure coding policy " + name); return true; }
/** * Remove an User erasure coding policy by policyName. */ public synchronized void removePolicy(String name) { final ErasureCodingPolicyInfo info = policiesByName.get(name); if (info == null) { throw new HadoopIllegalArgumentException("The policy name " + name + " does not exist"); } final ErasureCodingPolicy ecPolicy = info.getPolicy(); if (ecPolicy.isSystemPolicy()) { throw new HadoopIllegalArgumentException("System erasure coding policy " + name + " cannot be removed"); } if (enabledPoliciesByName.containsKey(name)) { enabledPoliciesByName.remove(name); enabledPolicies = enabledPoliciesByName.values().toArray(new ErasureCodingPolicy[0]); } info.setState(ErasureCodingPolicyState.REMOVED); LOG.info("Remove erasure coding policy " + name); /* * TODO HDFS-12405 postpone the delete removed policy to Namenode restart * time. * */ }
/** * Load an erasure coding policy into erasure coding manager. */ private void loadPolicy(ErasureCodingPolicyInfo info) { Preconditions.checkNotNull(info); final ErasureCodingPolicy policy = info.getPolicy(); if (!CodecUtil.hasCodec(policy.getCodecName()) || policy.getCellSize() > maxCellSize) { // If policy is not supported in current system, set the policy state to // DISABLED; info.setState(ErasureCodingPolicyState.DISABLED); } this.policiesByName.put(policy.getName(), info); this.policiesByID.put(policy.getId(), info); if (info.isEnabled()) { enablePolicy(policy.getName()); } }
private void dumpErasureCodingPolicy(ErasureCodingPolicyInfo ecPolicyInfo) { ErasureCodingPolicy ecPolicy = ecPolicyInfo.getPolicy(); out.println("<" + ERASURE_CODING_SECTION_POLICY + ">"); o(ERASURE_CODING_SECTION_POLICY_ID, ecPolicy.getId()); o(ERASURE_CODING_SECTION_POLICY_NAME, ecPolicy.getName()); o(ERASURE_CODING_SECTION_POLICY_CELL_SIZE, ecPolicy.getCellSize()); o(ERASURE_CODING_SECTION_POLICY_STATE, ecPolicyInfo.getState()); out.println("<" + ERASURE_CODING_SECTION_SCHEMA + ">"); ECSchema schema = ecPolicy.getSchema(); o(ERASURE_CODING_SECTION_SCHEMA_CODEC_NAME, schema.getCodecName()); o(ERASURE_CODING_SECTION_SCHEMA_DATA_UNITS, schema.getNumDataUnits()); o(ERASURE_CODING_SECTION_SCHEMA_PARITY_UNITS, schema.getNumParityUnits()); if (schema.getExtraOptions().size() > 0) { out.println("<" + ERASURE_CODING_SECTION_SCHEMA_OPTIONS + ">"); for (Map.Entry<String, String> option : schema.getExtraOptions().entrySet()) { out.println("<" + ERASURE_CODING_SECTION_SCHEMA_OPTION + ">"); o(ERASURE_CODING_SECTION_SCHEMA_OPTION_KEY, option.getKey()); o(ERASURE_CODING_SECTION_SCHEMA_OPTION_VALUE, option.getValue()); out.println("</" + ERASURE_CODING_SECTION_SCHEMA_OPTION + ">"); } out.println("</" + ERASURE_CODING_SECTION_SCHEMA_OPTIONS + ">"); } out.println("</" + ERASURE_CODING_SECTION_SCHEMA + ">"); out.println("</" + ERASURE_CODING_SECTION_POLICY + ">\n"); }
policy.getSchema(), policy.getCellSize()); for (ErasureCodingPolicyInfo info : getPolicies()) { final ErasureCodingPolicy p = info.getPolicy(); if (p.getName().equals(assignedNewName)) { LOG.info("The policy name " + assignedNewName + " already exists");
/** * Convert a {@link ErasureCodingPolicyInfo} to protobuf. * The protobuf will have the policy, and state. State is relevant when: * 1. Persisting a policy to fsimage * 2. Returning the policy to the RPC call * {@link DistributedFileSystem#getAllErasureCodingPolicies()} */ public static ErasureCodingPolicyProto convertErasureCodingPolicy( ErasureCodingPolicyInfo info) { final ErasureCodingPolicyProto.Builder builder = createECPolicyProtoBuilder(info.getPolicy()); builder.setState(convertECState(info.getState())); return builder.build(); }