...
The ControlRecordType
is TBD and will be updated when the code is commit to Kafka.
Code Block | ||
---|---|---|
| ||
{ "type": "data", "name": "AddVoterRecord", "validVersions": "0", "flexibleVersions": "0+", "fields": [ { "name": "Version", "type": "int16", "versions": "0+", "about": "The version of the add voter record"}, { "name": "VoterId", "type": "int32", "versions": "0+", "entityType": "brokerId", "about": "The ID of the voter getting added to the topic partition"}, { "name": "VoterUuid", "type": "uuid", "versions": "0+", "about": "The voter generated UUID of the voter getting added to the topic partition"}, { "name": "EndPoints", "type": "[]VoterEndpoint", "versions": "0+", "about": "The endpoints that can be used to communicate with the voter", "fields": [ { "name": "Name", "type": "string", "versions": "0+", "mapKey": true, "about": "The name of the endpoint." }, { "name": "Host", "type": "string", "versions": "0+", "about": "The hostname." }, { "name": "Port", "type": "uint16", "versions": "0+", "about": "The port." }, { "name": "SecurityProtocol", "type": "int16", "versions": "0+", "about": "The security protocol." } ]} ] } |
...
The ControlRecordType
is TBD and will be updated when the code is commit to Kafka.
Code Block | ||
---|---|---|
| ||
{ "type": "data", "name": "RemoveVoterRecord", "validVersions": "0", "flexibleVersions": "0+", "fields": [ { "name": "Version", "type": "int16", "versions": "0+", "about": "The version of the add voter record"}, { "name": "VoterId", "type": "int32", "versions": "0+", "entityType": "brokerId", "about": "The ID of the voter getting removed from the topic partition"}, { "name": "VoterUuid", "type": "uuid", "versions": "0+", "about": "The voter generated UUID of the voter getting removed from the topic partition"} ] } |
...
A new field called VoterUuid
will get added to the QuorumStateData
. Each KRaft replica will store a locally generated UUID in this field. The replica will generate and persist an UUID when it reads a version 0 of the QuorumStateData
or if the QuorumStateData
hasn't been persistent in the past.
Code Block | ||
---|---|---|
| ||
{ "type": "data", "name": "QuorumStateData", "validVersions": "0-1", "flexibleVersions": "0+", "fields": [ { "name": "ClusterId", "type": "string", "versions": "0+"}, { "name": "VoterUuid", "type" "uuid", "versions": "1+", "about": "The locally generated UUID for this voter.", { "name": "LeaderId", "type": "int32", "versions": "0+", "default": "-1"}, { "name": "LeaderEpoch", "type": "int32", "versions": "0+", "default": "-1"}, { "name": "VotedId", "type": "int32", "versions": "0+", "default": "-1"}, { "name": "AppliedOffset", "type": "int64", "versions": "0+"}, { "name": "CurrentVoters", "type": "[]Voter", "versions": "0+", "nullableVersions": "0+"} ], "commonStructs": [ { "name": "Voter", "versions": "0+", "fields": [ {"name": "VoterId", "type": "int32", "versions": "0+"} ]} ] } |
...
TODO: describe this
Code Block | ||
---|---|---|
| ||
{ "apiKey": "TBD", "type": "request", "listeners": ["controller", "broker"], "name": "AddVoterRequest", "validVersions": "0", "flexibleVersions": "0+", "fields": [ { "name": "ClusterId", "type": "string", "versions": "0+" } { "name": "Topics", "type": "[]TopicData", "versions": "0+", "fields": [ { "name": "TopicName", "type": "string", "versions": "0+", "entityType": "topicName", "about": "The name of the topic." }, { "name": "Partitions", "type": "[]PartitionData", "versions": "0+", "fields": [ { "name": "Index", "type": "int32", "versions": "0+", "about": "The partition index." }, { "name": "VoterId", "type": "int32", "versions": "0+", "about": "The ID of the voter getting added to the topic partition." }, { "name": "VoterUuid", "type": "uuid", "versions": "0+", "about": "The voter generated UUID of the voter getting added to the topic partition." }, { "name": "EndPoints", "type": "[]VoterEndpoint", "versions": "0+", "about": "The endpoints that can be used to communicate with the voter", "fields": [ { "name": "Name", "type": "string", "versions": "0+", "mapKey": true, "about": "The name of the endpoint." }, { "name": "Host", "type": "string", "versions": "0+", "about": "The hostname." }, { "name": "Port", "type": "uint16", "versions": "0+", "about": "The port." }, { "name": "SecurityProtocol", "type": "int16", "versions": "0+", "about": "The security protocol." } ]} ]} ]} ] } |
Response
Code Block | ||
---|---|---|
| ||
{ "apiKey": "TBD", "type": "response", "name": "AddVoterResponse", "validVersions": "0", "flexibleVersions": "0+", "fields": [ { "name": "ErrorCode", "type": "int16", "versions": "0+", "about": "The top level error code." } { "name": "Topics", "type": "[]TopicData", "versions": "0+", "fields": [ { "name": "TopicName", "type": "string", "versions": "0+", "entityType": "topicName", "about": "The name of the topic." }, { "name": "Partitions", "type": "[]PartitionData", "versions": "0+", "fields": [ { "name": "Index", "type": "int32", "versions": "0+", "about": "The partition index." }, { "name": "ErrorCode", "type": "int16", "versions": "0+", "about": "The error code, or 0 if there was no fetch error." }, { "name": "CurrentLeader", "type": "LeaderIdAndEpoch", "versions": "0+", "taggedVersions": "0+", "tag": 0, "fields": [ { "name": "LeaderId", "type": "int32", "versions": "12+", "default": "-1", "entityType" : "brokerId", "about": "The ID of the current leader or -1 if the leader is unknown." }, { "name": "LeaderEpoch", "type": "int32", "versions": "12+", "default": "-1", "about": "The latest known leader epoch"} ]} ]} ]} ] } |
...
TODO: describe this
Code Block | ||
---|---|---|
| ||
{ "apiKey": "TBD", "type": "request", "listeners": ["controller", "broker"], "name": "RemoveVoterRequest", "validVersions": "0", "flexibleVersions": "0+", "fields": [ { "name": "Topics", "type": "[]TopicData", "versions": "0+", "fields": [ { "name": "TopicName", "type": "string", "versions": "0+", "entityType": "topicName", "about": "The name of the topic." }, { "name": "Partitions", "type": "[]PartitionData", "versions": "0+", "fields": [ { "name": "Index", "type": "int32", "versions": "0+", "about": "The partition index." }, { "name": "VoterId", "type": "int32", "versions": "0+", "about": "The ID of the voter getting removed from the topic partition." }, { "name": "VoterUuid", "type": "uuid", "versions": "0+", "about": "The voter generated UUID of the voter getting remove from the topic partition." }, ]} ]} ] } |
Response
Code Block | ||
---|---|---|
| ||
{ "apiKey": "TBD", "type": "response", "name": "RemoveVoterResponse", "validVersions": "0", "flexibleVersions": "0+", "fields": [ { "name": "ErrorCode", "type": "int16", "versions": "0+", "about": "The top level error code." } { "name": "Topics", "type": "[]TopicData", "versions": "0+", "fields": [ { "name": "TopicName", "type": "string", "versions": "0+", "entityType": "topicName", "about": "The name of the topic." }, { "name": "Partitions", "type": "[]PartitionData", "versions": "0+", "fields": [ { "name": "Index", "type": "int32", "versions": "0+", "about": "The partition index." }, { "name": "ErrorCode", "type": "int16", "versions": "0+", "about": "The error code, or 0 if there was no fetch error." }, { "name": "CurrentLeader", "type": "LeaderIdAndEpoch", "versions": "0+", "taggedVersions": "0+", "tag": 0, "fields": [ { "name": "LeaderId", "type": "int32", "versions": "12+", "default": "-1", "entityType" : "brokerId", "about": "The ID of the current leader or -1 if the leader is unknown." }, { "name": "LeaderEpoch", "type": "int32", "versions": "12+", "default": "-1", "about": "The latest known leader epoch"} ]} ]} ]} ] } |
...
Version 14 adds the field ReplicaUuid. This field is populated with the replica generated UUID. If the ReplicaUuid and the ReplicaId fields are populated, the topic partition leader can assume that the replica supports becoming a voter.
Code Block | ||
---|---|---|
| ||
{ "apiKey": 1, "type": "request", "listeners": ["zkBroker", "broker", "controller"], "name": "FetchRequest", "validVersions": "0-14", "flexibleVersions": "12+", "fields": [ { "name": "ClusterId", "type": "string", "versions": "12+", "nullableVersions": "12+", "default": "null", "taggedVersions": "12+", "tag": 0, "ignorable": true, "about": "The clusterId if known. This is used to validate metadata fetches prior to broker registration." }, { "name": "ReplicaId", "type": "int32", "versions": "0+", "entityType": "brokerId", "about": "The replica ID of the follower, of -1 if this request is from a consumer." }, { "name": "ReplicaUuid", "type": "uuid", "versions": "14+", "nullableVersions": "14+", "default": "null", "about": "The replica generated UUID. null otherwise." }, ... ] } |
...
Version 1 adds the field ReplicaUuid. If the ReplicaUuid and the ReplicaId fields are populated, the topic partition leader can assume that the replica supports become a leader.
Code Block | ||
---|---|---|
| ||
{ "apiKey": 59, "type": "request", "listeners": ["controller"], "name": "FetchSnapshotRequest", "validVersions": "0", "flexibleVersions": "0+", "fields": [ { "name": "ClusterId", "type": "string", "versions": "0+", "nullableVersions": "0+", "default": "null", "taggedVersions": "0+", "tag": 0, "about": "The clusterId if known, this is used to validate metadata fetches prior to broker registration" }, { "name": "ReplicaId", "type": "int32", "versions": "0+", "default": "-1", "entityType": "brokerId", "about": "The replica ID of the follower" }, { "name": "ReplicaUuid", "type": "uuid", "versions": "1+", "default": "null", "about": "The replica UUID of the follower" }, ... ] } |
...
- Candidate Id was moved out of the topic partition maps
- Candidate Uuid was added to the PartitionData
- VoterId was added to the top level
- VoterUuId was added to PartitionData
Code Block | ||
---|---|---|
| ||
{ "apiKey": 52, "type": "request", "listeners": ["controller"], "name": "VoteRequest", "validVersions": "0-1", "flexibleVersions": "0+", "fields": [ { "name": "ClusterId", "type": "string", "versions": "0+", "nullableVersions": "0+", "default": "null" }, { "name": "CandidateId", "type": "int32", "versions": "1+", "entityType": "brokerId", "about": "The ID of the voter sending the request" }, { "name": "VoterId", "type": "int32", "versions": "1+", "entityType": "brokerId", "about": "The ID of the replica receiving the request to vote." }, { "name": "Topics", "type": "[]TopicData", "versions": "0+", "fields": [ { "name": "TopicName", "type": "string", "versions": "0+", "entityType": "topicName", "about": "The topic name." }, { "name": "Partitions", "type": "[]PartitionData", "versions": "0+", "fields": [ { "name": "PartitionIndex", "type": "int32", "versions": "0+", "about": "The partition index." }, { "name": "CandidateEpoch", "type": "int32", "versions": "0+", "about": "The bumped epoch of the candidate sending the request"}, { "name": "CandidateId", "type": "int32", "versions": "0", "entityType": "brokerId", "about": "The ID of the voter sending the request"}, { "name": "CandidateUuid", "type": "uuid", "versions": "1+", "nullableVersions": "1+", "default": "null" } "about": "The candidate generated UUID, null otherwise" }, { "name": "VoterUuid", "type": "uuid", "versions": "1+", "nullableVersions": "1+", "default": "null" } "about": "The voter generated UUID of the replica receiving the request to vote, null otherwise" }, { "name": "LastOffsetEpoch", "type": "int32", "versions": "0+", "about": "The epoch of the last record written to the metadata log"}, { "name": "LastOffset", "type": "int64", "versions": "0+", "about": "The offset of the last record written to the metadata log"} ]} ]} ] } |
...
- LeaderId was moved out of the topic partition maps
- VoterId was added to the top level
- VoterUuId was added to PartitionData
- Allow tagged fields for version greater than or equal to 1.
Code Block | ||
---|---|---|
| ||
{ "apiKey": 53, "type": "request", "listeners": ["controller"], "name": "BeginQuorumEpochRequest", "validVersions": "0-1", "flexibleVersions": "1+", "fields": [ { "name": "ClusterId", "type": "string", "versions": "0+", "nullableVersions": "0+", "default": "null"}, { "name": "LeaderId", "type": "int32", "versions": "1+", "entityType": "brokerId", "about": "The ID of the newly elected leader"}, { "name": "VoterId", "type": "int32", "versions": "1+", "entityType": "brokerId", "about": "The voter ID of the receiving replica." }, { "name": "Topics", "type": "[]TopicData", "versions": "0+", "fields": [ { "name": "TopicName", "type": "string", "versions": "0+", "entityType": "topicName", "about": "The topic name." }, { "name": "Partitions", "type": "[]PartitionData", "versions": "0+", "fields": [ { "name": "PartitionIndex", "type": "int32", "versions": "0+", "about": "The partition index." }, { "name": "VoterUuid", "type": "uuid", "versions": "1+", "about": "The voter UUID of the receiving replica." }, { "name": "LeaderId", "type": "int32", "versions": "0", "entityType": "brokerId", "about": "The ID of the newly elected leader"}, { "name": "LeaderEpoch", "type": "int32", "versions": "0+", "about": "The epoch of the newly elected leader"} ]} ]} ] } |
...
- LeaderId was moved out of the topic partition maps
- VoterId was added to the request
- VoterUuid was added to the Partitions
- ReplicaUuid was added to PreferredSuccessors
- Allow tagged fields for versions greater than or equal to 1.
- TODO: Verify that the changes to PreferredSuccessors are backwards compatible.
Code Block | ||
---|---|---|
| ||
{ "apiKey": 54, "type": "request", "listeners": ["controller"], "name": "EndQuorumEpochRequest", "validVersions": "0-1", "flexibleVersions": "1+", "fields": [ { "name": "ClusterId", "type": "string", "versions": "0+", "nullableVersions": "0+", "default": "null"}, { "name": "LeaderId", "type": "int32", "versions": "1+", "entityType": "brokerId", "about": "The current leader ID that is resigning." }, { "name": "VoterId", "type": "int32", "versions": "1+", "entityType": "brokerId", "about": "The voter ID of the receiving replica." }, { "name": "Topics", "type": "[]TopicData", "versions": "0+", "fields": [ { "name": "TopicName", "type": "string", "versions": "0+", "entityType": "topicName", "about": "The topic name." }, { "name": "Partitions", "type": "[]PartitionData", "versions": "0+", "fields": [ { "name": "PartitionIndex", "type": "int32", "versions": "0+", "about": "The partition index." }, { "name": "VoterUuid", "type": "uuid", "versions": "1+", "about": "The voter UUID of the receiving replica." }, { "name": "LeaderId", "type": "int32", "versions": "0", "entityType": "brokerId", "about": "The current leader ID that is resigning"}, { "name": "LeaderEpoch", "type": "int32", "versions": "0+", "about": "The current epoch"}, { "name": "PreferredSuccessors", "type": "[]ReplicaInfo", "versions": "0+", "about": "A sorted list of preferred successors to start the election", "fields": [ { "name": "ReplicaId", "type": "int32", "versions": "0+", "entityType": "brokerId" }, { "name": "ReplicaUuid", "type": "uuid", "versions": "1+" } ]} ]} ]} ] } |
...
- Add ReplicaUuid to ReplicaState
Code Block | ||
---|---|---|
| ||
{ "apiKey": 55, "type": "response", "name": "DescribeQuorumResponse", // Version 1 adds LastFetchTimeStamp and LastCaughtUpTimestamp in ReplicaState (KIP-836). "validVersions": "0-1", "flexibleVersions": "0+", "fields": [ { "name": "ErrorCode", "type": "int16", "versions": "0+", "about": "The top level error code."}, { "name": "Topics", "type": "[]TopicData", "versions": "0+", "fields": [ { "name": "TopicName", "type": "string", "versions": "0+", "entityType": "topicName", "about": "The topic name." }, { "name": "Partitions", "type": "[]PartitionData", "versions": "0+", "fields": [ { "name": "PartitionIndex", "type": "int32", "versions": "0+", "about": "The partition index." }, { "name": "ErrorCode", "type": "int16", "versions": "0+"}, { "name": "LeaderId", "type": "int32", "versions": "0+", "entityType": "brokerId", "about": "The ID of the current leader or -1 if the leader is unknown."}, { "name": "LeaderEpoch", "type": "int32", "versions": "0+", "about": "The latest known leader epoch"}, { "name": "HighWatermark", "type": "int64", "versions": "0+"}, { "name": "CurrentVoters", "type": "[]ReplicaState", "versions": "0+" }, { "name": "Observers", "type": "[]ReplicaState", "versions": "0+" } ]} ]} ], "commonStructs": [ { "name": "ReplicaState", "versions": "0+", "fields": [ { "name": "ReplicaId", "type": "int32", "versions": "0+", "entityType": "brokerId" }, { "name": "ReplicaUuid", "type": "uuid", "versions": "1+" }, { "name": "LogEndOffset", "type": "int64", "versions": "0+", "about": "The last known log end offset of the follower or -1 if it is unknown"}, { "name": "LastFetchTimestamp", "type": "int64", "versions": "1+", "ignorable": true, "default": -1, "about": "The last known leader wall clock time time when a follower fetched from the leader. This is reported as -1 both for the current leader or if it is unknown for a voter"}, { "name": "LastCaughtUpTimestamp", "type": "int64", "versions": "1+", "ignorable": true, "default": -1, "about": "The leader wall clock append time of the offset for which the follower made the most recent fetch request. This is reported as the current time for the leader and -1 if unknown for a voter" } ]} ] } |
...