diff --git a/java/com/google/gerrit/server/cache/PerThreadCache.java b/java/com/google/gerrit/server/cache/PerThreadCache.java index aeb74f24d1..3f4dacd8aa 100644 --- a/java/com/google/gerrit/server/cache/PerThreadCache.java +++ b/java/com/google/gerrit/server/cache/PerThreadCache.java @@ -104,6 +104,11 @@ public class PerThreadCache implements AutoCloseable { return CACHE.get(); } + public static T getOrCompute(Key key, Supplier loader) { + PerThreadCache cache = get(); + return cache != null ? cache.get(key, loader) : loader.get(); + } + private final Map, Object> cache = Maps.newHashMapWithExpectedSize(10); private PerThreadCache() {} diff --git a/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java b/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java index 93f1683325..1ac95fe54c 100644 --- a/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java +++ b/java/com/google/gerrit/server/permissions/DefaultPermissionBackend.java @@ -109,14 +109,10 @@ public class DefaultPermissionBackend extends PermissionBackend { try { ProjectState state = projectCache.checkedGet(project); if (state != null) { - PerThreadCache perThreadCache = PerThreadCache.get(); - if (perThreadCache == null) { - return projectControlFactory.create(user, state).asForProject().database(db); - } - PerThreadCache.Key cacheKey = - PerThreadCache.Key.create(ProjectControl.class, project, user.getCacheKey()); ProjectControl control = - perThreadCache.get(cacheKey, () -> projectControlFactory.create(user, state)); + PerThreadCache.getOrCompute( + PerThreadCache.Key.create(ProjectControl.class, project, user.getCacheKey()), + () -> projectControlFactory.create(user, state)); return control.asForProject().database(db); } return FailedPermissionBackend.project("not found", new NoSuchProjectException(project));