Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

transactions #44

Draft
wants to merge 25 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
5540cd2
coordiator type
shortishly Sep 20, 2024
18b0697
Merge branch 'main' into 17-transactions
shortishly Sep 21, 2024
572f33f
stub nop txn scaffolding
shortishly Sep 21, 2024
a3aa46d
stub for txn offset commit
shortishly Sep 21, 2024
cfc2c6f
upated kafka protocol definitions
shortishly Sep 26, 2024
363fb23
Merge branch 'main' into 17-transactions
shortishly Oct 11, 2024
e895f96
Merge branch 'main' into 17-transactions
shortishly Oct 14, 2024
81fe515
Merge branch '72-move-all-s3-support-into-dynostore' into 17-transact…
shortishly Oct 15, 2024
69c618a
wip for init producer id
shortishly Oct 15, 2024
4e20c4a
Merge branch 'main' into 17-transactions
shortishly Oct 15, 2024
8530092
init producer id, basic rules using version data
shortishly Oct 16, 2024
c1d6174
non tx idempotent with dynostore, &mut on storage trait
shortishly Oct 18, 2024
927c117
Merge branch 'main' into 17-transactions
shortishly Oct 18, 2024
b08400c
Merge branch '78-stop-using-serial-in-postgres-storage-engine' into 1…
shortishly Oct 18, 2024
fae035b
non txn init producer id for postgres
shortishly Oct 18, 2024
38a0d91
Merge branch 'main' into 17-transactions
shortishly Oct 19, 2024
819032e
Merge branch 'main' into 17-transactions
shortishly Oct 19, 2024
cfb7204
Merge branch 'main' into 17-transactions
shortishly Oct 20, 2024
8011c0d
Merge branch 'main' into 17-transactions
shortishly Oct 21, 2024
568e1b5
condition data with_mut handle existing data
shortishly Oct 21, 2024
61191fb
use include_str! for sql, offset per tp for postgres storage
shortishly Oct 24, 2024
3e60b45
pg e2e topic lifecycle
shortishly Oct 25, 2024
3416391
externalise/update the sql used for committing an offset
shortishly Oct 25, 2024
4e2c465
ongoing txn support: fetch isolation, pg txn integration tests, water…
shortishly Oct 28, 2024
741d260
pg simple commit transaction test
shortishly Oct 30, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .env
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,8 @@ AWS_ALLOW_HTTP="true"
# minio storage engine
# create a bucket "tansu" at: http://localhost:9001/buckets
# or: mc mb local/tansu
STORAGE_ENGINE="minio=s3://tansu/"
# STORAGE_ENGINE="minio=s3://tansu/"

# PostgreSQL storage engine
# STORAGE_ENGINE="pg=postgres://postgres:postgres@db"
# STORAGE_ENGINE="pg=postgres://postgres:postgres@localhost"
STORAGE_ENGINE="pg=postgres://postgres:postgres@localhost"
5 changes: 5 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,13 @@ jobs:
matrix:
os:
- ubuntu-latest
pg:
- postgres:16
steps:
- uses: actions/checkout@v4
- run: docker compose up --detach db
env:
POSTGRES_IMAGE: ${{matrix.pg}}
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
components: clippy, rustfmt
Expand Down
2 changes: 1 addition & 1 deletion compose.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
---
services:
db:
image: postgres:16.4
image: ${POSTGRES_IMAGE:-postgres:16.4}
environment:
PGUSER: postgres
POSTGRES_PASSWORD: postgres
Expand Down
2 changes: 1 addition & 1 deletion justfile
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ test:
cargo test --workspace --all-targets

clippy:
cargo clippy --all-targets
cargo clippy --all-targets -- -D warnings

