DL1231 commented on code in PR #19820:
URL: https://github.com/apache/kafka/pull/19820#discussion_r2165943288
##########
tools/src/main/java/org/apache/kafka/tools/consumer/group/ShareGroupCommand.java:
##########
@@ -366,6 +378,71 @@ Entry<Throwable, Map<String, Throwable>>
sendDeleteShareGroupOffsetsRequest(Stri
return new SimpleImmutableEntry<>(topLevelException,
topicLevelResult);
}
+ void resetOffsets() throws ExecutionException, InterruptedException {
+ String groupId = opts.options.valueOf(opts.groupOpt);
+ Map<TopicPartition, OffsetAndMetadata> offsetsToReset =
prepareOffsetsToReset(groupId);
+ boolean dryRun = opts.options.has(opts.dryRunOpt) ||
!opts.options.has(opts.executeOpt);
+ if (!dryRun) {
+ adminClient.alterShareGroupOffsets(groupId,
+ offsetsToReset.entrySet().stream()
+ .collect(Collectors.toMap(
+ Entry::getKey,
+ entry -> entry.getValue().offset()
+ ))
+ ).all().get();
+ }
+ Set<SharePartitionOffsetInformation> partitionOffsets =
mapOffsetsToSharePartitionInformation(groupId, offsetsToReset);
+ Map<String, ShareGroupDescription> shareGroups =
describeShareGroups(Collections.singleton(groupId));
+ TreeMap<String, Entry<ShareGroupDescription,
Collection<SharePartitionOffsetInformation>>> groupOffsets = new TreeMap<>();
+ shareGroups.forEach((id, description) -> groupOffsets.put(id, new
SimpleImmutableEntry<>(description, partitionOffsets)));
+ printOffsets(groupOffsets, opts.options.has(opts.verboseOpt));
+ }
+
+ private Map<TopicPartition, OffsetAndMetadata>
prepareOffsetsToReset(String groupId) throws ExecutionException,
InterruptedException {
+ Map<String, ListShareGroupOffsetsSpec> groupSpecs =
Map.of(groupId, new ListShareGroupOffsetsSpec());
+ Map<TopicPartition, OffsetAndMetadata> offsetsByTopicPartitions =
adminClient.listShareGroupOffsets(groupSpecs).all().get().get(groupId);
+
+ if (opts.options.has(opts.topicOpt)) {
+ Set<String> topics =
Set.copyOf(opts.options.valuesOf(opts.topicOpt));
+ Set<String> existsTopics =
offsetsByTopicPartitions.keySet().stream()
+ .map(TopicPartition::topic)
+ .collect(Collectors.toSet());
+ if (!existsTopics.containsAll(topics)) {
+ CommandLineUtils
+ .printUsageAndExit(opts.parser, String.format("Some
topics %s do not exist in share group '%s'.",
+ topics.stream().filter(topic ->
!existsTopics.contains(topic)).collect(Collectors.joining(", ")), groupId));
+ }
+
+ offsetsByTopicPartitions =
offsetsByTopicPartitions.entrySet().stream()
+ .filter(entry -> {
+ TopicPartition topicPartition = entry.getKey();
+ return topics.contains(topicPartition.topic());
+ })
Review Comment:
```suggestion
.filter(entry -> topics.contains(entry.getKey().topic()))
```
##########
group-coordinator/src/main/java/org/apache/kafka/coordinator/group/GroupCoordinatorService.java:
##########
@@ -682,15 +682,48 @@ CompletableFuture<AlterShareGroupOffsetsResponseData>
persisterInitialize(
handlePersisterInitializeResponse(request.groupTopicPartitionData().groupId(),
result, new ShareGroupHeartbeatResponseData());
return response;
} else {
- //TODO build new AlterShareGroupOffsetsResponseData
for error response
- return response;
+ return buildErrorResponse(response, result);
}
} else {
return buildErrorResponse(request, response, exp);
}
});
}
+
+ private AlterShareGroupOffsetsResponseData
buildErrorResponse(AlterShareGroupOffsetsResponseData response,
InitializeShareGroupStateResult result) {
+ AlterShareGroupOffsetsResponseData data = new
AlterShareGroupOffsetsResponseData();
+ data.setResponses(
+ new
AlterShareGroupOffsetsResponseData.AlterShareGroupOffsetsResponseTopicCollection(response.responses().stream()
+ .map(topic -> {
+
AlterShareGroupOffsetsResponseData.AlterShareGroupOffsetsResponseTopic
topicData = new
AlterShareGroupOffsetsResponseData.AlterShareGroupOffsetsResponseTopic()
+ .setTopicName(topic.topicName());
+ Map<Uuid, Map<Integer, PartitionErrorData>>
topicPartitionErrorsMap = result.getErrors();
+ topic.partitions().forEach(partition -> {
+ if (partition.errorCode() != Errors.NONE.code()) {
+ topicData.partitions().add(partition);
+ return;
+ }
+
AlterShareGroupOffsetsResponseData.AlterShareGroupOffsetsResponsePartition
partitionData;
+ PartitionErrorData error =
topicPartitionErrorsMap.get(topic.topicId()).get(partition.partitionIndex());
+ if (error == null) {
+ partitionData = new
AlterShareGroupOffsetsResponseData.AlterShareGroupOffsetsResponsePartition()
+ .setPartitionIndex(partition.partitionIndex())
+ .setErrorCode(Errors.NONE.code());
+ } else {
+ partitionData = new
AlterShareGroupOffsetsResponseData.AlterShareGroupOffsetsResponsePartition()
+ .setPartitionIndex(partition.partitionIndex())
+ .setErrorCode(error.errorCode())
+ .setErrorMessage(error.errorMessage());
+ }
+ topicData.partitions().add(partitionData);
+ });
+ return topicData;
+ })
+ .iterator()));
+ return data;
+
Review Comment:
nit: extra blank
--
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]