mirror of https://github.com/apache/kafka.git
KAFKA-16669 Remove extra collection copy when generating DescribeAclsResource (#15924)
Reviewers: Chia-Ping Tsai <chia7712@gmail.com>
This commit is contained in:
parent
4a37c2e18f
commit
768e90f667
|
|
@ -28,12 +28,13 @@ import org.apache.kafka.common.protocol.Errors;
|
|||
|
||||
import java.nio.ByteBuffer;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
|
|
@ -137,15 +138,15 @@ public class DescribeAclsResponse extends AbstractResponse {
|
|||
return resources.stream().flatMap(DescribeAclsResponse::aclBindings).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
public static List<DescribeAclsResource> aclsResources(Collection<AclBinding> acls) {
|
||||
Map<ResourcePattern, List<AccessControlEntry>> patternToEntries = new HashMap<>();
|
||||
public static List<DescribeAclsResource> aclsResources(Iterable<AclBinding> acls) {
|
||||
Map<ResourcePattern, Set<AccessControlEntry>> patternToEntries = new HashMap<>();
|
||||
for (AclBinding acl : acls) {
|
||||
patternToEntries.computeIfAbsent(acl.pattern(), v -> new ArrayList<>()).add(acl.entry());
|
||||
patternToEntries.computeIfAbsent(acl.pattern(), v -> new HashSet<>()).add(acl.entry());
|
||||
}
|
||||
List<DescribeAclsResource> resources = new ArrayList<>(patternToEntries.size());
|
||||
for (Entry<ResourcePattern, List<AccessControlEntry>> entry : patternToEntries.entrySet()) {
|
||||
for (Entry<ResourcePattern, Set<AccessControlEntry>> entry : patternToEntries.entrySet()) {
|
||||
ResourcePattern key = entry.getKey();
|
||||
List<AclDescription> aclDescriptions = new ArrayList<>();
|
||||
List<AclDescription> aclDescriptions = new ArrayList<>(entry.getValue().size());
|
||||
for (AccessControlEntry ace : entry.getValue()) {
|
||||
AclDescription ad = new AclDescription()
|
||||
.setHost(ace.host())
|
||||
|
|
|
|||
|
|
@ -68,12 +68,10 @@ class AclApis(authHelper: AuthHelper,
|
|||
describeAclsRequest.version))
|
||||
case Some(auth) =>
|
||||
val filter = describeAclsRequest.filter
|
||||
val returnedAcls = new util.HashSet[AclBinding]()
|
||||
auth.acls(filter).forEach(returnedAcls.add)
|
||||
requestHelper.sendResponseMaybeThrottle(request, requestThrottleMs =>
|
||||
new DescribeAclsResponse(new DescribeAclsResponseData()
|
||||
.setThrottleTimeMs(requestThrottleMs)
|
||||
.setResources(DescribeAclsResponse.aclsResources(returnedAcls)),
|
||||
.setResources(DescribeAclsResponse.aclsResources(auth.acls(filter))),
|
||||
describeAclsRequest.version))
|
||||
}
|
||||
CompletableFuture.completedFuture[Unit](())
|
||||
|
|
|
|||
Loading…
Reference in New Issue