summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Milanesio <luca.milanesio@gmail.com>2022-02-27 00:01:12 +0000
committerLuca Milanesio <luca.milanesio@gmail.com>2022-02-28 13:06:10 +0000
commit6030d8f6e89c7ae11ce3a3557f6cc329b8e0128d (patch)
treec38d32c4488f731fdf0f34d3667f902b40ec37bd
parent8066f3534a5fa8a48f1b6d5064cc652624a10832 (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.java6
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;