fmt:
cargo fmt --all
Expand Down
2 changes: 1 addition & 1 deletion tansu-kafka-sans-io/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1127,7 +1127,7 @@ fn all(pattern: &str) -> Result<Vec<Message>> {
.and_then(|mut paths| {
paths.try_fold(Vec::new(), |mut acc, p| {
p.map_err(Into::into)
// .inspect(|path| eprintln!("path: {path:?}"))
.inspect(|path| println!("cargo::rerun-if-changed={}", path.display()))
.and_then(read_value)
.and_then(|v| Message::try_from(&Wv::from(&v)).map_err(Into::into))
.map(|m| {
Expand Down
4 changes: 3 additions & 1 deletion tansu-kafka-sans-io/message/AddOffsetsToTxnRequest.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@
// Version 2 adds the support for new error code PRODUCER_FENCED.
//
// Version 3 enables flexible versions.
"validVersions": "0-3",
//
// Version 4 adds support for new error code TRANSACTION_ABORTABLE (KIP-890).
"validVersions": "0-4",
"flexibleVersions": "3+",
"fields": [
{ "name": "TransactionalId", "type": "string", "versions": "0+", "entityType": "transactionalId",
Expand Down
4 changes: 3 additions & 1 deletion tansu-kafka-sans-io/message/AddOffsetsToTxnResponse.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@
// Version 2 adds the support for new error code PRODUCER_FENCED.
//
// Version 3 enables flexible versions.
"validVersions": "0-3",
//
// Version 4 adds support for new error code TRANSACTION_ABORTABLE (KIP-890).
"validVersions": "0-4",
"flexibleVersions": "3+",
"fields": [
{ "name": "ThrottleTimeMs", "type": "int32", "versions": "0+",
Expand Down
4 changes: 3 additions & 1 deletion tansu-kafka-sans-io/message/AddPartitionsToTxnRequest.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,11 @@
// Version 3 enables flexible versions.
//
// Version 4 adds VerifyOnly field to check if partitions are already in transaction and adds support to batch multiple transactions.
//
// Version 5 adds support for new error code TRANSACTION_ABORTABLE (KIP-890).
// Versions 3 and below will be exclusively used by clients and versions 4 and above will be used by brokers.
"latestVersionUnstable": false,
"validVersions": "0-4",
"validVersions": "0-5",
"flexibleVersions": "3+",
"fields": [
{ "name": "Transactions", "type": "[]AddPartitionsToTxnTransaction", "versions": "4+",
Expand Down
4 changes: 3 additions & 1 deletion tansu-kafka-sans-io/message/AddPartitionsToTxnResponse.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@
// Version 3 enables flexible versions.
//
// Version 4 adds support to batch multiple transactions and a top level error code.
"validVersions": "0-4",
//
// Version 5 adds support for new error code TRANSACTION_ABORTABLE (KIP-890).
"validVersions": "0-5",
"flexibleVersions": "3+",
"fields": [
{ "name": "ThrottleTimeMs", "type": "int32", "versions": "0+",
Expand Down
4 changes: 0 additions & 4 deletions tansu-kafka-sans-io/message/ConsumerGroupDescribeRequest.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,6 @@
"listeners": ["zkBroker", "broker"],
"name": "ConsumerGroupDescribeRequest",
"validVersions": "0",
// The ConsumerGroupDescribe API is added as part of KIP-848 and is still
// under development. Hence, the API is not exposed by default by brokers
// unless explicitly enabled.
"latestVersionUnstable": true,
"flexibleVersions": "0+",
"fields": [
{ "name": "GroupIds", "type": "[]string", "versions": "0+", "entityType": "groupId",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,13 +87,7 @@
]},
{ "name": "Assignment", "versions": "0+", "fields": [
{ "name": "TopicPartitions", "type": "[]TopicPartitions", "versions": "0+",
"about": "The assigned topic-partitions to the member." },
{ "name": "Error", "type": "int8", "versions": "0+",
"about": "The assigned error." },
{ "name": "MetadataVersion", "type": "int32", "versions": "0+",
"about": "The assignor metadata version." },
{ "name": "MetadataBytes", "type": "bytes", "versions": "0+",
"about": "The assignor metadata bytes." }
"about": "The assigned topic-partitions to the member." }
]}
]
}
40 changes: 40 additions & 0 deletions tansu-kafka-sans-io/message/DescribeTopicPartitionsRequest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

{
"apiKey": 75,
"type": "request",
"listeners": ["broker"],
"name": "DescribeTopicPartitionsRequest",
"validVersions": "0",
"flexibleVersions": "0+",
"fields": [
{ "name": "Topics", "type": "[]TopicRequest", "versions": "0+",
"about": "The topics to fetch details for.",
"fields": [
{ "name": "Name", "type": "string", "versions": "0+",
"about": "The topic name", "versions": "0+", "entityType": "topicName"}
]
},
{ "name": "ResponsePartitionLimit", "type": "int32", "versions": "0+", "default": "2000",
"about": "The maximum number of partitions included in the response." },
{ "name": "Cursor", "type": "Cursor", "versions": "0+", "nullableVersions": "0+", "default": "null",
"about": "The first topic and partition index to fetch details for.", "fields": [
{ "name": "TopicName", "type": "string", "versions": "0+",
"about": "The name for the first topic to process", "versions": "0+", "entityType": "topicName"},
{ "name": "PartitionIndex", "type": "int32", "versions": "0+", "about": "The partition index to start with"}
]}
]
}
66 changes: 66 additions & 0 deletions tansu-kafka-sans-io/message/DescribeTopicPartitionsResponse.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

{
"apiKey": 75,
"type": "response",
"name": "DescribeTopicPartitionsResponse",
"validVersions": "0",
"flexibleVersions": "0+",
"fields": [
{ "name": "ThrottleTimeMs", "type": "int32", "versions": "0+", "ignorable": true,
"about": "The duration in milliseconds for which the request was throttled due to a quota violation, or zero if the request did not violate any quota." },
{ "name": "Topics", "type": "[]DescribeTopicPartitionsResponseTopic", "versions": "0+",
"about": "Each topic in the response.", "fields": [
{ "name": "ErrorCode", "type": "int16", "versions": "0+",
"about": "The topic error, or 0 if there was no error." },
{ "name": "Name", "type": "string", "versions": "0+", "mapKey": true, "entityType": "topicName", "nullableVersions": "0+",
"about": "The topic name." },
{ "name": "TopicId", "type": "uuid", "versions": "0+", "ignorable": true, "about": "The topic id." },
{ "name": "IsInternal", "type": "bool", "versions": "0+", "default": "false", "ignorable": true,
"about": "True if the topic is internal." },
{ "name": "Partitions", "type": "[]DescribeTopicPartitionsResponsePartition", "versions": "0+",
"about": "Each partition in the topic.", "fields": [
{ "name": "ErrorCode", "type": "int16", "versions": "0+",
"about": "The partition error, or 0 if there was no error." },
{ "name": "PartitionIndex", "type": "int32", "versions": "0+",
"about": "The partition index." },
{ "name": "LeaderId", "type": "int32", "versions": "0+", "entityType": "brokerId",
"about": "The ID of the leader broker." },
{ "name": "LeaderEpoch", "type": "int32", "versions": "0+", "default": "-1", "ignorable": true,
"about": "The leader epoch of this partition." },
{ "name": "ReplicaNodes", "type": "[]int32", "versions": "0+", "entityType": "brokerId",
"about": "The set of all nodes that host this partition." },
{ "name": "IsrNodes", "type": "[]int32", "versions": "0+", "entityType": "brokerId",
"about": "The set of nodes that are in sync with the leader for this partition." },
{ "name": "EligibleLeaderReplicas", "type": "[]int32", "default": "null", "entityType": "brokerId",
"versions": "0+", "nullableVersions": "0+",
"about": "The new eligible leader replicas otherwise." },
{ "name": "LastKnownElr", "type": "[]int32", "default": "null", "entityType": "brokerId",
"versions": "0+", "nullableVersions": "0+",
"about": "The last known ELR." },
{ "name": "OfflineReplicas", "type": "[]int32", "versions": "0+", "ignorable": true, "entityType": "brokerId",
"about": "The set of offline replicas of this partition." }]},
{ "name": "TopicAuthorizedOperations", "type": "int32", "versions": "0+", "default": "-2147483648",
"about": "32-bit bitfield to represent authorized operations for this topic." }]
},
{ "name": "NextCursor", "type": "Cursor", "versions": "0+", "nullableVersions": "0+", "default": "null",
"about": "The next topic and partition index to fetch details for.", "fields": [
{ "name": "TopicName", "type": "string", "versions": "0+",
"about": "The name for the first topic to process", "versions": "0+", "entityType": "topicName"},
{ "name": "PartitionIndex", "type": "int32", "versions": "0+", "about": "The partition index to start with"}
]}
]
}
4 changes: 3 additions & 1 deletion tansu-kafka-sans-io/message/EndTxnRequest.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@
// Version 2 adds the support for new error code PRODUCER_FENCED.
//
// Version 3 enables flexible versions.
"validVersions": "0-3",
//
// Version 4 adds support for new error code TRANSACTION_ABORTABLE (KIP-890).
"validVersions": "0-4",
"flexibleVersions": "3+",
"fields": [
{ "name": "TransactionalId", "type": "string", "versions": "0+", "entityType": "transactionalId",
Expand Down
4 changes: 3 additions & 1 deletion tansu-kafka-sans-io/message/EndTxnResponse.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,9 @@
// Version 2 adds the support for new error code PRODUCER_FENCED.
//
// Version 3 enables flexible versions.
"validVersions": "0-3",
//
// Version 4 adds support for new error code TRANSACTION_ABORTABLE (KIP-890).
"validVersions": "0-4",
"flexibleVersions": "3+",
"fields": [
{ "name": "ThrottleTimeMs", "type": "int32", "versions": "0+",
Expand Down
4 changes: 3 additions & 1 deletion tansu-kafka-sans-io/message/FindCoordinatorRequest.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@
// Version 3 is the first flexible version.
//
// Version 4 adds support for batching via CoordinatorKeys (KIP-699)
"validVersions": "0-4",
//
// Version 5 adds support for new error code TRANSACTION_ABORTABLE (KIP-890).
"validVersions": "0-5",
"deprecatedVersions": "0",
"flexibleVersions": "3+",
"fields": [
Expand Down
4 changes: 3 additions & 1 deletion tansu-kafka-sans-io/message/FindCoordinatorResponse.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@
// Version 3 is the first flexible version.
//
// Version 4 adds support for batching via Coordinators (KIP-699)
"validVersions": "0-4",
//
// Version 5 adds support for new error code TRANSACTION_ABORTABLE (KIP-890).
"validVersions": "0-5",
"flexibleVersions": "3+",
"fields": [
{ "name": "ThrottleTimeMs", "type": "int32", "versions": "1+", "ignorable": true,
Expand Down
4 changes: 3 additions & 1 deletion tansu-kafka-sans-io/message/InitProducerIdRequest.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@
// Version 3 adds ProducerId and ProducerEpoch, allowing producers to try to resume after an INVALID_PRODUCER_EPOCH error
//
// Version 4 adds the support for new error code PRODUCER_FENCED.
"validVersions": "0-4",
//
// Verison 5 adds support for new error code TRANSACTION_ABORTABLE (KIP-890).
"validVersions": "0-5",
"flexibleVersions": "2+",
"fields": [
{ "name": "TransactionalId", "type": "string", "versions": "0+", "nullableVersions": "0+", "entityType": "transactionalId",
Expand Down
4 changes: 3 additions & 1 deletion tansu-kafka-sans-io/message/InitProducerIdResponse.json
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@
// Version 3 is the same as version 2.
//
// Version 4 adds the support for new error code PRODUCER_FENCED.
"validVersions": "0-4",
//
// Version 5 adds support for new error code TRANSACTION_ABORTABLE (KIP-890).
"validVersions": "0-5",
"flexibleVersions": "2+",
"fields": [
{ "name": "ThrottleTimeMs", "type": "int32", "versions": "0+", "ignorable": true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,12 @@
"fields": [
{ "name": "ThrottleTimeMs", "type": "int32", "versions": "0+",
"about": "The duration in milliseconds for which the request was throttled due to a quota violation, or zero if the request did not violate any quota." },
{ "name": "ErrorCode", "type": "int16", "versions": "0+" },
{ "name": "ClientMetricsResources", "type": "[]ClientMetricsResource", "versions": "0+", "fields": [
{ "name": "Name", "type": "string", "versions": "0+" }
{ "name": "ErrorCode", "type": "int16", "versions": "0+",
"about": "The error code, or 0 if there was no error." },
{ "name": "ClientMetricsResources", "type": "[]ClientMetricsResource", "versions": "0+",
"about": "Each client metrics resource in the response.", "fields": [
{ "name": "Name", "type": "string", "versions": "0+",
"about": "The resource name." }
]}
]
}
6 changes: 5 additions & 1 deletion tansu-kafka-sans-io/message/ListTransactionsRequest.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,18 @@
"type": "request",
"listeners": ["zkBroker", "broker"],
"name": "ListTransactionsRequest",
"validVersions": "0",
// Version 1: adds DurationFilter to list transactions older than specified duration
"validVersions": "0-1",
"flexibleVersions": "0+",
"fields": [
{ "name": "StateFilters", "type": "[]string", "versions": "0+",
"about": "The transaction states to filter by: if empty, all transactions are returned; if non-empty, then only transactions matching one of the filtered states will be returned"
},
{ "name": "ProducerIdFilters", "type": "[]int64", "versions": "0+", "entityType": "producerId",
"about": "The producerIds to filter by: if empty, all transactions will be returned; if non-empty, only transactions which match one of the filtered producerIds will be returned"
},
{ "name": "DurationFilter", "type": "int64", "versions": "1+", "default": -1,
"about": "Duration (in millis) to filter by: if < 0, all transactions will be returned; otherwise, only transactions running longer than this duration will be returned"
}
]
}
3 changes: 2 additions & 1 deletion tansu-kafka-sans-io/message/ListTransactionsResponse.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@
"apiKey": 66,
"type": "response",
"name": "ListTransactionsResponse",
"validVersions": "0",
// Version 1 is the same as version 0 (KIP-994).
"validVersions": "0-1",
"flexibleVersions": "0+",
"fields": [
{ "name": "ThrottleTimeMs", "type": "int32", "versions": "0+",
Expand Down
7 changes: 4 additions & 3 deletions tansu-kafka-sans-io/message/MetadataResponse.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
{ "name": "ThrottleTimeMs", "type": "int32", "versions": "3+", "ignorable": true,
"about": "The duration in milliseconds for which the request was throttled due to a quota violation, or zero if the request did not violate any quota." },
{ "name": "Brokers", "type": "[]MetadataResponseBroker", "versions": "0+",
"about": "Each broker in the response.", "fields": [
"about": "A list of brokers present in the cluster.", "fields": [
{ "name": "NodeId", "type": "int32", "versions": "0+", "mapKey": true, "entityType": "brokerId",
"about": "The broker ID." },
{ "name": "Host", "type": "string", "versions": "0+",
Expand All @@ -67,8 +67,9 @@
{ "name": "ErrorCode", "type": "int16", "versions": "0+",
"about": "The topic error, or 0 if there was no error." },
{ "name": "Name", "type": "string", "versions": "0+", "mapKey": true, "entityType": "topicName", "nullableVersions": "12+",
"about": "The topic name." },
{ "name": "TopicId", "type": "uuid", "versions": "10+", "ignorable": true, "about": "The topic id." },
"about": "The topic name. Null for non-existing topics queried by ID. This is never null when ErrorCode is zero. One of Name and TopicId is always populated." },
{ "name": "TopicId", "type": "uuid", "versions": "10+", "ignorable": true,
"about": "The topic id. Zero for non-existing topics queried by name. This is never zero when ErrorCode is zero. One of Name and TopicId is always populated." },
{ "name": "IsInternal", "type": "bool", "versions": "1+", "default": "false", "ignorable": true,
"about": "True if the topic is internal." },
{ "name": "Partitions", "type": "[]MetadataResponsePartition", "versions": "0+",
Expand Down
4 changes: 3 additions & 1 deletion tansu-kafka-sans-io/message/ProduceRequest.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,9 @@
// Version 9 enables flexible versions.
//
// Version 10 is the same as version 9 (KIP-951).
"validVersions": "0-10",
//
// Version 11 adds support for new error code TRANSACTION_ABORTABLE (KIP-890).
"validVersions": "0-11",
"deprecatedVersions": "0-6",
"flexibleVersions": "9+",
"fields": [
Expand Down
4 changes: 3 additions & 1 deletion tansu-kafka-sans-io/message/ProduceResponse.json
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,9 @@
// Version 9 enables flexible versions.
//
// Version 10 adds 'CurrentLeader' and 'NodeEndpoints' as tagged fields (KIP-951)
"validVersions": "0-10",
//
// Version 11 adds support for new error code TRANSACTION_ABORTABLE (KIP-890).
"validVersions": "0-11",
"flexibleVersions": "9+",
"fields": [
{ "name": "Responses", "type": "[]TopicProduceResponse", "versions": "0+",
Expand Down
4 changes: 3 additions & 1 deletion tansu-kafka-sans-io/message/TxnOffsetCommitRequest.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@
// Version 2 adds the committed leader epoch.
//
// Version 3 adds the member.id, group.instance.id and generation.id.
"validVersions": "0-3",
//
// Version 4 adds support for new error code TRANSACTION_ABORTABLE (KIP-890).
"validVersions": "0-4",
"flexibleVersions": "3+",
"fields": [
{ "name": "TransactionalId", "type": "string", "versions": "0+", "entityType": "transactionalId",
Expand Down
Loading