Chris Egerton created KAFKA-15436: ------------------------------------- Summary: Custom ConfigDef validators are invoked with null when user-provided value does not match type Key: KAFKA-15436 URL: https://issues.apache.org/jira/browse/KAFKA-15436 Project: Kafka Issue Type: Bug Reporter: Chris Egerton
Filed in response to [discussion on a tangentially-related PR|https://github.com/apache/kafka/pull/14304#discussion_r1310039190]. h3. Background The [ConfigDef.Validator interface|https://kafka.apache.org/35/javadoc/org/apache/kafka/common/config/ConfigDef.Validator.html] can be used to add custom per-property validation logic to a [ConfigDef|https://kafka.apache.org/35/javadoc/org/apache/kafka/common/config/ConfigDef.html] instance. This can serve many uses, including but not limited to: * Ensuring that the value for a string property matches the name of a Java enum type * Ensuring that the value for an integer property falls within the range of valid port numbers * Ensuring that the value for a class property has a public, no-args constructor and/or implements a certain interface This validation logic can be invoked directly via [ConfigDef::validate|https://kafka.apache.org/35/javadoc/org/apache/kafka/common/config/ConfigDef.html#validate(java.util.Map)] or [ConfigDef::validateAll|https://kafka.apache.org/35/javadoc/org/apache/kafka/common/config/ConfigDef.html#validateAll(java.util.Map)], or indirectly when instantiating an [AbstractConfig|https://kafka.apache.org/35/javadoc/org/apache/kafka/common/config/AbstractConfig.html]. When a value is validated by a {{ConfigDef}} instance, the {{ConfigDef}} first verifies that the value adheres to the expected type. For example, if the "raw" value is the string {{"345"}} and the property is defined with the [INT type|https://kafka.apache.org/35/javadoc/org/apache/kafka/common/config/ConfigDef.Type.html#INT], then the value is valid (it is parsed as the integer {{{}345{}}}). However, if the same raw value is used for a property defined with the [BOOLEAN type|https://kafka.apache.org/35/javadoc/org/apache/kafka/common/config/ConfigDef.Type.html#BOOLEAN], then the value is invalid (it cannot be parsed as a boolean). h3. Problem When a raw value is invalid for the type of the property it is used for (e.g., {{"345"}} is used for a property defined with the [BOOLEAN type|https://kafka.apache.org/35/javadoc/org/apache/kafka/common/config/ConfigDef.Type.html#BOOLEAN]), custom validators for the property are still invoked, with a value of {{{}null{}}}. This can lead to some counterintuitive behavior, and may necessitate that implementers of the {{ConfigDef.Validator}} interface catch cases where the value is {{null}} and choose not to report any errors (with the assumption that an error will already be reported by the {{ConfigDef}} regarding its failure to parse the raw value with the expected type). We may consider skipping custom validation altogether when the raw value for a property cannot be parsed with the expected type. On the other hand, it's unclear if there are compatibility concerns about this kind of change. If we decide to change this behavior, we should try to assess which code paths may lead to custom validators being invoked, which use cases correspond to which of these code paths, and whether this behavioral change has a chance to negatively impact these use cases. -- This message was sent by Atlassian Jira (v8.20.10#820010)