DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
...
This KIP provides a simple solution to an availability issue exposed by the auto-join feature proposed in KIP-853 and how AddRaftVoterRequest RPC is currently handled. The problem is because the active controller does not send a response to complete the AddRaftVoterRequest until after the new voter set is committed, and that KRaft (and Kafka in general) only support one in-flight request to a node. Consider the following scenario:
Some controller A that is automatically joining by sending the AddRaftVoterRequest RPC is the same controller whose Fetch is needed to commit the new voter set. A clear example of this is when bootstrapping with --standalone and having controllers auto-join, as the first controller to auto-join will increase the voter set size from 1 to 2. The active controller needs controller A to complete a Fetch RPC to complete the AddRaftVoterRequest RPC, but controller A cannot send a FetchRequest until its AddRaftVoterRequest returns or times out. However, this case also applies when The general case being described here is going from a voter set of size X to size X + 1, where a minority of X + 1 nodes from the new voter set are unavailable.
The reason this scenario causes unavailability is as follows: the current in-flight request for controller A is the AddRaftVoterRequest RPC, which cannot complete until after controller A first replicates the new voter set, and sends another fetch to the leader. This state will expire the leader's checkQuorumTimer and cause it to resign, since the majority of nodes (which includes controller A) will not be able to fetch in time. Thus, the current implementation of AddRaftVoterRequest will cause an unnecessary leadership failover and election when running the auto-join feature.
...
This change is sufficient because the main motivation behind not completing the RPC until the new voter set was committed was for an intuitive UX for the operator, since adding voters was done manually. The inactive observer controllers that send AddRaftVoterRequest as a part of auto-join do not care if the new voter set was committed, since they will retry the request on a timer until it completes successfully.
...