RebuildNoteDb: Remove special handling of All-Users repo
ChangeRebuilderImpl now knows how to do the right thing, including deleting old drafts refs from All-Users. Change-Id: I160c1f7564cc107e24be6ce128c74ceffd306bc8
This commit is contained in:
@@ -40,12 +40,8 @@ import com.google.gerrit.pgm.util.SiteProgram;
|
||||
import com.google.gerrit.pgm.util.ThreadLimiter;
|
||||
import com.google.gerrit.reviewdb.client.Change;
|
||||
import com.google.gerrit.reviewdb.client.Project;
|
||||
import com.google.gerrit.reviewdb.client.RefNames;
|
||||
import com.google.gerrit.reviewdb.server.ReviewDb;
|
||||
import com.google.gerrit.server.change.ChangeResource;
|
||||
import com.google.gerrit.server.config.AllUsersName;
|
||||
import com.google.gerrit.server.config.GerritServerConfig;
|
||||
import com.google.gerrit.server.git.GitRepositoryManager;
|
||||
import com.google.gerrit.server.git.WorkQueue;
|
||||
import com.google.gerrit.server.index.DummyIndexModule;
|
||||
import com.google.gerrit.server.index.change.ReindexAfterRefUpdate;
|
||||
@@ -54,7 +50,6 @@ import com.google.gerrit.server.notedb.NoteDbUpdateManager;
|
||||
import com.google.gerrit.server.notedb.NotesMigration;
|
||||
import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder;
|
||||
import com.google.gerrit.server.notedb.rebuild.ChangeRebuilder.NoPatchSetsException;
|
||||
import com.google.gerrit.server.update.ChainedReceiveCommands;
|
||||
import com.google.gwtorm.server.OrmException;
|
||||
import com.google.gwtorm.server.SchemaFactory;
|
||||
import com.google.inject.Inject;
|
||||
@@ -65,22 +60,10 @@ import java.io.OutputStreamWriter;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import org.eclipse.jgit.lib.BatchRefUpdate;
|
||||
import org.eclipse.jgit.lib.Config;
|
||||
import org.eclipse.jgit.lib.NullProgressMonitor;
|
||||
import org.eclipse.jgit.lib.ObjectId;
|
||||
import org.eclipse.jgit.lib.ObjectInserter;
|
||||
import org.eclipse.jgit.lib.ObjectReader;
|
||||
import org.eclipse.jgit.lib.ProgressMonitor;
|
||||
import org.eclipse.jgit.lib.Ref;
|
||||
import org.eclipse.jgit.lib.RefDatabase;
|
||||
import org.eclipse.jgit.lib.Repository;
|
||||
import org.eclipse.jgit.lib.TextProgressMonitor;
|
||||
import org.eclipse.jgit.revwalk.RevWalk;
|
||||
import org.eclipse.jgit.transport.ReceiveCommand;
|
||||
import org.kohsuke.args4j.Option;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -103,14 +86,8 @@ public class RebuildNoteDb extends SiteProgram {
|
||||
private Injector dbInjector;
|
||||
private Injector sysInjector;
|
||||
|
||||
@Inject private AllUsersName allUsersName;
|
||||
|
||||
@Inject private ChangeRebuilder rebuilder;
|
||||
|
||||
@Inject @GerritServerConfig private Config cfg;
|
||||
|
||||
@Inject private GitRepositoryManager repoManager;
|
||||
|
||||
@Inject private NoteDbUpdateManager.Factory updateManagerFactory;
|
||||
|
||||
@Inject private NotesMigration notesMigration;
|
||||
@@ -146,32 +123,29 @@ public class RebuildNoteDb extends SiteProgram {
|
||||
ImmutableListMultimap<Project.NameKey, Change.Id> changesByProject = getChangesByProject();
|
||||
boolean ok;
|
||||
Stopwatch sw = Stopwatch.createStarted();
|
||||
try (Repository allUsersRepo = repoManager.openRepository(allUsersName)) {
|
||||
deleteRefs(RefNames.REFS_DRAFT_COMMENTS, allUsersRepo);
|
||||
|
||||
List<ListenableFuture<Boolean>> futures = new ArrayList<>();
|
||||
List<Project.NameKey> projectNames =
|
||||
Ordering.usingToString().sortedCopy(changesByProject.keySet());
|
||||
for (Project.NameKey project : projectNames) {
|
||||
ListenableFuture<Boolean> future =
|
||||
executor.submit(
|
||||
() -> {
|
||||
try (ReviewDb db = unwrapDb(schemaFactory.open())) {
|
||||
return rebuildProject(db, changesByProject, project, allUsersRepo);
|
||||
} catch (Exception e) {
|
||||
log.error("Error rebuilding project " + project, e);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
futures.add(future);
|
||||
}
|
||||
List<ListenableFuture<Boolean>> futures = new ArrayList<>();
|
||||
List<Project.NameKey> projectNames =
|
||||
Ordering.usingToString().sortedCopy(changesByProject.keySet());
|
||||
for (Project.NameKey project : projectNames) {
|
||||
ListenableFuture<Boolean> future =
|
||||
executor.submit(
|
||||
() -> {
|
||||
try (ReviewDb db = unwrapDb(schemaFactory.open())) {
|
||||
return rebuildProject(db, changesByProject, project);
|
||||
} catch (Exception e) {
|
||||
log.error("Error rebuilding project " + project, e);
|
||||
return false;
|
||||
}
|
||||
});
|
||||
futures.add(future);
|
||||
}
|
||||
|
||||
try {
|
||||
ok = Iterables.all(Futures.allAsList(futures).get(), Predicates.equalTo(true));
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
log.error("Error rebuilding projects", e);
|
||||
ok = false;
|
||||
}
|
||||
try {
|
||||
ok = Iterables.all(Futures.allAsList(futures).get(), Predicates.equalTo(true));
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
log.error("Error rebuilding projects", e);
|
||||
ok = false;
|
||||
}
|
||||
|
||||
double t = sw.elapsed(TimeUnit.MILLISECONDS) / 1000d;
|
||||
@@ -181,30 +155,6 @@ public class RebuildNoteDb extends SiteProgram {
|
||||
return ok ? 0 : 1;
|
||||
}
|
||||
|
||||
private static void execute(BatchRefUpdate bru, Repository repo) throws IOException {
|
||||
try (RevWalk rw = new RevWalk(repo)) {
|
||||
bru.execute(rw, NullProgressMonitor.INSTANCE);
|
||||
}
|
||||
for (ReceiveCommand command : bru.getCommands()) {
|
||||
if (command.getResult() != ReceiveCommand.Result.OK) {
|
||||
throw new IOException(
|
||||
String.format("Command %s failed: %s", command.toString(), command.getResult()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void deleteRefs(String prefix, Repository allUsersRepo) throws IOException {
|
||||
RefDatabase refDb = allUsersRepo.getRefDatabase();
|
||||
Map<String, Ref> allRefs = refDb.getRefs(prefix);
|
||||
BatchRefUpdate bru = refDb.newBatchUpdate();
|
||||
for (Map.Entry<String, Ref> ref : allRefs.entrySet()) {
|
||||
bru.addCommand(
|
||||
new ReceiveCommand(
|
||||
ref.getValue().getObjectId(), ObjectId.zeroId(), prefix + ref.getKey()));
|
||||
}
|
||||
execute(bru, allUsersRepo);
|
||||
}
|
||||
|
||||
private Injector createSysInjector() {
|
||||
return dbInjector.createChildInjector(
|
||||
new FactoryModule() {
|
||||
@@ -261,8 +211,7 @@ public class RebuildNoteDb extends SiteProgram {
|
||||
private boolean rebuildProject(
|
||||
ReviewDb db,
|
||||
ImmutableListMultimap<Project.NameKey, Change.Id> allChanges,
|
||||
Project.NameKey project,
|
||||
Repository allUsersRepo)
|
||||
Project.NameKey project)
|
||||
throws IOException, OrmException {
|
||||
checkArgument(allChanges.containsKey(project));
|
||||
boolean ok = true;
|
||||
@@ -270,12 +219,7 @@ public class RebuildNoteDb extends SiteProgram {
|
||||
new TextProgressMonitor(
|
||||
new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out, UTF_8))));
|
||||
pm.beginTask(FormatUtil.elide(project.get(), 50), allChanges.get(project).size());
|
||||
try (NoteDbUpdateManager manager = updateManagerFactory.create(project);
|
||||
ObjectInserter allUsersInserter = allUsersRepo.newObjectInserter();
|
||||
ObjectReader reader = allUsersInserter.newReader();
|
||||
RevWalk allUsersRw = new RevWalk(reader)) {
|
||||
manager.setAllUsersRepo(
|
||||
allUsersRepo, allUsersRw, allUsersInserter, new ChainedReceiveCommands(allUsersRepo));
|
||||
try (NoteDbUpdateManager manager = updateManagerFactory.create(project)) {
|
||||
for (Change.Id changeId : allChanges.get(project)) {
|
||||
try {
|
||||
rebuilder.buildUpdates(manager, bundleReader.fromReviewDb(db, changeId));
|
||||
|
||||
Reference in New Issue
Block a user