{"record":{"id":"515a579a4564a404","repo":"apache/hadoop","slug":"illegal-configuration-value-for-dfs-client-block-w","errorCode":null,"errorMessage":"Illegal configuration value for dfs.client.block.write.replace-datanode-on-failure.policy: ${policy}","messagePattern":"Illegal configuration value for dfs\\.client\\.block\\.write\\.replace-datanode-on-failure\\.policy: (.+?)","errorType":"exception","errorClass":"HadoopIllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/datatransfer/ReplaceDatanodeOnFailure.java","lineNumber":170,"sourceCode":"\n  private static Policy getPolicy(final Configuration conf) {\n    final boolean enabled = conf.getBoolean(\n        HdfsClientConfigKeys.BlockWrite.ReplaceDatanodeOnFailure.ENABLE_KEY,\n        HdfsClientConfigKeys.BlockWrite.ReplaceDatanodeOnFailure.ENABLE_DEFAULT);\n    if (!enabled) {\n      return Policy.DISABLE;\n    }\n\n    final String policy = conf.get(\n        HdfsClientConfigKeys.BlockWrite.ReplaceDatanodeOnFailure.POLICY_KEY,\n        HdfsClientConfigKeys.BlockWrite.ReplaceDatanodeOnFailure.POLICY_DEFAULT);\n    for(int i = 1; i < Policy.values().length; i++) {\n      final Policy p = Policy.values()[i];\n      if (p.name().equalsIgnoreCase(policy)) {\n        return p;\n      }\n    }\n    throw new HadoopIllegalArgumentException(\"Illegal configuration value for \"\n        + HdfsClientConfigKeys.BlockWrite.ReplaceDatanodeOnFailure.POLICY_KEY\n        + \": \" + policy);\n  }\n\n  /** Write the setting to configuration. */\n  public static void write(final Policy policy,\n      final boolean bestEffort, final Configuration conf) {\n    conf.setBoolean(\n        HdfsClientConfigKeys.BlockWrite.ReplaceDatanodeOnFailure.ENABLE_KEY,\n        policy != Policy.DISABLE);\n    conf.set(\n        HdfsClientConfigKeys.BlockWrite.ReplaceDatanodeOnFailure.POLICY_KEY,\n        policy.name());\n    conf.setBoolean(\n        HdfsClientConfigKeys.BlockWrite.ReplaceDatanodeOnFailure.BEST_EFFORT_KEY,\n        bestEffort);\n  }\n}","sourceCodeStart":152,"sourceCodeEnd":188,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/datatransfer/ReplaceDatanodeOnFailure.java#L152-L188","documentation":"ReplaceDatanodeOnFailure.get(Configuration) parses dfs.client.block.write.replace-datanode-on-failure.policy by matching the string case-insensitively against the Policy enum values, skipping DISABLE (values()[0], which is only produced when enable=false). Any string that is not DEFAULT, NEVER or ALWAYS throws HadoopIllegalArgumentException eagerly, before any cluster contact.","triggerScenarios":"Setting dfs.client.block.write.replace-datanode-on-failure.policy to a value outside {DEFAULT, NEVER, ALWAYS}: the literal 'DISABLE' (invalid - disabling is done via the enable flag), typos like 'defualt', or stray whitespace. Fails on first use of the configuration in the client write path.","commonSituations":"Config template typos; users writing policy=DISABLE expecting to switch the feature off; copy-paste artifacts or XML entities introducing stray characters into the value.","solutions":["Set the property to DEFAULT, NEVER or ALWAYS (case-insensitive), or delete it to fall back to the DEFAULT default","To disable the feature use dfs.client.block.write.replace-datanode-on-failure.enable=false - never policy=DISABLE","Re-check for typos and surrounding whitespace if the value looks correct"],"exampleFix":"<!-- before -->\n<property>\n  <name>dfs.client.block.write.replace-datanode-on-failure.policy</name>\n  <value>DISABLE</value>\n</property>\n\n<!-- after: disabling is done via the enable flag -->\n<property>\n  <name>dfs.client.block.write.replace-datanode-on-failure.enable</name>\n  <value>false</value>\n</property>","handlingStrategy":"validation","validationCode":"String v = conf.getTrimmed(\n    \"dfs.client.block.write.replace-datanode-on-failure.policy\", \"DEFAULT\");\nSet<String> allowed = new HashSet<>(Arrays.asList(\"DEFAULT\", \"NEVER\", \"ALWAYS\"));\nif (!allowed.contains(v.toUpperCase(Locale.ROOT))) {\n  throw new IllegalArgumentException(\n      \"Invalid replace-datanode-on-failure policy: \" + v);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never write policy=DISABLE - use dfs.client.block.write.replace-datanode-on-failure.enable=false","Lint enum-valued HDFS client configs in CI before deployment"],"tags":["hdfs","configuration","fail-fast","client-startup"],"backgroundTag":"invalid-config-value","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-22T20:17:22.307Z"}