Hi Andrew and all,

I looked deeper into the code [1] and it seems the Metadata class is OK with 
cluster ID changing. So I'm thinking that the rebootstrapping shouldn't 
introduce a new failure mode here. And I should remove the mention of this 
cluster ID checks from the KIP.

Best,
Ivan

[1] 
https://github.com/apache/kafka/blob/ff90f78c700c582f9800013faad827c36b45ceb7/clients/src/main/java/org/apache/kafka/clients/Metadata.java#L355

On Tue, Apr 9, 2024, at 09:28, Andrew Schofield wrote:
> Hi Ivan,
> Thanks for the KIP. I can see situations in which this would be helpful. I 
> have one question.
> 
> The KIP says the client checks the cluster ID when it re-bootstraps and that 
> it will fail if the
> cluster ID doesn’t match the previously known one. How does it fail? Which 
> exception does
> it throw and when?
> 
> In a similar vein, now that we are checking cluster IDs, I wonder if it could 
> be extended to
> cover all situations in which there are cluster ID mismatches, such as the 
> bootstrap server
> list erroneously pointing at brokers from different clusters and the problem 
> only being
> detectable later on.
> 
> Thanks,
> Andrew
> 
> > On 8 Apr 2024, at 18:24, Ivan Yurchenko <i...@ivanyu.me> wrote:
> > 
> > Hello!
> > 
> > I changed the KIP a bit, specifying that the certain benefit goes to 
> > consumers not participating in a group, but that other clients can benefit 
> > as well in certain situations.
> > 
> > You can see the changes in the history [1]
> > 
> > Thank you!
> > 
> > Ivan
> > 
> > [1] 
> > https://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=240881396&originalVersion=10&revisedVersion=11
> > 
> > On 2023/07/15 16:37:52 Ivan Yurchenko wrote:
> >> Hello!
> >> 
> >> I've made several changes to the KIP based on the comments:
> >> 
> >> 1. Reduced the scope to producer and consumer clients only.
> >> 2. Added more details to the description of the rebootstrap process.
> >> 3. Documented the role of low values of reconnect.backoff.max.ms in
> >> preventing rebootstrapping.
> >> 4. Some wording changes.
> >> 
> >> You can see the changes in the history [1]
> >> 
> >> I'm planning to put the KIP to a vote in some days if there are no new
> >> comments.
> >> 
> >> Thank you!
> >> 
> >> Ivan
> >> 
> >> [1]
> >> https://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=240881396&selectedPageVersions=9&selectedPageVersions=5
> >> 
> >> On Tue, 30 May 2023 at 08:23, Ivan Yurchenko <iv...@gmail.com>
> >> wrote:
> >> 
> >>> Hi Chris and all,
> >>> 
> >>>> I believe the logic you've linked is only applicable for the producer and
> >>>> consumer clients; the admin client does something different (see [1]).
> >>> 
> >>> I see, thank you for the pointer. It seems the admin client is fairly
> >>> different from the producer and consumer. Probably it makes sense to 
> >>> reduce
> >>> the scope of the KIP to the producer and consumer clients only.
> >>> 
> >>>> it'd be nice to have a definition of when re-bootstrapping
> >>>> would occur that doesn't rely on internal implementation details. What
> >>>> user-visible phenomena can we identify that would lead to a
> >>>> re-bootstrapping?
> >>> 
> >>> Let's put it this way: "Re-bootstrapping means that the client forgets
> >>> about nodes it knows about and falls back on the bootstrap nodes as if it
> >>> had just been initialized. Re-bootstrapping happens when, during a 
> >>> metadata
> >>> update (which may be scheduled by `metadata.max.age.ms` or caused by
> >>> certain error responses like NOT_LEADER_OR_FOLLOWER, 
> >>> REPLICA_NOT_AVAILABLE,
> >>> etc.), the client doesn't have a node with an established connection or
> >>> establishable connection."
> >>> Does this sound good?
> >>> 
> >>>> I also believe that if someone has "
> >>>> reconnect.backoff.max.ms" set to a low-enough value,
> >>>> NetworkClient::leastLoadedNode may never return null. In that case,
> >>>> shouldn't we still attempt a re-bootstrap at some point (if the user has
> >>>> enabled this feature)?
> >>> 
> >>> Yes, you're right. Particularly `canConnect` here [1] can always be
> >>> returning `true` if `reconnect.backoff.max.ms` is low enough.
> >>> It seems pretty difficult to find a good criteria when re-bootstrapping
> >>> should be forced in this case, so it'd be difficult to configure and 
> >>> reason
> >>> about. I think it's worth mentioning in the KIP and later in the
> >>> documentation, but we should not try to do anything special here.
> >>> 
> >>>> Would it make sense to re-bootstrap only after "
> >>>> metadata.max.age.ms" has elapsed since the last metadata update, and
> >>> when
> >>>> at least one request has been made to contact each known server and been
> >>>> met with failure?
> >>> 
> >>> The first condition is satisfied by the check in the beginning of
> >>> `maybeUpdate` [2].
> >>> It seems to me, the second one is also satisfied by `leastLoadedNode`.
> >>> Admittedly, it's more relaxed than you propose: it tracks unavailability 
> >>> of
> >>> nodes that was detected by all types of requests, not only by metadata
> >>> requests.
> >>> What do you think, would this be enough?
> >>> 
> >>> [1]
> >>> https://github.com/apache/kafka/blob/c9a42c85e2c903329b3550181d230527e90e3646/clients/src/main/java/org/apache/kafka/clients/NetworkClient.java#L698
> >>> [2]
> >>> https://github.com/apache/kafka/blob/c9a42c85e2c903329b3550181d230527e90e3646/clients/src/main/java/org/apache/kafka/clients/NetworkClient.java#L1034-L1041
> >>> 
> >>> Best,
> >>> Ivan
> >>> 
> >>> 
> >>> On Tue, 21 Feb 2023 at 20:07, Chris Egerton <ch...@aiven.io.invalid>
> >>> wrote:
> >>> 
> >>>> Hi Ivan,
> >>>> 
> >>>> I believe the logic you've linked is only applicable for the producer and
> >>>> consumer clients; the admin client does something different (see [1]).
> >>>> 
> >>>> Either way, it'd be nice to have a definition of when re-bootstrapping
> >>>> would occur that doesn't rely on internal implementation details. What
> >>>> user-visible phenomena can we identify that would lead to a
> >>>> re-bootstrapping? I also believe that if someone has "
> >>>> reconnect.backoff.max.ms" set to a low-enough value,
> >>>> NetworkClient::leastLoadedNode may never return null. In that case,
> >>>> shouldn't we still attempt a re-bootstrap at some point (if the user has
> >>>> enabled this feature)? Would it make sense to re-bootstrap only after "
> >>>> metadata.max.age.ms" has elapsed since the last metadata update, and when
> >>>> at least one request has been made to contact each known server and been
> >>>> met with failure?
> >>>> 
> >>>> [1] -
> >>>> 
> >>>> https://github.com/apache/kafka/blob/c9a42c85e2c903329b3550181d230527e90e3646/clients/src/main/java/org/apache/kafka/clients/admin/internals/AdminMetadataManager.java#L100
> >>>> 
> >>>> Cheers,
> >>>> 
> >>>> Chris
> >>>> 
> >>>> On Sun, Feb 19, 2023 at 3:39 PM Ivan Yurchenko <iv...@gmail.com>
> >>>> wrote:
> >>>> 
> >>>>> Hi Chris,
> >>>>> 
> >>>>> Thank you for your question. As a part of various lifecycle phases
> >>>>> (including node disconnect), NetworkClient can request metadata update
> >>>>> eagerly (the `Metadata.requestUpdate` method), which results in
> >>>>> `MetadataUpdater.maybeUpdate` being called during next poll. Inside, it
> >>>> has
> >>>>> a way to find a known node it can connect to for the fresh metadata. If
> >>>> no
> >>>>> such node is found, it backs off. (Code [1]). I'm thinking of
> >>>> piggybacking
> >>>>> on this logic and injecting the rebootstrap attempt before the backoff.
> >>>>> 
> >>>>> As of the second part of you question: the re-bootstrapping means
> >>>> replacing
> >>>>> the node addresses in the client with the original bootstrap addresses,
> >>>> so
> >>>>> if the first bootstrap attempt fails, the client will continue using the
> >>>>> bootstrap addresses until success -- pretty much as if it were recreated
> >>>>> from scratch.
> >>>>> 
> >>>>> Best,
> >>>>> Ivan
> >>>>> 
> >>>>> [1]
> >>>>> 
> >>>>> 
> >>>> https://github.com/apache/kafka/blob/trunk/clients/src/main/java/org/apache/kafka/clients/NetworkClient.java#L1045-L1049
> >>>>> 
> >>>>> On Thu, 16 Feb 2023 at 17:18, Chris Egerton <ch...@aiven.io.invalid>
> >>>>> wrote:
> >>>>> 
> >>>>>> Hi Ivan,
> >>>>>> 
> >>>>>> I'm not very familiar with the clients side of things but the proposal
> >>>>>> seems reasonable.
> >>>>>> 
> >>>>>> I like the flexibility of the "metadata.recovery.strategy" property
> >>>> as a
> >>>>>> string instead of, e.g., a "rebootstrap.enabled" boolean. We may want
> >>>> to
> >>>>>> adapt a different approach in the future, like the background thread
> >>>>>> mentioned in the rejected alternatives section.
> >>>>>> 
> >>>>>> I also like handling this via configuration property instead of
> >>>> adding a
> >>>>>> Java-level API or suggesting that users re-instantiate their clients
> >>>>> since
> >>>>>> we may want to enable this new behavior by default in the future, and
> >>>> it
> >>>>>> also reduces the level of effort required for users to benefit from
> >>>> this
> >>>>>> improvement.
> >>>>>> 
> >>>>>> One question I have--that may have an obvious answer to anyone more
> >>>>>> familiar with client internals--is under which conditions we will
> >>>>> determine
> >>>>>> a rebootstrap is appropriate. Taking the admin client as an example,
> >>>> the
> >>>>> "
> >>>>>> default.api.timeout.ms" property gives us a limit on the time an
> >>>>> operation
> >>>>>> will be allowed to take before it completes or fails (with optional
> >>>>>> per-request overrides in the various *Options classes), and the "
> >>>>>> request.timeout.ms" property gives us a limit on the time each
> >>>> request
> >>>>>> issued for that operation will be allowed to take before it
> >>>> completes, is
> >>>>>> retried, or causes the operation to fail (if no more retries can be
> >>>>>> performed). If all of the known servers (i.e., bootstrap servers for
> >>>> the
> >>>>>> first operation, or discovered brokers if bootstrapping has already
> >>>> been
> >>>>>> completed) are unavailable, the admin client will keep (re)trying to
> >>>>> fetch
> >>>>>> metadata until the API timeout is exhausted, issuing multiple
> >>>> requests to
> >>>>>> the same server if necessary. When would a re-bootstrapping occur
> >>>> here?
> >>>>>> Ideally we could find some approach that minimizes false positives
> >>>>> (where a
> >>>>>> re-bootstrapping is performed even though the current set of known
> >>>>> brokers
> >>>>>> is only temporarily unavailable, as opposed to permanently moved). Of
> >>>>>> course, given the opt-in nature of the re-bootstrapping feature, we
> >>>> can
> >>>>>> always shoot for "good enough" on that front, but, it'd be nice to
> >>>>>> understand some of the potential pitfalls of enabling it.
> >>>>>> 
> >>>>>> Following up on the above, would we cache the need to perform a
> >>>>>> re-bootstrap across separate operations? For example, if I try to
> >>>>> describe
> >>>>>> a cluster, then a re-bootstrapping takes place and fails, and then I
> >>>> try
> >>>>> to
> >>>>>> describe the cluster a second time. With that second attempt, would we
> >>>>>> immediately resort to the bootstrap servers for any initial metadata
> >>>>>> updates, or would we still try to go through the last-known set of
> >>>>> brokers
> >>>>>> first?
> >>>>>> 
> >>>>>> Cheers,
> >>>>>> 
> >>>>>> Chris
> >>>>>> 
> >>>>>> On Mon, Feb 6, 2023 at 4:32 AM Ivan Yurchenko <
> >>>> ivan0yurche...@gmail.com>
> >>>>>> wrote:
> >>>>>> 
> >>>>>>> Hi!
> >>>>>>> 
> >>>>>>> There seems to be not much more discussion going, so I'm planning to
> >>>>>> start
> >>>>>>> the vote in a couple of days.
> >>>>>>> 
> >>>>>>> Thanks,
> >>>>>>> 
> >>>>>>> Ivan
> >>>>>>> 
> >>>>>>> On Wed, 18 Jan 2023 at 12:06, Ivan Yurchenko <
> >>>> ivan0yurche...@gmail.com
> >>>>>> 
> >>>>>>> wrote:
> >>>>>>> 
> >>>>>>>> Hello!
> >>>>>>>> I would like to start the discussion thread on KIP-899: Allow
> >>>> clients
> >>>>>> to
> >>>>>>>> rebootstrap.
> >>>>>>>> This KIP proposes to allow Kafka clients to repeat the bootstrap
> >>>>>> process
> >>>>>>>> when fetching metadata if none of the known nodes are available.
> >>>>>>>> 
> >>>>>>>> 
> >>>>>>> 
> >>>>>> 
> >>>>> 
> >>>> https://cwiki.apache.org/confluence/display/KAFKA/KIP-899%3A+Allow+clients+to+rebootstrap
> >>>>>>>> 
> >>>>>>>> A question right away: should we eventually change the default
> >>>>> behavior
> >>>>>>> or
> >>>>>>>> it can remain configurable "forever"? The latter is proposed in
> >>>> the
> >>>>>> KIP.
> >>>>>>>> 
> >>>>>>>> Thank you!
> >>>>>>>> 
> >>>>>>>> Ivan
> >>>>>>>> 
> >>>>>>>> 
> >>>>>>>> 
> >>>>>>> 
> >>>>>> 
> >>>>> 
> >>>> 
> >>> 
> 
> 

Reply via email to