RivenSun created KAFKA-13689:
--------------------------------
Summary: AbstractConfig log print information is incorrect
Key: KAFKA-13689
URL: https://issues.apache.org/jira/browse/KAFKA-13689
Project: Kafka
Issue Type: Bug
Components: config
Affects Versions: 3.0.0
Reporter: RivenSun
Assignee: Luke Chen
h1. 1.Example
KafkaClient version is 3.1.0, KafkaProducer init properties:
{code:java}
Properties props = new Properties();
props.put(ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG, false);
props.put(ProducerConfig.TRANSACTION_TIMEOUT_CONFIG, 60003);{code}
Partial log of KafkaProducer initialization:
{code:java}
ssl.truststore.location = C:\Personal
File\documents\KafkaSSL\client.truststore.jks
ssl.truststore.password = [hidden]
ssl.truststore.type = JKS
transaction.timeout.ms = 60003
transactional.id = null
value.serializer = class
org.apache.kafka.common.serialization.StringSerializer[main] INFO
org.apache.kafka.common.security.authenticator.AbstractLogin - Successfully
logged in.
[main] WARN org.apache.kafka.clients.producer.ProducerConfig - The
configuration 'transaction.timeout.ms' was supplied but isn't a known config.
[main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka version: 3.1.0
[main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka commitId:
37edeed0777bacb3
[main] INFO org.apache.kafka.common.utils.AppInfoParser - Kafka startTimeMs:
1645602332999 {code}
>From the above log, you can see that KafkaProducer has applied the user's
>configuration, {*}transaction.timeout.ms=60003{*}, the default value of this
>configuration is 60000.
But we can see another line of log:
[main] WARN org.apache.kafka.clients.producer.ProducerConfig - The
configuration *'transaction.timeout.ms'* was supplied but isn't a
*{color:#FF0000}known{color}* config.
h1. 2.RootCause:
1) ProducerConfig.ENABLE_IDEMPOTENCE_CONFIG is set to {*}false{*}.
So the configurations related to the KafkaProducer transaction will not be
requested.
See the source code: KafkaProducer#configureTransactionState(...) .
2) AbstractConfig#logUnused() -> AbstractConfig#unused()
{code:java}
public Set<String> unused() {
Set<String> keys = new HashSet<>(originals.keySet());
keys.removeAll(used);
return keys;
} {code}
If a configuration has not been requested, the configuration will not be put
into the used variable. SourceCode see as below:
AbstractConfig#get(String key)
{code:java}
protected Object get(String key) {
if (!values.containsKey(key))
throw new ConfigException(String.format("Unknown configuration '%s'",
key));
used.add(key);
return values.get(key);
} {code}
h1.
Solution:
1. AbstractConfig#logUnused() method
Modify the log printing information of this method,and the unused configuration
log print level can be changed to {*}INFO{*}, what do you think?
{code:java}
/**
* Log infos for any unused configurations
*/
public void logUnused() { for (String key : unused())
log.info("The configuration '{}' was supplied but isn't a used
config.", key);
}{code}
2. AbstractConfig provides two new methods: logUnknown() and unknown()
{code:java}
/**
* Log warnings for any unknown configurations
*/
public void logUnknown() {
for (String key : unknown())
log.warn("The configuration '{}' was supplied but isn't a known
config.", key);
} {code}
{code:java}
public Set<String> unknown() {
Set<String> keys = new HashSet<>(originals.keySet());
keys.removeAll(values.keySet());
return keys;
} {code}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)