diff options
author | Luca Milanesio <luca.milanesio@gmail.com> | 2021-09-15 20:14:24 +0100 |
---|---|---|
committer | Luca Milanesio <luca.milanesio@gmail.com> | 2021-09-23 22:53:22 +0000 |
commit | 91bea9c579170a95ec58f9e5cfdf055f07d7bc17 (patch) | |
tree | e7c99037b615f8645882e7c0ca62715c057a2ba0 | |
parent | 949e7f8e173181e23be60ef00ab32410d661c383 (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.java | 10 | ||||
-rw-r--r-- | java/com/google/gerrit/server/notedb/ChangeNotes.java | 5 |
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. |