dajac commented on code in PR #22443:
URL: https://github.com/apache/kafka/pull/22443#discussion_r3339344581
##########
clients/src/main/java/org/apache/kafka/clients/producer/internals/TransactionManager.java:
##########
@@ -1243,29 +1249,59 @@ private TxnRequestHandler
addPartitionsToTransactionHandler() {
private TxnOffsetCommitHandler
txnOffsetCommitHandler(TransactionalRequestResult result,
Map<TopicPartition,
OffsetAndMetadata> offsets,
ConsumerGroupMetadata groupMetadata) {
- for (Map.Entry<TopicPartition, OffsetAndMetadata> entry :
offsets.entrySet()) {
- OffsetAndMetadata offsetAndMetadata = entry.getValue();
- CommittedOffset committedOffset = new
CommittedOffset(offsetAndMetadata.offset(),
- offsetAndMetadata.metadata(),
offsetAndMetadata.leaderEpoch());
- pendingTxnOffsetCommits.put(entry.getKey(), committedOffset);
+ // Resolve topic ids from the metadata cache at request build time.
+ // KafkaProducer.sendOffsetsToTransaction has already ensured the cache
+ // is fresh for these topics, so this is a non-blocking lookup.
+ var topicIds = metadata.topicIds();
+ var requestTopicsByName = new HashMap<String,
TxnOffsetCommitRequestTopic>();
+ var topicNamesByIds = new HashMap<Uuid, String>();
+ var topics = new ArrayList<TxnOffsetCommitRequestTopic>();
+ var allHaveTopicIds = true;
+ for (var entry : offsets.entrySet()) {
+ var tp = entry.getKey();
+ var offsetAndMetadata = entry.getValue();
+ pendingTxnOffsetCommits.put(
+ tp,
+ new CommittedOffset(
+ offsetAndMetadata.offset(),
+ offsetAndMetadata.metadata(),
+ offsetAndMetadata.leaderEpoch()
+ )
+ );
+ var topicId = topicIds.getOrDefault(tp.topic(), Uuid.ZERO_UUID);
+ allHaveTopicIds &= !topicId.equals(Uuid.ZERO_UUID);
+ var topic = requestTopicsByName.computeIfAbsent(tp.topic(), name
-> {
+ var t = new
TxnOffsetCommitRequestTopic().setName(name).setTopicId(topicId);
+ topics.add(t);
+ if (!topicId.equals(Uuid.ZERO_UUID)) {
+ topicNamesByIds.put(topicId, name);
+ }
+ return t;
+ });
+ topic.partitions().add(new
TxnOffsetCommitRequestData.TxnOffsetCommitRequestPartition()
+ .setPartitionIndex(tp.partition())
+ .setCommittedOffset(offsetAndMetadata.offset())
+
.setCommittedLeaderEpoch(offsetAndMetadata.leaderEpoch().orElse(RecordBatch.NO_PARTITION_LEADER_EPOCH))
+ .setCommittedMetadata(offsetAndMetadata.metadata()));
}
- final TxnOffsetCommitRequestData data = new
TxnOffsetCommitRequestData()
+ var data = new TxnOffsetCommitRequestData()
.setTransactionalId(transactionalId)
.setGroupId(groupMetadata.groupId())
.setProducerId(producerIdAndEpoch.producerId)
.setProducerEpoch(producerIdAndEpoch.epoch)
.setMemberId(groupMetadata.memberId())
.setGenerationIdOrMemberEpoch(groupMetadata.generationId())
.setGroupInstanceId(groupMetadata.groupInstanceId().orElse(null))
-
.setTopics(TxnOffsetCommitRequest.getTopics(pendingTxnOffsetCommits));
- final TxnOffsetCommitRequest.Builder builder =
- TxnOffsetCommitRequest.Builder.forTopicNames(data,
isTransactionV2Enabled());
+ .setTopics(topics);
+ var builder = allHaveTopicIds
+ ? TxnOffsetCommitRequest.Builder.forTopicIdsOrNames(data,
isTransactionV2Enabled(), true)
Review Comment:
it is already handled by `error.exception() instanceof RetriableException`
as `UNKNOWN_TOPIC_ID` is a `RetriableException` exception. there is also a test
covering it: `testTxnOffsetCommitRetriesOnUnknownTopicIdAtV6`.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]