Avoid unnecessary group visibility checks
The list-groups REST API call checked group visibility even for those
groups which are filtered out. In a system with 10-20K of groups
this can cause 30-60 seconds delay when checking if current user can
see a group.
Avoid unnecessary group visibility checks by moving it towards the end
of the loop. Therefore, group visibility is only checked for those
groups which are not filtered out.
Change-Id: Id5984049d0103fbbf656b704f672f01283844b64
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java
index f3a2ea2..44e8a4d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/ListGroups.java
@@ -322,12 +322,6 @@
continue;
}
}
- if (!isAdmin) {
- final GroupControl c = groupControlFactory.controlFor(group);
- if (!c.isVisible()) {
- continue;
- }
- }
if (visibleToAll && !group.isVisibleToAll()) {
continue;
}
@@ -335,6 +329,12 @@
&& !groupsToInspect.contains(group.getGroupUUID())) {
continue;
}
+ if (!isAdmin) {
+ final GroupControl c = groupControlFactory.controlFor(group);
+ if (!c.isVisible()) {
+ continue;
+ }
+ }
filteredGroups.add(group);
}
Collections.sort(filteredGroups, new GroupComparator());