{"record":{"id":"a2177d3db38379f3","repo":"grpc/grpc-java","slug":"unknown-denominator-type","errorCode":null,"errorMessage":"Unknown denominator type: ","messagePattern":"Unknown denominator type: ","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"xds/src/main/java/io/grpc/xds/internal/MatcherParser.java","lineNumber":161,"sourceCode":"  }\n\n  /** Translates envoy proto FractionalPercent to internal FractionMatcher. */\n  public static Matchers.FractionMatcher parseFractionMatcher(\n      io.envoyproxy.envoy.type.v3.FractionalPercent proto) {\n    int denominator;\n    switch (proto.getDenominator()) {\n      case HUNDRED:\n        denominator = 100;\n        break;\n      case TEN_THOUSAND:\n        denominator = 10_000;\n        break;\n      case MILLION:\n        denominator = 1_000_000;\n        break;\n      case UNRECOGNIZED:\n      default:\n        throw new IllegalArgumentException(\"Unknown denominator type: \" + proto.getDenominator());\n    }\n    return Matchers.FractionMatcher.create(proto.getNumerator(), denominator);\n  }\n}\n","sourceCodeStart":143,"sourceCodeEnd":166,"githubUrl":"https://github.com/grpc/grpc-java/blob/64daddc1f3d1975670f769f3e97bde8b2ba32d25/xds/src/main/java/io/grpc/xds/internal/MatcherParser.java#L143-L166","documentation":"parseFractionMatcher maps the Envoy FractionalPercent denominator (HUNDRED, TEN_THOUSAND, MILLION) to an integer divisor; UNRECOGNIZED or unknown denominator values trigger this IllegalArgumentException. The runtime_fraction config references a denominator type the client cannot map.","triggerScenarios":"A FractionalPercent proto in runtime_fraction config has denominator set to UNRECOGNIZED (invalid wire value) or a case unknown to this parser version.","commonSituations":"Corrupted or hand-edited config with an out-of-range enum; control plane built against a newer Envoy API adding denominator cases; protobuf decode of a bad wire value yielding UNRECOGNIZED.","solutions":["Fix the denominator in the xDS config to a valid value: HUNDRED, TEN_THOUSAND, or MILLION","Upgrade grpc-xds if a legitimately new denominator case is in use","Validate enum fields on the management server before emitting config","Check for proto wire corruption between control plane and client"],"exampleFix":"// before\n{\"numerator\":10,\"denominator\":\"UNRECOGNIZED\"}\n// after\n{\"numerator\":10,\"denominator\":\"HUNDRED\"}","handlingStrategy":"validation","validationCode":"int d = proto.getDenominatorValue();\nif (d != 0 && d != 1 && d != 2) { reject(\"invalid denominator\"); } // HUNDRED, TEN_THOUSAND, MILLION","typeGuard":"null","tryCatchPattern":"try { fm = MatcherParser.parseFractionMatcher(proto); }\ncatch (IllegalArgumentException e) { log.error(\"Bad denominator: \" + e.getMessage()); useDefaultFraction(); }","preventionTips":["Only emit HUNDRED/TEN_THOUSAND/MILLION denominators","Validate proto enums at the control plane","Check for wire corruption between producer and consumer"],"tags":["xds","config","enum","envoy"],"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-17T15:17:12.973Z"}