summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Milanesio <luca.milanesio@gmail.com>2021-09-15 20:14:24 +0100
committerLuca Milanesio <luca.milanesio@gmail.com>2021-09-23 22:53:22 +0000
commit91bea9c579170a95ec58f9e5cfdf055f07d7bc17 (patch)
treee7c99037b615f8645882e7c0ca62715c057a2ba0
parent949e7f8e173181e23be60ef00ab32410d661c383 (diff)
Allow loading change notes from an existing Repository
Don't do extra work when there is an already opened Repository ready to be used for loading change notes. There are places in Gerrit where the Repository object is available but is left unused and the load of change notes causes the resolution of yet another Repository.FileKey which is unnecessary. The creation of a FileKey is expensive because it requires a series of filesystem accesses needed by RepositoryCache.resolve. It may end up executing the 'isGitRepository' 3 times for a repository that has been already opened and verified. As a follow-up change, all callers to ChangeNotes.create would pass the existing Repository, when it is known. Change-Id: I48896badc4a14927b98fef0311c4a63ba5b2251d
-rw-r--r--java/com/google/gerrit/server/notedb/AbstractChangeNotes.java10
-rw-r--r--java/com/google/gerrit/server/notedb/ChangeNotes.java5
2 files changed, 14 insertions, 1 deletions
diff --git a/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java b/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java
index 9b5b4d4eaa..a5acbe3ee3 100644
--- a/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java
+++ b/java/com/google/gerrit/server/notedb/AbstractChangeNotes.java
@@ -133,6 +133,15 @@ public abstract class AbstractChangeNotes<T> {
}
public T load() {
+ try (Repository repo = args.repoManager.openRepository(getProjectName())) {
+ load(repo);
+ return self();
+ } catch (IOException e) {
+ throw new StorageException(e);
+ }
+ }
+
+ public T load(Repository repo) {
if (loaded) {
return self();
}
@@ -141,7 +150,6 @@ public abstract class AbstractChangeNotes<T> {
throw new StorageException("Reading from NoteDb is disabled");
}
try (Timer0.Context timer = args.metrics.readLatency.start();
- Repository repo = args.repoManager.openRepository(getProjectName());
// Call openHandle even if reading is disabled, to trigger
// auto-rebuilding before this object may get passed to a ChangeUpdate.
LoadHandle handle = openHandle(repo)) {
diff --git a/java/com/google/gerrit/server/notedb/ChangeNotes.java b/java/com/google/gerrit/server/notedb/ChangeNotes.java
index c35d815313..95095686e3 100644
--- a/java/com/google/gerrit/server/notedb/ChangeNotes.java
+++ b/java/com/google/gerrit/server/notedb/ChangeNotes.java
@@ -125,6 +125,11 @@ public class ChangeNotes extends AbstractChangeNotes<ChangeNotes> {
return new ChangeNotes(args, newChange(project, changeId), true, null).load();
}
+ public ChangeNotes create(Repository repository, Project.NameKey project, Change.Id changeId) {
+ checkArgument(project != null, "project is required");
+ return new ChangeNotes(args, newChange(project, changeId), true, null).load(repository);
+ }
+
/**
* Create change notes for a change that was loaded from index. This method should only be used
* when database access is harmful and potentially stale data from the index is acceptable.