diff options
author | David Ostrovsky <david@ostrovsky.org> | 2020-05-02 08:05:11 +0200 |
---|---|---|
committer | David Ostrovsky <david.ostrovsky@gmail.com> | 2020-05-04 07:37:59 +0000 |
commit | 92a2fcb488dd1447c6e3d8e1ef7729c4f5d078f6 (patch) | |
tree | 7876e6bc2091aa84efa230ceb11c70958cd5fa44 | |
parent | a4d8402ad9cfb3ce842891cf34dcbe9eeac6213f (diff) |
Schema_154: Periodically run full gc
Change-Id: Id7156e79e4cd55f97008b362df698bb31b898206
-rw-r--r-- | gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_154.java | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_154.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_154.java index de91aca09a..6c9e0ccf43 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_154.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_154.java @@ -16,6 +16,7 @@ package com.google.gerrit.server.schema; import static java.util.stream.Collectors.toMap; +import com.google.common.base.Stopwatch; import com.google.common.collect.ImmutableMap; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.reviewdb.server.ReviewDb; @@ -34,12 +35,17 @@ import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import java.text.ParseException; import java.util.ArrayList; +import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.TimeUnit; import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.internal.storage.file.FileRepository; +import org.eclipse.jgit.internal.storage.file.GC; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.ProgressMonitor; import org.eclipse.jgit.lib.Repository; @@ -62,6 +68,7 @@ public class Schema_154 extends SchemaVersion { private final GitRepositoryManager repoManager; private final AllUsersName allUsersName; private final Provider<PersonIdent> serverIdent; + private final Stopwatch sw = Stopwatch.createStarted(); @Inject Schema_154( @@ -84,9 +91,13 @@ public class Schema_154 extends SchemaVersion { Set<Account> accounts = scanAccounts(db, pm); pm.endTask(); pm.beginTask("Migrating accounts to NoteDb", accounts.size()); + int i = 0; for (Account account : accounts) { updateAccountInNoteDb(repo, account); pm.update(1); + if (++i % 100000 == 0) { + gc(repo, ui); + } } pm.endTask(); } @@ -147,4 +158,31 @@ public class Schema_154 extends SchemaVersion { private interface AccountSetter { void set(Account a, ResultSet rs, String field) throws SQLException; } + + private double elapsed() { + return sw.elapsed(TimeUnit.MILLISECONDS) / 1000d; + } + + private void gc(Repository repo, UpdateUI ui) { + if (repo instanceof FileRepository) { + ProgressMonitor pm = null; + try { + pm = new TextProgressMonitor(); + FileRepository r = (FileRepository) repo; + GC gc = new GC(r); + gc.setProgressMonitor(pm); + pm.beginTask("gc", ProgressMonitor.UNKNOWN); + ui.message(String.format("... (%.3f s) gc --prune=now", elapsed())); + gc.setExpire(new Date()); + gc.gc(); + ui.message(String.format("... (%.3f s) full gc completed", elapsed())); + } catch (IOException | ParseException e) { + throw new RuntimeException(e); + } finally { + if (pm != null) { + pm.endTask(); + } + } + } + } } |