From 88653e3269265eb92cee240a9141adb4b8b2b26f Mon Sep 17 00:00:00 2001 From: Matthias Sohn Date: Fri, 31 Jul 2020 14:01:14 +0200 Subject: 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 --- .../server/notedb/rebuild/NoteDbMigrator.java | 60 +++++++++++----------- 1 file 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 changesByProject = getChangesByProject(); List> futures = new ArrayList<>(); - try (ContextHelper contextHelper = new ContextHelper()) { - List projectNames = - Ordering.usingToString().sortedCopy(changesByProject.keySet()); - for (Project.NameKey project : projectNames) { - List> slices = - Lists.partition(changesByProject.get(project), PROJECT_SLICE_MAX_REFS); - int count = slices.size(); - int sliceNumber = 1; - for (List slice : slices) { - int sn = sliceNumber++; - ListenableFuture 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 projectNames = + Ordering.usingToString().sortedCopy(changesByProject.keySet()); + for (Project.NameKey project : projectNames) { + List> slices = + Lists.partition(changesByProject.get(project), PROJECT_SLICE_MAX_REFS); + int count = slices.size(); + int sliceNumber = 1; + for (List slice : slices) { + int sn = sliceNumber++; + ListenableFuture 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"); } } -- cgit v1.2.3