summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Ostrovsky <david@ostrovsky.org>2020-05-02 08:05:11 +0200
committerDavid Ostrovsky <david.ostrovsky@gmail.com>2020-05-04 07:37:59 +0000
commit92a2fcb488dd1447c6e3d8e1ef7729c4f5d078f6 (patch)
tree7876e6bc2091aa84efa230ceb11c70958cd5fa44
parenta4d8402ad9cfb3ce842891cf34dcbe9eeac6213f (diff)
Schema_154: Periodically run full gc
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_154.java38
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();
+ }
+ }
+ }
+ }
}