Files
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>Mario
a739cb2805 Bump github.com/twmb/franz-go from 1.18.1 to 1.20.0 (#5766)
* Bump github.com/twmb/franz-go from 1.18.1 to 1.20.0

Bumps [github.com/twmb/franz-go](https://github.com/twmb/franz-go) from 1.18.1 to 1.20.0.
- [Changelog](https://github.com/twmb/franz-go/blob/master/CHANGELOG.md)
- [Commits](https://github.com/twmb/franz-go/compare/v1.18.1...v1.20.0)

---
updated-dependencies:
- dependency-name: github.com/twmb/franz-go
  dependency-version: 1.20.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>

* Update kfake

---------

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Mario <[email protected]>
2025-10-20 13:55:55 +02:00

1287 lines
37 KiB
Go

package kversion
import (
"fmt"
"maps"
"github.com/twmb/franz-go/pkg/kmsg"
)
const (
maj0_8 uint8 = 253
maj0_9 uint8 = 254
maj0_10 uint8 = 255
maj0_11 uint8 = 0
)
type releaseKind uint8
const (
kindBroker releaseKind = 0
kindController releaseKind = 1
kindZk releaseKind = 2
)
type release struct {
major uint8
minor uint8
kind releaseKind
reqs map[int16]req
prior *release
}
func (r *release) clone(nextMajor, nextMinor uint8) *release {
return &release{
major: nextMajor,
minor: nextMinor,
kind: r.kind,
reqs: maps.Clone(r.reqs),
prior: r,
}
}
func (r *release) name() string {
switch r.major {
case maj0_8, maj0_9, maj0_10, maj0_11:
return fmt.Sprintf("v0.%d.%d", r.major+11, r.minor)
default:
return fmt.Sprintf("v%d.%d", r.major, r.minor)
}
}
type req struct {
key int16
vmin int16
vmax int16
}
func (r *release) incmax(key, vmax int16) {
req, ok := r.reqs[key]
if !ok {
panic(fmt.Sprintf("key %d does not yet exist to incmax", key))
}
if req.vmax+1 != vmax {
panic(fmt.Sprintf("key %d next max %d != exp %d", key, req.vmax+1, vmax))
}
req.vmax++
r.reqs[key] = req
}
func (r *release) addkey(key int16) {
r.addkeyver(key, 0)
}
func (r *release) addkeyver(key, vmax int16) {
if _, ok := r.reqs[key]; ok {
panic(fmt.Sprintf("key %d already exists", key))
}
r.reqs[key] = req{key: key, vmax: vmax}
}
func reqsFromApiVersions(r *kmsg.ApiVersionsResponse) map[int16]req {
m := make(map[int16]req, len(r.ApiKeys))
for _, k := range r.ApiKeys {
m[k.ApiKey] = req{
key: k.ApiKey,
vmin: k.MinVersion,
vmax: k.MaxVersion,
}
}
return m
}
func (vs *Versions) versionGuess2(cmp *release, opts ...VersionGuessOpt) guess {
// KRaft at 2.8 had two requests that were not in 3.0, which makes
// version detection of 2.8 more difficult. We don't handle it
// properly; KRaft 2.8 was feature preview only.
cfg := guessCfg{
// We skip:
// * (4) LeaderAndISR
// * (5) StopReplica
// * (6) UpdateMetadata
// * (7) ControlledShutdown
// * (27) WriteTxnMarkers
// * (56) AlterISR
// * (57) UpdateFeatures
// * (58) Envelope
// * (67) AllocateProducerIDs
// * (71) GetTelemetrySubscriptions
// * (72) PushTelemetry
//
// Most of these keys are broker-to-broker only requests, and
// most non-Kafka implementations do not implement them.
//
// We skip 71 and 72 because telemetry requests are only
// advertised if the broker is configured to support it.
skipKeys: []int16{4, 5, 6, 7, 27, 56, 57, 58, 67, 71, 72},
}
for _, opt := range opts {
opt.apply(&cfg)
}
// For comparison checking, we only check the max key version.
var higher *release
for {
for _, k := range cfg.skipKeys {
delete(cmp.reqs, k)
delete(vs.reqs, k)
}
var under, equal, over bool
for k, req := range vs.reqs {
cmpreq, ok := cmp.reqs[k]
if ok {
if req.vmax < cmpreq.vmax {
under = true
} else if req.vmax > cmpreq.vmax {
over = true
} else {
equal = true
}
delete(cmp.reqs, k)
} else {
over = true // key we do not recognize: by definition the broker is higher than this cmp version
}
}
// If our versions did not clear out what we are comparing against, we
// do not have all keys that we need for this version.
if len(cmp.reqs) > 0 {
under = true
}
switch {
case under && over:
if cmp.prior == nil {
return guess{v1: cmp.name(), how: guessCustomUnknown}
}
case under:
if cmp.prior == nil {
return guess{v1: cmp.name(), how: guessNotEven}
}
case over:
if higher != nil {
return guess{v1: cmp.name(), v2: higher.name(), how: guessBetween}
}
return guess{v1: cmp.name(), how: guessAtLeast}
case equal:
return guess{v1: cmp.name(), how: guessExact}
}
higher = cmp
cmp = cmp.prior
}
}
////////////////////////
// ZOOKEEPER VERSIONS //
////////////////////////
func z080() *release {
return &release{
major: maj0_8,
minor: 0,
kind: kindZk,
reqs: map[int16]req{
0: {key: 0}, // 0 produce
1: {key: 1}, // 1 fetch
2: {key: 2}, // 2 list offset
3: {key: 3}, // 3 metadata
4: {key: 4}, // 4 leader and isr
5: {key: 5}, // 5 stop replica
6: {key: 6}, // 6 update metadata (actually not supported for a bit)
7: {key: 7}, // 7 controlled shutdown, actually not supported for a bit
},
}
}
func z081() *release {
prior := z080()
now := prior.clone(maj0_8, 1)
now.addkey(8) // 8 offset commit KAFKA-965 db37ed0054
now.addkey(9) // 9 offset fetch (same)
return now
}
func z082() *release {
now := z081().clone(maj0_8, 2)
now.incmax(8, 1) // 1 offset commit KAFKA-1462
now.incmax(9, 1) // 1 offset fetch KAFKA-1841 161b1aa16e I think?
now.addkey(10) // 10 find coordinator KAFKA-1012 a670537aa3
now.addkey(11) // 11 join group (same)
now.addkey(12) // 12 heartbeat (same)
return now
}
func z090() *release {
now := z082().clone(maj0_9, 0)
now.incmax(0, 1) // 1 produce KAFKA-2136 436b7ddc38; KAFKA-2083 ?? KIP-13
now.incmax(1, 1) // 1 fetch (same)
now.incmax(6, 1) // 1 update metadata KAFKA-2411 d02ca36ca1
now.incmax(7, 1) // 1 controlled shutdown (same)
now.incmax(8, 2) // 2 offset commit KAFKA-1634
now.addkey(13) // 13 leave group KAFKA-2397 636e14a991
now.addkey(14) // 14 sync group KAFKA-2464 86eb74d923
now.addkey(15) // 15 describe groups KAFKA-2687 596c203af1
now.addkey(16) // 16 list groups KAFKA-2687 596c203af1
return now
}
func z0100() *release {
now := z090().clone(maj0_10, 0)
now.incmax(0, 2) // 2 produce KAFKA-3025 45c8195fa1 KIP-31 KIP-32
now.incmax(1, 2) // 2 fetch (same)
now.incmax(3, 1) // 1 metadata KAFKA-3306 33d745e2dc
now.incmax(6, 2) // 2 update metadata KAFKA-1215 951e30adc6
now.addkey(17) // 17 sasl handshake KAFKA-3149 5b375d7bf9
now.addkey(18) // 18 api versions KAFKA-3307 8407dac6ee
return now
}
func z0101() *release {
now := z0100().clone(maj0_10, 1)
now.incmax(1, 3) // 3 fetch KAFKA-2063 d04b0998c0 KIP-74
now.incmax(2, 1) // 1 list offset KAFKA-4148 eaaa433fc9 KIP-79
now.incmax(3, 2) // 2 metadata KAFKA-4093 ecc1fb10fa KIP-78
now.incmax(11, 1) // 1 join group KAFKA-3888 40b1dd3f49 KIP-62
now.addkey(19) // 19 create topics KAFKA-2945 fc47b9fa6b
now.addkey(20) // 20 delete topics KAFKA-2946 539633ba0e
return now
}
func z0102() *release {
now := z0101().clone(maj0_10, 2)
now.incmax(6, 3) // 3 update metadata KAFKA-4565 d25671884b KIP-103
now.incmax(19, 1) // 1 create topics KAFKA-4591 da57bc27e7 KIP-108
return now
}
func z0110() *release {
now := z0102().clone(maj0_11, 0)
now.incmax(0, 3) // 3 produce KAFKA-4816 5bd06f1d54 KIP-98
now.incmax(1, 4) // 4 fetch (same)
now.incmax(1, 5) // 5 fetch KAFKA-4586 8b05ad406d KIP-107
now.incmax(9, 2) // 2 offset fetch KAFKA-3853 c2d9b95f36 KIP-98
now.incmax(10, 1) // 1 find coordinator KAFKA-5043 d0e7c6b930 KIP-98
now.addkey(21) // 21 delete records KAFKA-4586 see above
now.addkey(22) // 22 init producer id KAFKA-4817 bdf4cba047 KIP-98 (raft added in KAFKA-12620 e97cff2702b6ba836c7925caa36ab18066a7c95d KIP-730)
now.addkey(23) // 23 offset for leader epoch KAFKA-1211 0baea2ac13 KIP-101
now.addkey(24) // 24 add partitions to txn KAFKA-4990 865d82af2c KIP-98 (raft 3.0 6e857c531f14d07d5b05f174e6063a124c917324)
now.addkey(25) // 25 add offsets to txn (same, same raft)
now.addkey(26) // 26 end txn (same, same raft)
now.addkey(27) // 27 write txn markers (same)
now.addkey(28) // 28 txn offset commit (same, same raft)
// raft broker / controller added in 5b0c58ed53c420e93957369516f34346580dac95
now.addkey(29) // 29 describe acls KAFKA-3266 9815e18fef KIP-140
now.addkey(30) // 30 create acls (same)
now.addkey(31) // 31 delete acls (same)
now.addkey(32) // 32 describe configs KAFKA-3267 972b754536 KIP-133
now.addkey(33) // 33 alter configs (same) (raft broker 3.0 6e857c531f14d07d5b05f174e6063a124c917324, controller 273d66479dbee2398b09e478ffaf996498d1ab34)
// KAFKA-4954 0104b657a1 KIP-124
now.incmax(2, 2) // 2 list offset (reused in e71dce89c0 KIP-98)
now.incmax(3, 3) // 3 metadata
now.incmax(8, 3) // 3 offset commit
now.incmax(9, 3) // 3 offset fetch
now.incmax(11, 2) // 2 join group
now.incmax(12, 1) // 1 heartbeat
now.incmax(13, 1) // 1 leave group
now.incmax(14, 1) // 1 sync group
now.incmax(15, 1) // 1 describe groups
now.incmax(16, 1) // 1 list group
now.incmax(18, 1) // 1 api versions
now.incmax(19, 2) // 2 create topics
now.incmax(20, 1) // 1 delete topics
now.incmax(3, 4) // 4 metadata KAFKA-5291 7311dcbc53
return now
}
func z10() *release {
now := z0110().clone(1, 0)
now.incmax(0, 4) // 4 produce KAFKA-4763 fc93fb4b61 KIP-112
now.incmax(1, 6) // 6 fetch (same)
now.incmax(3, 5) // 5 metadata (same)
now.incmax(4, 1) // 1 leader and isr (same)
now.incmax(6, 4) // 4 update metadata (same)
now.incmax(0, 5) // 5 produce KAFKA-5793 94692288be
now.incmax(17, 1) // 1 sasl handshake KAFKA-4764 8fca432223 KIP-152
now.addkey(34) // 34 alter replica log dirs KAFKA-5694 adefc8ea07 KIP-113
now.addkey(35) // 35 describe log dirs (same)
now.addkey(36) // 36 sasl authenticate KAFKA-4764 (see above)
now.addkey(37) // 37 create partitions KAFKA-5856 5f6393f9b1 KIP-195 (raft 3.0 6e857c531f14d07d5b05f174e6063a124c917324)
return now
}
func z11() *release {
now := z10().clone(1, 1)
now.addkey(38) // 38 create delegation token KAFKA-4541 27a8d0f9e7 under KAFKA-1696 KIP-48
now.addkey(39) // 39 renew delegation token (same)
now.addkey(40) // 40 expire delegation token (same)
now.addkey(41) // 41 describe delegation token (same)
now.addkey(42) // 42 delete groups KAFKA-6275 1ed6da7cc8 KIP-229
now.incmax(1, 7) // 7 fetch KAFKA-6254 7fe1c2b3d3 KIP-227
now.incmax(32, 1) // 1 describe configs KAFKA-6241 b814a16b96 KIP-226
return now
}
func z20() *release {
now := z11().clone(2, 0)
now.incmax(0, 6) // 6 produce KAFKA-6028 1facab387f KIP-219
now.incmax(1, 8) // 8 fetch (same)
now.incmax(2, 3) // 3 list offset (same)
now.incmax(3, 6) // 6 metadata (same)
now.incmax(8, 4) // 4 offset commit (same)
now.incmax(9, 4) // 4 offset fetch (same)
now.incmax(10, 2) // 2 find coordinator (same)
now.incmax(11, 3) // 3 join group (same)
now.incmax(12, 2) // 2 heartbeat (same)
now.incmax(13, 2) // 2 leave group (same)
now.incmax(14, 2) // 2 sync group (same)
now.incmax(15, 2) // 2 describe groups (same)
now.incmax(16, 2) // 2 list group (same)
now.incmax(18, 2) // 2 api versions (same)
now.incmax(19, 3) // 3 create topics (same)
now.incmax(20, 2) // 2 delete topics (same)
now.incmax(21, 1) // 1 delete records (same)
now.incmax(22, 1) // 1 init producer id (same)
now.incmax(24, 1) // 1 add partitions to txn (same)
now.incmax(25, 1) // 1 add offsets to txn (same)
now.incmax(26, 1) // 1 end txn (same)
now.incmax(28, 1) // 1 txn offset commit (same)
// 29, 30, 31 bumped below, but also had throttle changes
now.incmax(32, 2) // 2 describe configs (same)
now.incmax(33, 1) // 1 alter configs (same)
now.incmax(34, 1) // 1 alter replica log dirs (same)
now.incmax(35, 1) // 1 describe log dirs (same)
now.incmax(37, 1) // 1 create partitions (same)
now.incmax(38, 1) // 1 create delegation token (same)
now.incmax(39, 1) // 1 renew delegation token (same)
now.incmax(40, 1) // 1 expire delegation token (same)
now.incmax(41, 1) // 1 describe delegation token (same)
now.incmax(42, 1) // 1 delete groups (same)
now.incmax(29, 1) // 1 describe acls KAFKA-6841 b3aa655a70 KIP-290
now.incmax(30, 1) // 1 create acls (same)
now.incmax(31, 1) // 1 delete acls (same)
now.incmax(23, 1) // 1 offset for leader epoch KAFKA-6361 9679c44d2b KIP-279
return now
}
func z21() *release {
now := z20().clone(2, 1)
now.incmax(8, 5) // 5 offset commit KAFKA-4682 418a91b5d4 KIP-211
now.incmax(20, 3) // 3 delete topics KAFKA-5975 04770916a7 KIP-322
now.incmax(1, 9) // 9 fetch KAFKA-7333 05ba5aa008 KIP-320
now.incmax(2, 4) // 4 list offset (same)
now.incmax(3, 7) // 7 metadata (same)
now.incmax(8, 6) // 6 offset commit (same)
now.incmax(9, 5) // 5 offset fetch (same)
now.incmax(23, 2) // 2 offset for leader epoch (same, also in Kafka PR #5635 79ad9026a6)
now.incmax(28, 2) // 2 txn offset commit (same)
now.incmax(0, 7) // 7 produce KAFKA-4514 741cb761c5 KIP-110
now.incmax(1, 10) // 10 fetch (same)
return now
}
func z22() *release {
now := z21().clone(2, 2)
now.incmax(2, 5) // 5 list offset KAFKA-2334 152292994e KIP-207
now.incmax(11, 4) // 4 join group KAFKA-7824 9a9310d074 KIP-394
now.incmax(36, 1) // 1 sasl authenticate KAFKA-7352 e8a3bc7425 KIP-368
now.incmax(4, 2) // 2 leader and isr KAFKA-7235 2155c6d54b KIP-380
now.incmax(5, 1) // 1 stop replica (same)
now.incmax(6, 5) // 5 update metadata (same)
now.incmax(7, 2) // 2 controlled shutdown (same)
now.addkey(43) // 43 elect preferred leaders KAFKA-5692 269b65279c KIP-183 (raft 3.0 6e857c531f14d07d5b05f174e6063a124c917324)
return now
}
func z23() *release {
now := z22().clone(2, 3)
now.incmax(3, 8) // 8 metadata KAFKA-7922 a42f16f980 KIP-430
now.incmax(15, 3) // 3 describe groups KAFKA-7922 f11fa5ef40 KIP-430
now.incmax(1, 11) // 11 fetch KAFKA-8365 e2847e8603 KIP-392
now.incmax(23, 3) // 3 offset for leader epoch (same)
now.incmax(11, 5) // 5 join group KAFKA-7862 0f995ba6be KIP-345
now.incmax(8, 7) // 7 offset commit KAFKA-8225 9fa331b811 KIP-345
now.incmax(12, 3) // 3 heartbeat (same)
now.incmax(14, 3) // 3 sync group (same)
now.addkey(44) // 44 incremental alter configs KAFKA-7466 3b1524c5df KIP-339
return now
}
func z24() *release {
now := z23().clone(2, 4)
now.incmax(4, 3) // 3 leader and isr KAFKA-8345 81900d0ba0 KIP-455
now.incmax(15, 4) // 4 describe groups KAFKA-8538 f8db022b08 KIP-345
now.incmax(19, 4) // 4 create topics KAFKA-8305 8e161580b8 KIP-464
now.incmax(43, 1) // 1 elect preferred leaders KAFKA-8286 121308cc7a KIP-460
// raft added in e07de97a4ce730a2755db7eeacb9b3e1f69a12c8 for the following two
now.addkey(45) // 45 alter partition reassignments KAFKA-8345 81900d0ba0 KIP-455
now.addkey(46) // 46 list partition reassignments (same)
now.addkey(47) // 47 offset delete KAFKA-8730 e24d0e22ab KIP-496
now.incmax(13, 3) // 3 leave group KAFKA-8221 74c90f46c3 KIP-345
// introducing flexible versions; 24 were bumped
now.incmax(3, 9) // 9 metadata KAFKA-8885 apache/kafka#7325 KIP-482
now.incmax(4, 4) // 4 leader and isr (same)
now.incmax(5, 2) // 2 stop replica (same)
now.incmax(6, 6) // 6 update metadata (same)
now.incmax(7, 3) // 3 controlled shutdown (same)
now.incmax(8, 8) // 8 offset commit (same)
now.incmax(9, 6) // 6 offset fetch (same)
now.incmax(10, 3) // 3 find coordinator (same)
now.incmax(11, 6) // 6 join group (same)
now.incmax(12, 4) // 4 heartbeat (same)
now.incmax(13, 4) // 4 leave group (same)
now.incmax(14, 4) // 4 sync group (same)
now.incmax(15, 5) // 5 describe groups (same)
now.incmax(16, 3) // 3 list group (same)
now.incmax(18, 3) // 3 api versions (same, also KIP-511 [non-flexible fields added])
now.incmax(19, 5) // 5 create topics (same)
now.incmax(20, 4) // 4 delete topics (same)
now.incmax(22, 2) // 2 init producer id (same)
now.incmax(38, 2) // 2 create delegation token (same)
now.incmax(42, 2) // 2 delete groups (same)
now.incmax(43, 2) // 2 elect preferred leaders (same)
now.incmax(44, 1) // 1 incremental alter configs (same)
// also 45, 46; not bumped since in same release
// Create topics (19) was bumped up to 5 in KAFKA-8907 5d0052fe00
// KIP-525, then 6 in the above bump, then back down to 5 once the
// tagged PR was merged (KAFKA-8932 1f1179ea64 for the bump down).
now.incmax(0, 8) // 8 produce KAFKA-8729 f6f24c4700 KIP-467
return now
}
func z25() *release {
now := z24().clone(2, 5)
now.incmax(22, 3) // 3 init producer id KAFKA-8710 fecb977b25 KIP-360
now.incmax(9, 7) // 7 offset fetch KAFKA-9346 6da70f9b95 KIP-447
// more flexible versions, KAFKA-9420 0a2569e2b99 KIP-482
// 6 bumped, then sasl handshake reverted later in 1a8dcffe4
now.incmax(36, 2) // 2 sasl authenticate
now.incmax(37, 2) // 2 create partitions
now.incmax(39, 2) // 2 renew delegation token
now.incmax(40, 2) // 2 expire delegation token
now.incmax(41, 2) // 2 describe delegation token
now.incmax(28, 3) // 3 txn offset commit KAFKA-9365 ed7c071e07f KIP-447
now.incmax(29, 2) // 2 describe acls KAFKA-9026 40b35178e5 KIP-482 (for flexible versions)
now.incmax(30, 2) // 2 create acls KAFKA-9027 738e14edb KIP-482 (flexible)
now.incmax(31, 2) // 2 delete acls KAFKA-9028 738e14edb KIP-482 (flexible)
now.incmax(11, 7) // 7 join group KAFKA-9437 96c4ce480 KIP-559
now.incmax(14, 5) // 5 sync group (same)
return now
}
func z26() *release {
now := z25().clone(2, 6)
now.incmax(21, 2) // 2 delete records KAFKA-8768 f869e33ab KIP-482 (opportunistic bump for flexible versions)
now.incmax(35, 2) // 2 describe log dirs KAFKA-9435 4f1e8331ff9 KIP-482 (same)
now.addkey(48) // 48 describe client quotas KAFKA-7740 227a7322b KIP-546 (raft in 5964401bf9aab611bd4a072941bd1c927e044258)
now.addkey(49) // 49 alter client quotas (same)
now.incmax(5, 3) // 3 stop replica KAFKA-9539 7c7d55dbd KIP-570
now.incmax(16, 4) // 4 list group KAFKA-9130 fe948d39e KIP-518
now.incmax(32, 3) // 3 describe configs KAFKA-9494 af3b8b50f2 KIP-569
return now
}
func z27() *release {
now := z26().clone(2, 7)
// KAFKA-10163 a5ffd1ca44c KIP-599
now.incmax(37, 3) // 3 create partitions
now.incmax(19, 6) // 6 create topics (same)
now.incmax(20, 5) // 5 delete topics (same)
// KAFKA-9911 b937ec7567 KIP-588
now.incmax(22, 4) // 4 init producer id
now.incmax(24, 2) // 2 add partitions to txn
now.incmax(25, 2) // 2 add offsets to txn
now.incmax(26, 2) // 2 end txn
now.addkey(50) // 50 describe user scram creds, KAFKA-10259 e8524ccd8fca0caac79b844d87e98e9c055f76fb KIP-554; 38c409cf33c kraft
now.addkey(51) // 51 alter user scram creds, same
// KAFKA-10435 634c9175054cc69d10b6da22ea1e95edff6a4747 KIP-595
// This opted in fetch request to flexible versions.
//
// KAFKA-10487: further change in aa5263fba903c85812c0c31443f7d49ee371e9db
now.incmax(1, 12) // 12 fetch
// KAFKA-8836 57de67db22eb373f92ec5dd449d317ed2bc8b8d1 KIP-497
now.addkey(56) // 56 alter isr
// KAFKA-10028 fb4f297207ef62f71e4a6d2d0dac75752933043d KIP-584
now.addkey(57) // 57 update features (rbroker 3.0 6e857c531f14d07d5b05f174e6063a124c917324; rcontroller 3.2 55ff5d360381af370fe5b3a215831beac49571a4 KIP-778 KAFKA-13823)
return now
}
func z28() *release {
now := z27().clone(2, 8)
// KAFKA-10729 85f94d50271c952c3e9ee49c4fc814c0da411618 KIP-482
// (flexible bumps)
now.incmax(0, 9) // 9 produce
now.incmax(2, 6) // 6 list offsets
now.incmax(23, 4) // 4 offset for leader epoch
now.incmax(24, 3) // 3 add partitions to txn
now.incmax(25, 3) // 3 add offsets to txn
now.incmax(26, 3) // 3 end txn
now.incmax(27, 1) // 1 write txn markers
now.incmax(32, 4) // 4 describe configs
now.incmax(33, 2) // 2 alter configs
now.incmax(34, 2) // 2 alter replica log dirs
now.incmax(48, 1) // 1 describe client quotas
now.incmax(49, 1) // 1 alter client quotas
// KAFKA-10547 5c921afa4a593478f7d1c49e5db9d787558d0d5e KIP-516
now.incmax(3, 10) // 10 metadata
now.incmax(6, 7) // 7 update metadata
// KAFKA-10545 1dd1e7f945d7a8c1dc177223cd88800680f1ff46 KIP-516
now.incmax(4, 5) // 5 leader and isr
// KAFKA-12204 / KAFKA-10851 302eee63c479fd4b955c44f1058a5e5d111acb57 KIP-700
now.addkey(60) // 60 describe cluster; rController in KAFKA-15396 41b695b6e30baa4243d9ca4f359b833e17ed0e77 KIP-919
// KAFKA-12212 7a1d1d9a69a241efd68e572badee999229b3942f KIP-700
now.incmax(3, 11) // 11 metadata
// KAFKA-10764 4f588f7ca2a1c5e8dd845863da81425ac69bac92 KIP-516
now.incmax(19, 7) // 7 create topics
now.incmax(20, 6) // 6 delete topics
// KAFKA-12238 e9edf104866822d9e6c3b637ffbf338767b5bf27 KIP-664
now.addkey(61) // 61 describe producers
return now
}
func z30() *release {
now := z28().clone(3, 0)
// KAFKA-12267 3f09fb97b6943c0612488dfa8e5eab8078fd7ca0 KIP-664
now.addkey(65) // 65 describe transactions
// KAFKA-12369 3708a7c6c1ecf1304f091dda1e79ae53ba2df489 KIP-664
now.addkey(66) // 66 list transactions
// KAFKA-12620 72d108274c98dca44514007254552481c731c958 KIP-730
// raft broker added in e97cff2702b6ba836c7925caa36ab18066a7c95d
now.addkey(67) // 67 allocate producer ids
// KAFKA-12541 bd72ef1bf1e40feb3bc17349a385b479fa5fa530 KIP-734
now.incmax(2, 7) // 7 list offsets
// KAFKA-12663 f5d5f654db359af077088685e29fbe5ea69616cf KIP-699
now.incmax(10, 4) // 4 find coordinator
// KAFKA-12234 e00c0f3719ad0803620752159ef8315d668735d6 KIP-709
now.incmax(9, 8) // 8 offset fetch
return now
}
func z31() *release {
now := z30().clone(3, 1)
// KAFKA-10580 2b8aff58b575c199ee8372e5689420c9d77357a5 KIP-516
now.incmax(1, 13) // 13 fetch
// KAFKA-10744 1d22b0d70686aef5689b775ea2ea7610a37f3e8c KIP-516
now.incmax(3, 12) // 12 metadata
return now
}
func z32() *release {
now := z31().clone(3, 2)
// KAFKA-13495 69645f1fe5103adb00de6fa43152e7df989f3aea KIP-800
now.incmax(11, 8) // 8 join group
// KAFKA-13496 bf609694f83931990ce63e0123f811e6475820c5 KIP-800
now.incmax(13, 5) // 5 leave group
// KAFKA-13527 31fca1611a6780e8a8aa3ac21618135201718e32 KIP-784
now.incmax(35, 3) // 3 describe log dirs
// KAFKA-13435 c8fbe26f3bd3a7c018e7619deba002ee454208b9 KIP-814
now.incmax(11, 9) // 9 join group
// KAFKA-13587 52621613fd386203773ba93903abd50b46fa093a KIP-704
now.incmax(4, 6) // 6 leader and isr
now.incmax(56, 1) // 1 alter isr => alter partition
return now
}
func z33() *release {
now := z32().clone(3, 3)
// KAFKA-13823 55ff5d360381af370fe5b3a215831beac49571a4 KIP-778
now.incmax(57, 1) // 1 update features
// KAFKA-13958 4fcfd9ddc4a8da3d4cfbb69268c06763352e29a9 KIP-827
now.incmax(35, 4) // 4 describe log dirs
// KAFKA-841 f83d95d9a28 KIP-841
now.incmax(56, 2) // 2 alter partition
// KAFKA-6945 d65d8867983 KIP-373
now.incmax(29, 3) // 3 describe acls
now.incmax(30, 3) // 3 create acls
now.incmax(31, 3) // 3 delete acls
now.incmax(38, 3) // 3 create delegation token
now.incmax(41, 3) // 3 describe delegation token
return now
}
func z34() *release {
now := z33().clone(3, 4)
// KAFKA-14304 7b7e40a536a79cebf35cc278b9375c8352d342b9 KIP-866
// KAFKA-14448 67c72596afe58363eceeb32084c5c04637a33831 added BrokerRegistration
// KAFKA-14493 db490707606855c265bc938e1b236070e0e2eba5 changed BrokerRegistration
// KAFKA-14304 0bb05d8679b684ad8fbb2eb40dfc00066186a75a changed BrokerRegistration back to a bool...
// 5b521031edea8ea7cbcca7dc24a58429423740ff added tag to ApiVersions
now.incmax(4, 7) // 7 leader and isr
now.incmax(5, 4) // 4 stop replica
now.incmax(6, 8) // 8 update metadata
// KAFKA-14446 8b045dcbf6b89e1a9594ff95642d4882765e4b0d KIP-866 Kafka 3.4
now.addkey(58) // 58 envelope
return now
}
func z35() *release {
now := z34().clone(3, 5)
// KAFKA-13369 7146ac57ba9ddd035dac992b9f188a8e7677c08d KIP-405
now.incmax(1, 14) // 14 fetch
now.incmax(2, 8) // 8 list offsets
now.incmax(1, 15) // 15 fetch // KAFKA-14617 79b5f7f1ce2 KIP-903
now.incmax(56, 3) // 3 alter partition // KAFKA-14617 8c88cdb7186b1d594f991eb324356dcfcabdf18a KIP-903
return now
}
func z36() *release {
now := z35().clone(3, 6)
// KAFKA-14402 29a1a16668d76a1cc04ec9e39ea13026f2dce1de KIP-890
// Later commit swapped to stable
now.incmax(24, 4) // 4 add partitions to txn
return now
}
func z37() *release {
now := z36().clone(3, 7)
// KAFKA-15661 c8f687ac1505456cb568de2b60df235eb1ceb5f0 KIP-951
now.incmax(0, 10) // 10 produce
now.incmax(1, 16) // 16 fetch
// 7826d5fc8ab695a5ad927338469ddc01b435a298 KIP-848
// (change introduced in 3.6 but was marked unstable and not visible)
now.incmax(8, 9) // 9 offset commit
// KAFKA-14499 7054625c45dc6edb3c07271fe4a6c24b4638424f KIP-848 (and prior)
now.incmax(9, 9) // 9 offset fetch
// KAFKA-15368 41b695b6e30baa4243d9ca4f359b833e17ed0e77 KIP-919
// (added rController as well, see above)
now.incmax(60, 1) // 1 describe cluster
// KAFKA-14391 3be7f7d611d0786f2f98159d5c7492b0d94a2bb7 KIP-848
// as well as some patches following
now.addkey(68) // 68 consumer group heartbeat
return now
}
func z38() *release {
now := z37().clone(3, 8)
// KAFKA-16314 2e8d69b78ca52196decd851c8520798aa856c073 KIP-890
// Then error rename in cf1ba099c0723f9cf65dda4cd334d36b7ede6327
now.incmax(0, 11) // 11 produce
now.incmax(10, 5) // 5 find coordinator
now.incmax(22, 5) // 5 init producer id
now.incmax(24, 5) // 5 add partitions to txn
now.incmax(25, 4) // 4 add offsets to txn
now.incmax(26, 4) // 4 end txn
now.incmax(28, 4) // 4 txn offset commit
// KAFKA-15460 68745ef21a9d8fe0f37a8c5fbc7761a598718d46 KIP-848
now.incmax(16, 5) // 5 list groups
// KAFKA-14509 90e646052a17e3f6ec1a013d76c1e6af2fbb756e KIP-848 added
// 7b0352f1bd9b923b79e60b18b40f570d4bfafcc0
// b7c99e22a77392d6053fe231209e1de32b50a98b
// 68389c244e720566aaa8443cd3fc0b9d2ec4bb7a
// 5f410ceb04878ca44d2d007655155b5303a47907 stabilized
now.addkey(69) // 69 consumer group describe
// KAFKA-16265 b4e96913cc6c827968e47a31261e0bd8fdf677b5 KIP-994 (part 1)
now.incmax(66, 1) // 1 list transactions
return now
}
func z39() *release {
now := z38().clone(3, 9)
// KAFKA-16527 adee6f0cc11 KIP-853
// This introduces a tag only, which does not require bumping the
// version bump. My skepticism on on the entire tag concept years
// ago continues to play out.
now.incmax(1, 17) // 17 fetch
// ebaa108967f KIP-1005
// This allows sending -5 to the broker as the timestamp.
// No end user changes otherwise.
now.incmax(2, 9) // 9 list offsets
// KAFKA-16713 8f82f14a483 KIP-932
now.incmax(10, 6) // 6 find coordinator
// KAFKA-17011 ede289db93f
now.incmax(18, 4) // 4 api versions
return now
}
func ztip() *release {
return z39()
}
///////////////////////////
// KRAFT BROKER VERSIONS //
///////////////////////////
func b28() *release {
return &release{
major: 2,
minor: 8,
kind: kindBroker,
reqs: map[int16]req{
0: {key: 0, vmax: 9}, // produce
1: {key: 1, vmax: 12}, // fetch
2: {key: 2, vmax: 6}, // list offsets
3: {key: 3, vmax: 11}, // metadata
8: {key: 8, vmax: 8}, // offset fetch
9: {key: 9, vmax: 7}, // offset commit
10: {key: 10, vmax: 3}, // find coordinator
11: {key: 11, vmax: 7}, // join group
12: {key: 12, vmax: 4}, // heartbeat
13: {key: 13, vmax: 4}, // leave group
14: {key: 14, vmax: 5}, // sync group
15: {key: 15, vmax: 5}, // describe groups
16: {key: 16, vmax: 4}, // list groups
17: {key: 17, vmax: 1}, // sasl handshake
18: {key: 18, vmax: 3}, // api versions
19: {key: 19, vmax: 7}, // create topics
20: {key: 20, vmax: 6}, // delete topics
21: {key: 21, vmax: 2}, // delete records
23: {key: 23, vmax: 4}, // offset for leader epoch
27: {key: 27, vmax: 1}, // write txn markers
32: {key: 32, vmax: 4}, // describe configs
34: {key: 34, vmax: 2}, // alter replica log dirs
35: {key: 35, vmax: 2}, // describe log dirs
36: {key: 36, vmax: 2}, // sasl authenticate
42: {key: 42, vmax: 2}, // delete groups
44: {key: 44, vmax: 1}, // incremental alter configs
47: {key: 47, vmax: 0}, // offset delete
49: {key: 49, vmax: 1}, // alter client quotas
// KAFKA-10492 b7c8490cf47b0c18253d6a776b2b35c76c71c65d KIP-595
// (described below)
55: {key: 55, vmax: 0}, // describe quorum
60: {key: 60, vmax: 0}, // describe cluster
61: {key: 61, vmax: 0}, // describe producers
// KAFKA-10181 KAFKA-10181 KIP-590
58: {key: 58, vmax: 0}, // envelope
},
}
}
func b30() *release {
now := b28().clone(3, 0)
delete(now.reqs, 55) // describe quorum not present in 3.0
now.incmax(2, 7)
now.incmax(9, 8)
now.incmax(10, 4)
now.addkeyver(22, 4)
now.addkeyver(24, 3)
now.addkeyver(25, 3)
now.addkeyver(26, 3)
now.addkeyver(28, 3)
now.addkeyver(29, 2)
now.addkeyver(30, 2)
now.addkeyver(31, 2)
now.addkeyver(33, 2)
now.addkeyver(37, 3)
now.addkeyver(43, 2)
now.addkey(45)
now.addkey(46)
now.addkeyver(48, 1)
now.addkey(57)
now.addkey(65)
now.addkey(66)
return now
}
func b31() *release {
now := b30().clone(3, 1)
now.incmax(1, 13)
now.incmax(3, 12)
return now
}
func b32() *release {
now := b31().clone(3, 2)
now.incmax(11, 8)
now.incmax(11, 9)
now.incmax(13, 5)
now.incmax(35, 3)
delete(now.reqs, 58)
return now
}
func b33() *release {
now := b32().clone(3, 3)
now.incmax(29, 3)
now.incmax(30, 3)
now.incmax(31, 3)
now.incmax(35, 4)
now.addkeyver(55, 1)
now.incmax(57, 1)
now.addkey(64)
return now
}
func b34() *release {
now := b33().clone(3, 4) // no change for broker versions
return now
}
func b35() *release {
now := b34().clone(3, 5)
now.incmax(1, 14)
now.incmax(1, 15)
now.incmax(2, 8)
now.addkey(50)
now.addkey(51)
return now
}
func b36() *release {
now := b35().clone(3, 6)
now.incmax(24, 4)
now.addkeyver(38, 3)
now.addkeyver(39, 2)
now.addkeyver(40, 2)
now.addkeyver(41, 3)
return now
}
func b37() *release {
now := b36().clone(3, 7)
now.incmax(0, 10)
now.incmax(1, 16)
now.incmax(8, 9)
now.incmax(9, 9)
now.incmax(60, 1)
// KAFKA-15604 36abc8dcea1 KIP-714, only exposed if broker is configured
now.addkey(71)
now.addkey(72)
now.addkey(68)
// KAFKA-15831 587f50d48f8 KIP-1000
now.addkey(74) // 74 list client metrics
return now
}
func b38() *release {
now := b37().clone(3, 8)
now.incmax(0, 11)
now.incmax(10, 5)
now.incmax(16, 5)
now.incmax(22, 5)
now.incmax(24, 5)
now.incmax(25, 4)
now.incmax(26, 4)
now.incmax(28, 4)
now.incmax(66, 1)
now.addkey(69)
// KAFKA-15585 7e5ef9b509a KIP-966
now.addkey(75) // 75 describe topic partition
return now
}
func b39() *release {
now := b38().clone(3, 9)
// All version bumps here are commented above in zk or below in c.
now.incmax(1, 17)
now.incmax(2, 9)
now.incmax(10, 6)
now.incmax(18, 4)
now.incmax(55, 2)
now.addkey(80)
now.addkey(81)
return now
}
func b40() *release {
now := b39().clone(4, 0)
// KIP-896
setmin := func(key, vmin int16) {
req, ok := now.reqs[key]
if !ok {
panic(fmt.Sprintf("setmin on non-existent key %d", key))
}
req.vmin = vmin
now.reqs[key] = req
}
setmin(1, 4)
setmin(2, 1)
setmin(8, 2)
setmin(9, 1)
setmin(11, 2)
setmin(19, 2)
setmin(20, 1)
setmin(23, 2)
setmin(27, 1)
setmin(29, 1)
setmin(30, 1)
setmin(31, 1)
setmin(32, 1)
setmin(34, 1)
setmin(35, 1)
setmin(38, 1)
setmin(39, 1)
setmin(40, 1)
setmin(41, 1)
now.incmax(0, 12) // 12 produce KAFKA-14563 755adf8a566 KIP-890
now.incmax(2, 10) // 10 list offsets KAFKA-15859 560076ba9e8 KIP-1075
now.incmax(3, 13) // 13 metadata KAFKA-17885 52d2fa5c8b3 KIP-1102
now.incmax(15, 6) // 6 describe groups KAFKA-17550 e7d986e48c2 KIP-1043
now.incmax(26, 5) // 5 end txn KAFKA-14562 ede0c94aaae KIP-890
now.incmax(28, 5) // 5 txn offset commit KAFKA-14563 755adf8a566 KIP-890
now.incmax(57, 2) // documented on controller
now.incmax(60, 2) // documented on controller
now.incmax(68, 1) // 1 consumer group heartbeat KAFKA-17592 ab0df20489a KIP-848; includes KAFKA-17116 6f040cabc7c KIP-1082 in same release
now.incmax(69, 1) // 1 consumer group describe KAFKA-17750 fe88232b07c KIP-858
return now
}
func b41() *release {
now := b40().clone(4, 1)
now.incmax(0, 13) // 13 produce KAFKA-10551 6f783f85362 KIP-516
now.incmax(1, 18) // 18 fetch KAFKA-14145 742b327025f KIP-1166
now.incmax(45, 1) // 1 alter partition assignments KAFKA-14121 cbd72cc216e KIP-860
now.incmax(66, 2) // 2 list transactions KAFKA-19073 0c1fbf3aebb KIP-1152
now.incmax(74, 1) // 1 list config resources (rename & extend) KAFKA-18904 c26b09c6092 KIP-1142
// 8f82f14a483 for v0, KAFKA-16713 66147d5de7c KIP-932 for v1
now.addkeyver(76, 1) // 1 share group heartbeat
now.addkeyver(77, 1) // 1 share group describe
now.addkeyver(78, 1) // 1 share fetch
now.addkeyver(79, 1) // 1 share acknowledge
// KAFKA-16950 fecbfb81332 KIP-932
now.addkey(83) // 0 initialize share group state
now.addkey(84) // 0 read share group state
now.addkey(85) // 0 write share group state
now.addkey(86) // 0 delete share group state
now.addkey(87) // 0 read share group state summary
now.addkey(90) // 0 describe share group offsets e3e4c179592, then KAFKA-16720 952113e8e0e KIP-932
now.addkey(91) // 0 alter share group offsets KAFKA-16717 6a6b80215d8 KIP-932
now.addkey(92) // 0 delete share group offsets KAFKA-16718 63229a768ce KIP-932
return now
}
func btip() *release {
return b41()
}
///////////////////////////////
// KRAFT CONTROLLER VERSIONS //
///////////////////////////////
func c28() *release {
return &release{
major: 2,
minor: 8,
kind: kindController,
reqs: map[int16]req{
1: {key: 1, vmax: 12}, // fetch
3: {key: 3, vmax: 11}, // metadata
7: {key: 7, vmax: 3}, // controlled shutdown
17: {key: 17, vmax: 1}, // sasl handshake
18: {key: 18, vmax: 3}, // api versions
19: {key: 19, vmax: 7}, // create topics
20: {key: 20, vmax: 6}, // delete topics
36: {key: 36, vmax: 2}, // sasl authenticate
44: {key: 44, vmax: 1}, // incremental alter configs
49: {key: 49, vmax: 1}, // alter client quotas
// KAFKA-10492 b7c8490cf47b0c18253d6a776b2b35c76c71c65d KIP-595
//
// These are the first requests that are raft only. The commits
// showed up in the 2.7 branch, but KRaft as preview is only
// available at 2.8.
52: {key: 52, vmax: 0}, // vote
53: {key: 53, vmax: 0}, // begin quorum epoch
54: {key: 54, vmax: 0}, // end quorum epoch
55: {key: 55, vmax: 0}, // describe quorum
56: {key: 56, vmax: 0}, // alter partition
// KAFKA-10181 KAFKA-10181 KIP-590
58: {key: 58, vmax: 0}, // 58 envelope
59: {key: 59, vmax: 0}, // 59 fetch snapshot
// KAFKA-12248 a022072df3c8175950c03263d2bbf2e3ea7a7a5d KIP-500
// (commit mentions KIP-500, these are actually described in KIP-631)
// Broker registration was later updated in d9bb2ef596343da9402bff4903b129cff1f7c22b
62: {key: 62, vmax: 0}, // 62 broker registration
63: {key: 63, vmax: 0}, // 63 broker heartbeat
// KAFKA-12249 3f36f9a7ca153a9d221f6bedeb7d1503aa18eff1 KIP-500 / KIP-631
// Renamed from Decommission to Unregister in 06dce721ec0185d49fac37775dbf191d0e80e687
64: {key: 64, vmax: 0}, // 64 unregister broker
},
}
}
func c30() *release {
now := c28().clone(3, 0)
delete(now.reqs, 3) // metadata not present in controller 3.0
now.addkeyver(29, 2) // describe acls
now.addkeyver(30, 2) // create acls
now.addkeyver(31, 2) // delete acls
now.addkeyver(33, 2) // alter configs
now.addkeyver(37, 3) // create partitions
now.addkeyver(43, 2) // elect leaders
now.addkey(45) // alter partition assignments
now.addkey(46) // list partition reassignments
// KAFKA-12620 72d108274c98dca44514007254552481c731c958 KIP-730
// raft broker added in e97cff2702b6ba836c7925caa36ab18066a7c95d
now.addkey(67)
return now
}
func c31() *release {
now := c30().clone(3, 1)
now.incmax(1, 13)
return now
}
func c32() *release {
now := c31().clone(3, 2)
now.incmax(56, 1)
return now
}
func c33() *release {
now := c32().clone(3, 3)
now.incmax(29, 3)
now.incmax(30, 3)
now.incmax(31, 3)
now.incmax(55, 1)
now.incmax(56, 2)
now.addkeyver(57, 1)
return now
}
func c34() *release {
now := c33().clone(3, 4)
now.incmax(62, 1) // KAFKA-14304 7b7e40a536a (type change in 0bb05d8679b) KIP-866
return now
}
func c35() *release {
now := c34().clone(3, 5)
now.incmax(1, 14)
now.incmax(1, 15)
now.addkey(50)
now.addkey(51)
now.incmax(56, 3)
return now
}
func c36() *release {
now := c35().clone(3, 6)
now.addkeyver(38, 3)
now.addkeyver(39, 2)
now.addkeyver(40, 2)
now.addkeyver(41, 3)
return now
}
func c37() *release {
now := c36().clone(3, 7)
now.incmax(1, 16)
now.addkeyver(32, 4)
now.addkeyver(60, 1)
now.incmax(62, 2) // KAFKA-15355 a94bc8d6d52 KIP-858
now.incmax(62, 3) // KAFKA-15582 14029e2ddd1 KIP-966 (some later commit swapped the docs on which came first between this and prior line)
now.incmax(63, 1) // KAFKA-15355 0390d5b1a24 KIP-858 (adds tag... no version bump actually needed...)
// KAFKA-15369 41b695b6e30 KIP-919
now.addkey(70) // 70 controller registration
// KAFKA-15355 0390d5b1a24 KIP-858
now.addkey(73) // 73 assign replica to dirs
return now
}
func c38() *release {
now := c37().clone(3, 8) // no changes for controller broker this version
return now
}
func c39() *release {
now := c38().clone(3, 9)
now.incmax(1, 17)
now.incmax(18, 4)
// KAFKA-16527 adee6f0cc11 KIP-853 adds a bunch of fields to Vote/{Begin,End}QuorumEpoch
now.incmax(52, 1)
now.incmax(53, 1)
now.incmax(54, 1)
now.incmax(59, 1)
now.incmax(55, 2) // KAFKA-16520 aecaf444756 KIP-853
// KAFKA-17001 ede289db93f -- no kip, this is a bugfix
now.incmax(62, 4)
// KAFKA-16535 9ceed8f18f4 KIP-853
now.addkey(80) // 80 add raft voter
now.addkey(81) // 81 remove raft voter
now.addkey(82) // 82 update raft voter
return now
}
func c40() *release {
now := c39().clone(4, 0)
// KIP-896
setmin := func(key, vmin int16) {
req, ok := now.reqs[key]
if !ok {
panic(fmt.Sprintf("setmin on non-existent key %d", key))
}
req.vmin = vmin
now.reqs[key] = req
}
setmin(1, 4)
setmin(19, 2)
setmin(20, 1)
setmin(29, 1)
setmin(30, 1)
setmin(31, 1)
setmin(32, 1)
setmin(38, 1)
setmin(39, 1)
setmin(40, 1)
setmin(41, 1)
setmin(56, 2)
delete(now.reqs, 7)
now.incmax(52, 2) // KAFKA-17641 b73e31eb159 KIP-996 adds PreVote to Vote
now.incmax(57, 2) // KAFKA-16308 49d7ea6c6a2; no kip referenced
now.incmax(60, 2) // KAFKA-17094 747dc172e87 KIP-1073
return now
}
func c41() *release {
now := c40().clone(4, 1)
now.incmax(1, 18)
now.incmax(45, 1)
return now
}
func ctip() *release {
return c41()
}