commit 7c829327b09f13278024277adbc57eb8f996383e Author: Patrick Hiesel Date: Thu Oct 15 15:42:09 2020 +0200 DefaultPermissionBackend: Reuse current user where possible We have recently removed PerThreadCache. This has caused a latency regression that seems to be caused by the fact that we evaluate group memberships of the current user way too often compared to before. IdentifiedUser caches group memberships locally in a variable. PermissionBackend#absentUser is used also when we are in doubt of who we are checking permissions for. This change checks if we are asserting the permissions of the current user and - if so - just use the current user which is a singleton instance per request. Change-Id: I63ae7c1f905347f788599077053e9bf97ddbb9f3 diff --git a/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java b/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java index 49df653..7934d60 100644 --- a/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java +++ b/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java @@ -80,8 +80,15 @@ public class DefaultPermissionBackend extends PermissionBackend { @Override public WithUser absentUser(Account.Id id) { - IdentifiedUser identifiedUser = identifiedUserFactory.create(requireNonNull(id, "user")); - return new WithUserImpl(identifiedUser); + requireNonNull(id, "user"); + CurrentUser user = currentUser.get(); + if (user.isIdentifiedUser() && id.equals(user.asIdentifiedUser().getAccountId())) { + // What looked liked an absent user is actually the current caller. Use the per-request + // singleton IdentifiedUser instead of constructing a new object to leverage caching in member + // variables of IdentifiedUser. + return new WithUserImpl(user.asIdentifiedUser()); + } + return new WithUserImpl(identifiedUserFactory.create(requireNonNull(id, "user"))); } @Override