Small optimizations to VisibilityCache
Short-circuit isVisibleFrom when no refs passed. Exclude heads and
tags from other refs, since those were already checked.
Change-Id: I5d5d0952a1db67c33ffc20df402f976946459137
diff --git a/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java b/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java
index c19da4a..335f8d0 100644
--- a/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java
+++ b/gitiles-servlet/src/main/java/com/google/gitiles/VisibilityCache.java
@@ -16,17 +16,20 @@
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Predicates.not;
+import static com.google.common.base.Predicates.or;
import static com.google.common.collect.Collections2.filter;
-import com.google.common.base.Objects;
-import com.google.common.base.Predicate;
-import com.google.common.base.Throwables;
-import com.google.common.cache.Cache;
-import com.google.common.cache.CacheBuilder;
+import static org.eclipse.jgit.lib.Constants.R_HEADS;
+import static org.eclipse.jgit.lib.Constants.R_TAGS;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.RefDatabase;
@@ -35,11 +38,11 @@
import org.eclipse.jgit.revwalk.RevSort;
import org.eclipse.jgit.revwalk.RevWalk;
-import java.io.IOException;
-import java.util.Collection;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
+import com.google.common.base.Objects;
+import com.google.common.base.Predicate;
+import com.google.common.base.Throwables;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
/** Cache of per-user object visibility. */
public class VisibilityCache {
@@ -141,9 +144,9 @@
// Check heads first under the assumption that most requests are for refs
// close to a head. Tags tend to be much further back in history and just
// clutter up the priority queue in the common case.
- return isReachableFrom(walk, commit, filter(allRefs, refStartsWith(Constants.R_HEADS)))
- || isReachableFrom(walk, commit, filter(allRefs, refStartsWith(Constants.R_TAGS)))
- || isReachableFrom(walk, commit, filter(allRefs, not(refStartsWith("refs/changes/"))));
+ return isReachableFrom(walk, commit, filter(allRefs, refStartsWith(R_HEADS)))
+ || isReachableFrom(walk, commit, filter(allRefs, refStartsWith(R_TAGS)))
+ || isReachableFrom(walk, commit, filter(allRefs, otherRefs()));
}
private static Predicate<Ref> refStartsWith(final String prefix) {
@@ -155,8 +158,16 @@
};
}
+ @SuppressWarnings("unchecked")
+ private static Predicate<Ref> otherRefs() {
+ return not(or(refStartsWith(R_HEADS), refStartsWith(R_TAGS), refStartsWith("refs/changes/")));
+ }
+
private boolean isReachableFrom(RevWalk walk, RevCommit commit, Collection<Ref> refs)
throws IOException {
+ if (refs.isEmpty()) {
+ return false;
+ }
walk.reset();
if (topoSort) {
walk.sort(RevSort.TOPO);