diff options
author | David Ostrovsky <david@ostrovsky.org> | 2022-06-28 17:32:22 +0200 |
---|---|---|
committer | David Ostrovsky <david@ostrovsky.org> | 2022-06-28 17:32:22 +0200 |
commit | d38be5f3e88ef093240f17f415f712683eb4dfc0 (patch) | |
tree | b3e0c625cd2d6fa4fb5a199f52db18e60bec81b2 | |
parent | 531bcff6479c2c635e0e32eaddfb41c1e98315e4 (diff) | |
parent | cf6ccb571f94c1d53a2ae721afcdd4b3def8ee5e (diff) |
Merge branch 'stable-3.2' into stable-3.3
* stable-3.2:
Allow async receive-commits to have a thread-local cache
Fix RepoRefCache stale checks during NoteDb rebuild
Lazy load change notes when submit by push
Change-Id: Idd341667dcc1d6ba9ffe7423776d55b3de659eb5
Release-Notes: skip
-rw-r--r-- | java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java | 3 | ||||
-rw-r--r-- | java/com/google/gerrit/server/git/receive/ReceiveCommits.java | 22 |
2 files changed, 15 insertions, 10 deletions
diff --git a/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java b/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java index d037994629..06cc228fab 100644 --- a/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java +++ b/java/com/google/gerrit/server/git/receive/AsyncReceiveCommits.java @@ -36,6 +36,7 @@ import com.google.gerrit.metrics.MetricMaker; import com.google.gerrit.metrics.Timer1; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.PublishCommentsOp; +import com.google.gerrit.server.cache.PerThreadCache; import com.google.gerrit.server.config.AllUsersName; import com.google.gerrit.server.config.ConfigUtil; import com.google.gerrit.server.config.GerritServerConfig; @@ -366,7 +367,7 @@ public class AsyncReceiveCommits { () -> { String oldName = Thread.currentThread().getName(); Thread.currentThread().setName(oldName + "-for-" + currentThreadName); - try { + try (PerThreadCache threadLocalCache = PerThreadCache.create()) { return receiveCommits.processCommands(commands, monitor); } finally { Thread.currentThread().setName(oldName); diff --git a/java/com/google/gerrit/server/git/receive/ReceiveCommits.java b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java index 324be5e4c3..0209105e84 100644 --- a/java/com/google/gerrit/server/git/receive/ReceiveCommits.java +++ b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java @@ -3281,7 +3281,7 @@ class ReceiveCommits { rw.markStart(newTip); rw.markUninteresting(rw.parseCommit(cmd.getOldId())); - Map<Change.Key, ChangeNotes> byKey = null; + Map<Change.Key, ChangeData> changeDataByKey = null; List<ReplaceRequest> replaceAndClose = new ArrayList<>(); int existingPatchSets = 0; @@ -3321,8 +3321,8 @@ class ReceiveCommits { for (String changeId : ChangeUtil.getChangeIdsFromFooter(c, urlFormatter.get())) { - if (byKey == null) { - byKey = + if (changeDataByKey == null) { + changeDataByKey = retryHelper .changeIndexQuery( "queryOpenChangesByKeyByBranch", @@ -3330,14 +3330,15 @@ class ReceiveCommits { .call(); } - ChangeNotes onto = byKey.get(Change.key(changeId.trim())); + ChangeData onto = changeDataByKey.get(Change.key(changeId.trim())); if (onto != null) { newPatchSets++; // Hold onto this until we're done with the walk, as the call to // req.validate below calls isMergedInto which resets the walk. + ChangeNotes ontoNotes = onto.notes(); ReplaceRequest req = - new ReplaceRequest(onto.getChangeId(), c, cmd, false); - req.notes = onto; + new ReplaceRequest(ontoNotes.getChangeId(), c, cmd, false); + req.notes = ontoNotes; replaceAndClose.add(req); continue COMMIT; } @@ -3410,14 +3411,17 @@ class ReceiveCommits { } } - private Map<Change.Key, ChangeNotes> openChangesByKeyByBranch( + private Map<Change.Key, ChangeData> openChangesByKeyByBranch( InternalChangeQuery internalChangeQuery, BranchNameKey branch) { try (TraceTimer traceTimer = newTimer("openChangesByKeyByBranch", Metadata.builder().branchName(branch.branch()))) { - Map<Change.Key, ChangeNotes> r = new HashMap<>(); + Map<Change.Key, ChangeData> r = new HashMap<>(); for (ChangeData cd : internalChangeQuery.byBranchOpen(branch)) { try { - r.put(cd.change().getKey(), cd.notes()); + // ChangeData is not materialised into a ChangeNotes for avoiding + // to load a potentially large number of changes meta-data into memory + // which would cause unnecessary disk I/O, CPU and heap utilisation. + r.put(cd.change().getKey(), cd); } catch (NoSuchChangeException e) { // Ignore deleted change } |