{"record":{"id":"53492d0ed279b4dd","repo":"grpc/grpc-java","slug":"unknown-denominator-type-proto-getdenominator","errorCode":null,"errorMessage":"Unknown denominator type: ${proto.getDenominator()}","messagePattern":"Unknown denominator type: (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"xds/src/main/java/io/grpc/xds/FaultFilter.java","lineNumber":193,"sourceCode":"              Status.fromCodeValue(faultAbort.getGrpcStatus()), percent));\n        case ERRORTYPE_NOT_SET:\n        default:\n          return ConfigOrError.fromError(\n              \"Unknown error type case: \" + faultAbort.getErrorTypeCase());\n      }\n    }\n\n    private static FaultConfig.FractionalPercent parsePercent(FractionalPercent proto) {\n      switch (proto.getDenominator()) {\n        case HUNDRED:\n          return FaultConfig.FractionalPercent.perHundred(proto.getNumerator());\n        case TEN_THOUSAND:\n          return FaultConfig.FractionalPercent.perTenThousand(proto.getNumerator());\n        case MILLION:\n          return FaultConfig.FractionalPercent.perMillion(proto.getNumerator());\n        case UNRECOGNIZED:\n        default:\n          throw new IllegalArgumentException(\"Unknown denominator type: \" + proto.getDenominator());\n      }\n    }\n  }\n\n  @Nullable\n  @Override\n  public ClientInterceptor buildClientInterceptor(\n      FilterConfig config, @Nullable FilterConfig overrideConfig,\n      final ScheduledExecutorService scheduler) {\n    checkNotNull(config, \"config\");\n    if (overrideConfig != null) {\n      config = overrideConfig;\n    }\n    FaultConfig faultConfig = (FaultConfig) config;\n\n    final class FaultInjectionInterceptor implements ClientInterceptor {\n      @Override\n      public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(","sourceCodeStart":175,"sourceCodeEnd":211,"githubUrl":"https://github.com/grpc/grpc-java/blob/64daddc1f3d1975670f769f3e97bde8b2ba32d25/xds/src/main/java/io/grpc/xds/FaultFilter.java#L175-L211","documentation":"FaultFilter.parsePercent converts an Envoy core.FractionalPercent into FaultConfig.FractionalPercent and throws IllegalArgumentException when the denominator enum is not HUNDRED, TEN_THOUSAND, or MILLION — typically because the proto carried UNRECOUGHT/UNRECOGNIZED. The Java enum switch has no mapping for it, so parsing the fault-injection percentage fails.","triggerScenarios":"FaultDelay or FaultConfig percent field whose FractionalPercent.denominator is UNRECOGNIZED (e.g. proto from a newer/older schema) — reached via parsePercent from the percent parser while building fault filter config.","commonSituations":"Management server sends a fault filter with an unrecognized denominator value due to version skew; corrupted or hand-written LDS fault config.","solutions":["Set the fault config's percent denominator to HUNDRED, TEN_THOUSAND, or MILLION in the LDS response.","Check for control-plane/grpc-java version skew causing unrecognized enum values and align versions.","Inspect the raw LDS proto sent to the client to confirm the denominator value.","If you don't need fractional faults, specify a whole percent with denominator HUNDRED."],"exampleFix":"// before\n\"percent\": { \"numerator\": 1, \"denominator\": \"UNRECOGNIZED\" }\n// after\n\"percent\": { \"numerator\": 100, \"denominator\": \"HUNDRED\" }","handlingStrategy":"validation","validationCode":"String d = percent.getDenominator().toString();\nif (!d.equals(\"HUNDRED\") && !d.equals(\"TEN_THOUSAND\") && !d.equals(\"MILLION\")) {\n  throw new IllegalArgumentException(\"Unsupported denominator: \" + d);\n}","typeGuard":null,"tryCatchPattern":"try { /* build fault config */ } catch (IllegalArgumentException e) { log.error(\"fault percent invalid: {}\", e.getMessage()); }","preventionTips":["Only emit HUNDRED/TEN_THOUSAND/MILLION denominators from the control plane","Keep grpc-java and the management server versions aligned to avoid UNRECOGNIZED enum values","Inspect raw LDS protos when fault configs fail to parse"],"tags":["xds","fault-filter","enum","config-parsing"],"backgroundTag":"invalid-enum-value","analyzedSha":"64daddc1f3d1975670f769f3e97bde8b2ba32d25","analyzedAt":"2026-09-08T06:14:57.704Z","contentChangedAt":"2026-09-08T06:14:57.704Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}