VisibleRefFilter Avoid touching the database for drafts

This is an analogous problem to the one with search results fixed in
Ie54b9e2d. VisibleRefFilter is a little trickier because it was using
ChangeCache, which only returned Changes, not the reviewer set. Change
SearchingChangeCacheImpl to cache a different value type and return
ChangeDatas from its search method so we can use the cached
ReviewerSet where appropriate.

Unfortunately for the Reindex program we still need to support not
having a SearchingChangeCacheImpl, which means we have a completely
separate codepath for reading changes from the database.

Change-Id: Ic432a8e48a2bafc8d142b84b25101d95ffb674b7
This commit is contained in:
Dave Borowitz
2016-06-03 11:32:50 -04:00
parent fe99d302cc
commit a758640bc3
14 changed files with 267 additions and 57 deletions

View File

@@ -24,10 +24,11 @@ import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.IdentifiedUser;
import com.google.gerrit.server.account.AccountResolver;
import com.google.gerrit.server.git.ChangeCache;
import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.SearchingChangeCacheImpl;
import com.google.gerrit.server.git.TagCache;
import com.google.gerrit.server.git.VisibleRefFilter;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.project.ProjectControl;
import com.google.gerrit.sshd.CommandMetaData;
import com.google.gerrit.sshd.SshCommand;
@@ -59,7 +60,10 @@ public class LsUserRefs extends SshCommand {
private TagCache tagCache;
@Inject
private ChangeCache changeCache;
private ChangeNotes.Factory changeNotesFactory;
@Inject
private SearchingChangeCacheImpl changeCache;
@Option(name = "--project", aliases = {"-p"}, metaVar = "PROJECT",
required = true, usage = "project for which the refs should be listed")
@@ -95,9 +99,10 @@ public class LsUserRefs extends SshCommand {
try (Repository repo = repoManager.openRepository(
userProjectControl.getProject().getNameKey())) {
try {
Map<String, Ref> refsMap =
new VisibleRefFilter(tagCache, changeCache, repo, userProjectControl,
db, true).filter(repo.getRefDatabase().getRefs(ALL), false);
Map<String, Ref> refsMap = new VisibleRefFilter(
tagCache, changeNotesFactory, changeCache, repo,
userProjectControl, db, true)
.filter(repo.getRefDatabase().getRefs(ALL), false);
for (final String ref : refsMap.keySet()) {
if (!onlyRefsHeads || ref.startsWith(RefNames.REFS_HEADS)) {

View File

@@ -17,13 +17,14 @@ package com.google.gerrit.sshd.commands;
import com.google.common.collect.Lists;
import com.google.gerrit.extensions.registration.DynamicSet;
import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.git.ChangeCache;
import com.google.gerrit.server.git.SearchingChangeCacheImpl;
import com.google.gerrit.server.git.TagCache;
import com.google.gerrit.server.git.TransferConfig;
import com.google.gerrit.server.git.UploadPackMetricsHook;
import com.google.gerrit.server.git.VisibleRefFilter;
import com.google.gerrit.server.git.validators.UploadValidationException;
import com.google.gerrit.server.git.validators.UploadValidators;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.sshd.AbstractGitCommand;
import com.google.gerrit.sshd.SshSession;
import com.google.inject.Inject;
@@ -47,7 +48,10 @@ final class Upload extends AbstractGitCommand {
private TagCache tagCache;
@Inject
private ChangeCache changeCache;
private ChangeNotes.Factory changeNotesFactory;
@Inject
private SearchingChangeCacheImpl changeCache;
@Inject
private DynamicSet<PreUploadHook> preUploadHooks;
@@ -68,8 +72,10 @@ final class Upload extends AbstractGitCommand {
}
final UploadPack up = new UploadPack(repo);
up.setAdvertiseRefsHook(new VisibleRefFilter(tagCache, changeCache, repo,
projectControl, db, true));
up.setAdvertiseRefsHook(
new VisibleRefFilter(
tagCache, changeNotesFactory, changeCache, repo, projectControl, db,
true));
up.setPackConfig(config.getPackConfig());
up.setTimeout(config.getTimeout());
up.setPostUploadHook(uploadMetrics);