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)