Description
When a group of Kafka clients includes more than one embedded protocol in its JoinGroupRequest along with its metadata, the group membership protocol defines that the protocol which is supported by all the members of a group is selected, and if more than one protocols are supported by all the members the protocol is selected based on the order of preference as defined in the JoinGroupRequest.
A recent change from type List to type Set for storing the set of supported embedded protocols in the JoinGroupRequest combined with the old type of handling with implicit types in the scala code, has introduced non-determinism in the selection of the embedded protocol by the GroupCoordinator, even though the underlying type of the Set in use is a variant of LinkedHashSet (it respects order).
The relevant code is:
// KafkaApis.scala
val protocols = joinGroupRequest.data().protocols().asScala.map(protocol =>
(protocol.name, protocol.metadata)).toList