keith-turner commented on code in PR #113:
URL: https://github.com/apache/accumulo-access/pull/113#discussion_r2942064057
##########
modules/core/src/main/java/org/apache/accumulo/access/impl/AccessEvaluatorImpl.java:
##########
@@ -43,7 +45,27 @@ public final class AccessEvaluatorImpl implements
AccessEvaluator {
*/
AccessEvaluatorImpl(Predicate<String> authorizationChecker,
AuthorizationValidator authorizationValidator) {
- this.authorizedPredicate = auth ->
authorizationChecker.test(auth.toString());
+
+ // This map helps avoid allocating string objects on each call to this
predicate
+ Map<CharsWrapper,Boolean> checkCache = new ConcurrentHashMap<>();
+ this.authorizedPredicate = auth -> {
+ if (auth instanceof CharsWrapper wrapped) {
+ // Try to avoid allocating a string object and copying the char array.
+ Boolean cachedResult = checkCache.get(wrapped);
+ if (cachedResult == null) {
+ // Not in cache, so have to allocate and copy
+ String authStr = wrapped.toString();
+ cachedResult = authorizationChecker.test(authStr);
Review Comment:
>Probably really shouldn't use CharsWrapper as key in the map either, since
it's mutable. We should probably use an immutable type.
IMO the current code is fine, it does require some understanding though.
The map is populated once w/ copies and then each threads that queries it has
its own reusable chars wrapper. I will add some comments about this higher
level pattern in the code.
--
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]