ScanningChangeCacheImpl: Load changes from notedb if enabled

ScanningChangeCacheImpl now loads the changes via ChangeNotes.Factory
from notedb if reading from notedb is enabled. If the changes need to
be read from database ChangeNotes.Factory is not used since the
changes should be loaded in a batch and ChangeNotes.Factory doesn't
support this.

Change-Id: I44947eb36ec5bbf07d60beabf154dbaadf0918c2
Signed-off-by: Edwin Kempin <ekempin@google.com>
This commit is contained in:
Edwin Kempin
2016-02-05 13:31:20 +01:00
parent f64ef68bcd
commit 9bac7e98da
2 changed files with 46 additions and 4 deletions

View File

@@ -24,6 +24,8 @@ import com.google.gerrit.reviewdb.client.Project;
import com.google.gerrit.reviewdb.client.RefNames; import com.google.gerrit.reviewdb.client.RefNames;
import com.google.gerrit.reviewdb.server.ReviewDb; import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.cache.CacheModule; import com.google.gerrit.server.cache.CacheModule;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.notedb.NotesMigration;
import com.google.gerrit.server.util.ManualRequestContext; import com.google.gerrit.server.util.ManualRequestContext;
import com.google.gerrit.server.util.OneOffRequestContext; import com.google.gerrit.server.util.OneOffRequestContext;
import com.google.gwtorm.server.OrmException; import com.google.gwtorm.server.OrmException;
@@ -86,12 +88,18 @@ public class ScanningChangeCacheImpl implements ChangeCache {
static class Loader extends CacheLoader<Project.NameKey, List<Change>> { static class Loader extends CacheLoader<Project.NameKey, List<Change>> {
private final GitRepositoryManager repoManager; private final GitRepositoryManager repoManager;
private final NotesMigration notesMigration;
private final ChangeNotes.Factory notesFactory;
private final OneOffRequestContext requestContext; private final OneOffRequestContext requestContext;
@Inject @Inject
Loader(GitRepositoryManager repoManager, Loader(GitRepositoryManager repoManager,
NotesMigration notesMigration,
ChangeNotes.Factory notesFactory,
OneOffRequestContext requestContext) { OneOffRequestContext requestContext) {
this.repoManager = repoManager; this.repoManager = repoManager;
this.notesMigration = notesMigration;
this.notesFactory = notesFactory;
this.requestContext = requestContext; this.requestContext = requestContext;
} }
@@ -99,13 +107,23 @@ public class ScanningChangeCacheImpl implements ChangeCache {
public List<Change> load(Project.NameKey key) throws Exception { public List<Change> load(Project.NameKey key) throws Exception {
try (Repository repo = repoManager.openRepository(key); try (Repository repo = repoManager.openRepository(key);
ManualRequestContext ctx = requestContext.open()) { ManualRequestContext ctx = requestContext.open()) {
return scan(repo, ctx.getReviewDbProvider().get()); return scan(notesMigration, notesFactory, repo,
ctx.getReviewDbProvider().get(), key);
}
} }
} }
public static List<Change> scan(NotesMigration notesMigration,
ChangeNotes.Factory notesFactory, Repository repo, ReviewDb db,
Project.NameKey project) throws OrmException, IOException {
if (!notesMigration.readChanges()) {
return scanDb(repo, db);
} }
public static List<Change> scan(Repository repo, ReviewDb db) return scanNotedb(notesFactory, repo, db, project);
}
public static List<Change> scanDb(Repository repo, ReviewDb db)
throws OrmException, IOException { throws OrmException, IOException {
Map<String, Ref> refs = Map<String, Ref> refs =
repo.getRefDatabase().getRefs(RefNames.REFS_CHANGES); repo.getRefDatabase().getRefs(RefNames.REFS_CHANGES);
@@ -124,4 +142,19 @@ public class ScanningChangeCacheImpl implements ChangeCache {
} }
return changes; return changes;
} }
public static List<Change> scanNotedb(ChangeNotes.Factory notesFactory,
Repository repo, ReviewDb db, Project.NameKey project)
throws OrmException, IOException {
Map<String, Ref> refs =
repo.getRefDatabase().getRefs(RefNames.REFS_CHANGES);
List<Change> changes = new ArrayList<>(refs.size());
for (Ref r : refs.values()) {
Change.Id id = Change.Id.fromRef(r.getName());
if (id != null) {
changes.add(notesFactory.create(db, project, id).getChange());
}
}
return changes;
}
} }

