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:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
Reference in New Issue
Block a user