You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jira@kafka.apache.org by "RivenSun (Jira)" <ji...@apache.org> on 2022/02/23 08:26:00 UTC

[jira] [Updated] (KAFKA-13689) AbstractConfig log print information is incorrect

     [ https://issues.apache.org/jira/browse/KAFKA-13689?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

RivenSun updated KAFKA-13689:
-----------------------------
    Description: 
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.  
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}
 

 

 

  was:
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}
 

 

 


> 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
>            Priority: Major
>
> 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.  
> 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)