summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Sohn <matthias.sohn@sap.com>2020-07-31 14:01:14 +0200
committerMatthias Sohn <matthias.sohn@sap.com>2020-10-06 23:47:37 +0200
commit88653e3269265eb92cee240a9141adb4b8b2b26f (patch)
treee647d5051068e4d4ffb1dbe795e0e5ea99be57a4
parentb18fd1f8970535573c0b94ac0ab25bd403712785 (diff)
NoteDbMigrator: Fix contention on single database connection
The migrator used a single database connection for all threads rebuilding changes. Instead use one database connection per rebuild thread. Change-Id: If785208cc571421b0a2bac65b4970c24a4c33e1f
-rw-r--r--java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java60
1 files changed, 29 insertions, 31 deletions
diff --git a/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java b/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java
index 242e00f0ea..cdc84ec0de 100644
--- a/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java
+++ b/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java
@@ -833,39 +833,37 @@ public class NoteDbMigrator implements AutoCloseable {
ImmutableListMultimap<Project.NameKey, Change.Id> changesByProject = getChangesByProject();
List<ListenableFuture<Boolean>> futures = new ArrayList<>();
- try (ContextHelper contextHelper = new ContextHelper()) {
- List<Project.NameKey> projectNames =
- Ordering.usingToString().sortedCopy(changesByProject.keySet());
- for (Project.NameKey project : projectNames) {
- List<List<Id>> slices =
- Lists.partition(changesByProject.get(project), PROJECT_SLICE_MAX_REFS);
- int count = slices.size();
- int sliceNumber = 1;
- for (List<Change.Id> slice : slices) {
- int sn = sliceNumber++;
- ListenableFuture<Boolean> future =
- executor.submit(
- () -> {
- try {
- return rebuildProjectSlice(
- contextHelper.getReviewDb(), project, slice, sn, count);
- } catch (Exception e) {
- logger.atSevere().withCause(e).log("Error rebuilding project %s", project);
- return false;
- }
- });
- futures.add(future);
- }
+ List<Project.NameKey> projectNames =
+ Ordering.usingToString().sortedCopy(changesByProject.keySet());
+ for (Project.NameKey project : projectNames) {
+ List<List<Id>> slices =
+ Lists.partition(changesByProject.get(project), PROJECT_SLICE_MAX_REFS);
+ int count = slices.size();
+ int sliceNumber = 1;
+ for (List<Change.Id> slice : slices) {
+ int sn = sliceNumber++;
+ ListenableFuture<Boolean> future =
+ executor.submit(
+ () -> {
+ try (ContextHelper contextHelper = new ContextHelper()) {
+ return rebuildProjectSlice(
+ contextHelper.getReviewDb(), project, slice, sn, count);
+ } catch (Exception e) {
+ logger.atSevere().withCause(e).log("Error rebuilding project %s", project);
+ return false;
+ }
+ });
+ futures.add(future);
}
+ }
- boolean ok = futuresToBoolean(futures, "Error rebuilding projects");
- double t = sw.elapsed(TimeUnit.MILLISECONDS) / 1000d;
- logger.atInfo().log(
- "Rebuilt %d changes in %.01fs (%.01f/s)\n",
- changesByProject.size(), t, changesByProject.size() / t);
- if (!ok) {
- throw new MigrationException("Rebuilding some changes failed, see log");
- }
+ boolean ok = futuresToBoolean(futures, "Error rebuilding projects");
+ double t = sw.elapsed(TimeUnit.MILLISECONDS) / 1000d;
+ logger.atInfo().log(
+ "Rebuilt %d changes in %.01fs (%.01f/s)\n",
+ changesByProject.size(), t, changesByProject.size() / t);
+ if (!ok) {
+ throw new MigrationException("Rebuilding some changes failed, see log");
}
}