View File

@@ -37,6 +37,8 @@ import com.google.gerrit.server.git.GitRepositoryManager;
import com.google.gerrit.server.git.MergeUtil; import com.google.gerrit.server.git.MergeUtil;
import com.google.gerrit.server.git.MultiProgressMonitor; import com.google.gerrit.server.git.MultiProgressMonitor;
import com.google.gerrit.server.git.MultiProgressMonitor.Task; import com.google.gerrit.server.git.MultiProgressMonitor.Task;
import com.google.gerrit.server.notedb.ChangeNotes;
import com.google.gerrit.server.notedb.NotesMigration;
import com.google.gerrit.server.git.ScanningChangeCacheImpl; import com.google.gerrit.server.git.ScanningChangeCacheImpl;
import com.google.gerrit.server.patch.PatchListLoader; import com.google.gerrit.server.patch.PatchListLoader;
import com.google.gerrit.server.query.change.ChangeData; import com.google.gerrit.server.query.change.ChangeData;
@@ -116,6 +118,8 @@ public class SiteIndexer {
private final GitRepositoryManager repoManager; private final GitRepositoryManager repoManager;
private final ListeningExecutorService executor; private final ListeningExecutorService executor;
private final ChangeIndexer.Factory indexerFactory; private final ChangeIndexer.Factory indexerFactory;
private final NotesMigration notesMigration;
private final ChangeNotes.Factory notesFactory;
private final ThreeWayMergeStrategy mergeStrategy; private final ThreeWayMergeStrategy mergeStrategy;
private int numChanges = -1; private int numChanges = -1;
@@ -129,12 +133,16 @@ public class SiteIndexer {
GitRepositoryManager repoManager, GitRepositoryManager repoManager,
@IndexExecutor(BATCH) ListeningExecutorService executor, @IndexExecutor(BATCH) ListeningExecutorService executor,
ChangeIndexer.Factory indexerFactory, ChangeIndexer.Factory indexerFactory,
NotesMigration notesMigration,
ChangeNotes.Factory notesFactory,
@GerritServerConfig Config config) { @GerritServerConfig Config config) {
this.schemaFactory = schemaFactory; this.schemaFactory = schemaFactory;
this.changeDataFactory = changeDataFactory; this.changeDataFactory = changeDataFactory;
this.repoManager = repoManager; this.repoManager = repoManager;
this.executor = executor; this.executor = executor;
this.indexerFactory = indexerFactory; this.indexerFactory = indexerFactory;
this.notesMigration = notesMigration;
this.notesFactory = notesFactory;
this.mergeStrategy = MergeUtil.getMergeStrategy(config); this.mergeStrategy = MergeUtil.getMergeStrategy(config);
} }
@@ -238,7 +246,8 @@ public class SiteIndexer {
try (Repository repo = repoManager.openRepository(project); try (Repository repo = repoManager.openRepository(project);
ReviewDb db = schemaFactory.open()) { ReviewDb db = schemaFactory.open()) {
Map<String, Ref> refs = repo.getRefDatabase().getRefs(ALL); Map<String, Ref> refs = repo.getRefDatabase().getRefs(ALL);
for (Change c : ScanningChangeCacheImpl.scan(repo, db)) { for (Change c : ScanningChangeCacheImpl.scan(notesMigration,
notesFactory, repo, db, project)) {
Ref r = refs.get(c.currentPatchSetId().toRefName()); Ref r = refs.get(c.currentPatchSetId().toRefName());
if (r != null) { if (r != null) {
byId.put(r.getObjectId(), changeDataFactory.create(db, c)); byId.put(r.getObjectId(), changeDataFactory.create(db, c));