Schema_154: Periodically run full gc
Change-Id: Id7156e79e4cd55f97008b362df698bb31b898206
This commit is contained in:
committed by
David Ostrovsky
parent
a4d8402ad9
commit
92a2fcb488
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user