diff options
author | Luca Milanesio <luca.milanesio@gmail.com> | 2022-02-27 00:01:12 +0000 |
---|---|---|
committer | Luca Milanesio <luca.milanesio@gmail.com> | 2022-02-28 13:06:10 +0000 |
commit | 6030d8f6e89c7ae11ce3a3557f6cc329b8e0128d (patch) | |
tree | c38d32c4488f731fdf0f34d3667f902b40ec37bd | |
parent | 8066f3534a5fa8a48f1b6d5064cc652624a10832 (diff) |
Compute the ProjectState only when needed
The DefaultPermissionBackend envisaged the need of
of a thread-specific cache for avoid creating
and parsing the permissions of a project multiple times
during the same API execution.
However, the change missed the inclusion of the ProjectState
creation inside the lambda, causing the parsing of the ProjectConfig
multiple times for the same project even when it was unneeded because
the ForProject object was already cached.
Release-Notes: Improve performance in ACL permissions evaluation
Change-Id: Ia28419dd6912ef712630554184abb47ed63b68a9
-rw-r--r-- | java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java b/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java index 66299a8c73..aa49852447 100644 --- a/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java +++ b/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java @@ -36,7 +36,6 @@ import com.google.gerrit.server.PeerDaemonUser; import com.google.gerrit.server.account.CapabilityCollection; import com.google.gerrit.server.cache.PerThreadCache; import com.google.gerrit.server.project.ProjectCache; -import com.google.gerrit.server.project.ProjectState; import com.google.inject.Inject; import com.google.inject.Provider; import com.google.inject.Singleton; @@ -124,11 +123,12 @@ public class DefaultPermissionBackend extends PermissionBackend { @Override public ForProject project(Project.NameKey project) { try { - ProjectState state = projectCache.get(project).orElseThrow(illegalState(project)); ProjectControl control = PerThreadCache.getOrCompute( PerThreadCache.Key.create(ProjectControl.class, project, user.getCacheKey()), - () -> projectControlFactory.create(user, state)); + () -> + projectControlFactory.create( + user, projectCache.get(project).orElseThrow(illegalState(project)))); return control.asForProject(); } catch (Exception e) { Throwable cause = e.getCause() != null ? e.getCause() : e; |