summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Ostrovsky <david@ostrovsky.org>2022-06-28 17:32:22 +0200
committerDavid Ostrovsky <david@ostrovsky.org>2022-06-28 17:32:22 +0200
commitd38be5f3e88ef093240f17f415f712683eb4dfc0 (patch)
treeb3e0c625cd2d6fa4fb5a199f52db18e60bec81b2
parent531bcff6479c2c635e0e32eaddfb41c1e98315e4 (diff)
parentcf6ccb571f94c1d53a2ae721afcdd4b3def8ee5e (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.java3
-rw-r--r--java/com/google/gerrit/server/git/receive/ReceiveCommits.java22
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
}