VisibleChangesCache: Skip if project isn't readable
Looping over every change when the whole project isn't readable is a
waste of CPU. It's a bigger waste to fetch all the change data in the
first place.
Change-Id: Ifd5d319f12412d4a9d92e55ac4bc1c44ccdb96da
Release-Notes: Optimized change visibilty checking when the project is hidden
diff --git a/java/com/google/gerrit/server/permissions/VisibleChangesCache.java b/java/com/google/gerrit/server/permissions/VisibleChangesCache.java
index 2e47576..8a68a99 100644
--- a/java/com/google/gerrit/server/permissions/VisibleChangesCache.java
+++ b/java/com/google/gerrit/server/permissions/VisibleChangesCache.java
@@ -107,12 +107,12 @@
private void visibleChangesBySearch() throws PermissionBackendException {
visibleChanges = new HashMap<>();
+ if (!projectState.statePermitsRead()) {
+ return;
+ }
Project.NameKey project = projectState.getNameKey();
try {
for (ChangeData cd : changeCache.getChangeData(project)) {
- if (!projectState.statePermitsRead()) {
- continue;
- }
try {
permissionBackendForProject.change(cd).check(ChangePermission.READ);
visibleChanges.put(cd.getId(), cd.change().getDest());
@@ -128,6 +128,9 @@
private void visibleChangesByScan() throws PermissionBackendException {
visibleChanges = new HashMap<>();
+ if (!projectState.statePermitsRead()) {
+ return;
+ }
Project.NameKey p = projectState.getNameKey();
ImmutableList<ChangeNotesResult> changes;
try {
@@ -154,10 +157,6 @@
return null;
}
- if (!projectState.statePermitsRead()) {
- return null;
- }
-
try {
permissionBackendForProject.change(r.notes()).check(ChangePermission.READ);
return r.notes();