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

Ziyun Fu reassigned KAFKA-21408:
--------------------------------

    Assignee: Ziyun Fu

> Admin client metadata refresh uses a flat retry.backoff.ms when the response 
> lacks the node a pending call needs
> ----------------------------------------------------------------------------------------------------------------
>
>                 Key: KAFKA-21408
>                 URL: https://issues.apache.org/jira/browse/KAFKA-21408
>             Project: Kafka
>          Issue Type: Improvement
>          Components: admin
>            Reporter: Ziyun Fu
>            Assignee: Ziyun Fu
>            Priority: Minor
>
> When a metadata request fails, the admin client retries it with exponential 
> backoff and jitter, bounded by \{{retry.backoff.max.ms}} 
> ([KafkaAdminClient.java#L989|https://github.com/apache/kafka/blob/8e65883c1255f93361bbf29efa8425e30b40c5ec/clients/src/main/java/org/apache/kafka/clients/admin/KafkaAdminClient.java#L989]).
> There is no such backoff when the metadata request succeeds but the response 
> doesn't contain the node that a pending call needs. Examples are a call that 
> targets a specific broker id (such as \{{describeConfigs}} for a broker, or 
> \{{describeLogDirs}}) while that broker is not in the metadata, or a call 
> that needs the controller when none is present. The node provider requests 
> another metadata update and leaves the call pending 
> ([KafkaAdminClient.java#L822-L833|https://github.com/apache/kafka/blob/8e65883c1255f93361bbf29efa8425e30b40c5ec/clients/src/main/java/org/apache/kafka/clients/admin/KafkaAdminClient.java#L822-L833]).
>  \{{AdminMetadataManager}} then waits a fixed \{{retry.backoff.ms}} before 
> the next attempt 
> ([AdminMetadataManager.java#L298-L301|https://github.com/apache/kafka/blob/8e65883c1255f93361bbf29efa8425e30b40c5ec/clients/src/main/java/org/apache/kafka/clients/admin/internals/AdminMetadataManager.java#L298-L301]).
>  It doesn't take \{{retry.backoff.max.ms}} into account 
> ([KafkaAdminClient.java#L583-L586|https://github.com/apache/kafka/blob/8e65883c1255f93361bbf29efa8425e30b40c5ec/clients/src/main/java/org/apache/kafka/clients/admin/KafkaAdminClient.java#L583-L586]),
>  and the delay doesn't grow across attempts.
> As a result, the client sends a Metadata request every \{{retry.backoff.ms}} 
> (100 ms by default) until the pending call times out 
> (\{{default.api.timeout.ms}}, 60 s by default).
> The producer and consumer already back off exponentially in the equivalent 
> situation, where metadata responses succeed but make no progress 
> (\{{equivalentResponseCount}} in 
> [Metadata.java#L154-L168|https://github.com/apache/kafka/blob/8e65883c1255f93361bbf29efa8425e30b40c5ec/clients/src/main/java/org/apache/kafka/clients/Metadata.java#L154-L168]).
> h3. Suggested change
> When successive metadata responses don't change the cluster view, 
> \{{AdminMetadataManager}} should apply exponential backoff with jitter, 
> bounded by \{{retry.backoff.max.ms}}, to the next refresh. The backoff should 
> reset once a response makes progress. This matches the existing documentation 
> of \{{retry.backoff.max.ms}} and the behaviour of \{{Metadata}}, and needs no 
> new config.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to