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();