diff options
Diffstat (limited to 'java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java')
-rw-r--r-- | java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java b/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java index e81e5bcbec..88eed740df 100644 --- a/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java +++ b/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java @@ -87,6 +87,7 @@ import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.text.ParseException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -101,6 +102,7 @@ import java.util.function.Predicate; import org.eclipse.jgit.errors.ConfigInvalidException; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.internal.storage.file.FileRepository; +import org.eclipse.jgit.internal.storage.file.GC; import org.eclipse.jgit.internal.storage.file.PackInserter; import org.eclipse.jgit.lib.BatchRefUpdate; import org.eclipse.jgit.lib.Config; @@ -112,6 +114,7 @@ import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.lib.TextProgressMonitor; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.storage.file.FileBasedConfig; +import org.eclipse.jgit.storage.pack.PackConfig; import org.eclipse.jgit.transport.ReceiveCommand; import org.eclipse.jgit.util.FS; @@ -123,6 +126,7 @@ public class NoteDbMigrator implements AutoCloseable { private static final String TRIAL = "trial"; private static final int PROJECT_SLICE_MAX_REFS = 1000; + private static final int GC_INTERVAL = 10000; public static boolean getAutoMigrate(Config cfg) { return cfg.getBoolean(SECTION_NOTE_DB, NoteDbTable.CHANGES.key(), AUTO_MIGRATE, false); @@ -1047,6 +1051,9 @@ public class NoteDbMigrator implements AutoCloseable { c, totalChangeCount, (100.0 * c) / totalChangeCount); } pc = ctx.changesMigratedCount.incrementAndGet(); + if (pc % GC_INTERVAL == 0) { + gc(project, changeRepo, ctx.gcLock); + } pm.update(1); } logger.atInfo().log( @@ -1085,6 +1092,30 @@ public class NoteDbMigrator implements AutoCloseable { return ok; } + private void gc(Project.NameKey project, Repository repo, ReentrantLock gcLock) { + if (repo instanceof FileRepository && gcLock.tryLock()) { + try { + FileRepository r = (FileRepository) repo; + GC gc = new GC(r); + // known limitation in jgit 5.1: bitmap index creation is slow due to bug 562740, + // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=562740 + logger.atInfo().log("Running GC on project %s", project); + PackConfig pconfig = new PackConfig(repo); + pconfig.setBuildBitmaps(false); + // let auto gc decide when gc needs to really do something + gc.setAuto(true); + gc.setPackConfig(pconfig); + gc.gc(); + logger.atInfo().log("Finished GC on project %s", project); + } catch (IOException | ParseException e) { + logger.atSevere().withCause(e).log("GC of project %s failed", project); + } finally { + gcLock.unlock(); + logger.atFine().log("Released gc lock for project %s", project); + } + } + } + private void rebuild(ReviewDb db, Change.Id changeId, NoteDbUpdateManager manager) throws OrmException, IOException { // Match ChangeRebuilderImpl#stage, but without calling manager.stage(), since that can only be |