Schema_154: Periodically run full gc

Change-Id: Id7156e79e4cd55f97008b362df698bb31b898206
This commit is contained in:
David Ostrovsky
2020-05-02 08:05:11 +02:00
committed by David Ostrovsky
parent a4d8402ad9
commit 92a2fcb488

View File

@@ -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();
}
}
}
}
}