diff --git a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNoteDb.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNoteDb.java index 0c8e4a56ff..21daa3edee 100644 --- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNoteDb.java +++ b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/RebuildNoteDb.java @@ -73,6 +73,7 @@ import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.NullProgressMonitor; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; +import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.ProgressMonitor; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.RefDatabase; @@ -271,7 +272,8 @@ public class RebuildNoteDb extends SiteProgram { pm.beginTask(FormatUtil.elide(project.get(), 50), allChanges.get(project).size()); try (NoteDbUpdateManager manager = updateManagerFactory.create(project); ObjectInserter allUsersInserter = allUsersRepo.newObjectInserter(); - RevWalk allUsersRw = new RevWalk(allUsersInserter.newReader())) { + ObjectReader reader = allUsersInserter.newReader(); + RevWalk allUsersRw = new RevWalk(reader)) { manager.setAllUsersRepo( allUsersRepo, allUsersRw, allUsersInserter, new ChainedReceiveCommands(allUsersRepo)); for (Change.Id changeId : allChanges.get(project)) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java index 826c8a0969..8f0d45f292 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CherryPickChange.java @@ -61,6 +61,7 @@ import java.util.List; import java.util.TimeZone; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; +import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; @@ -153,7 +154,8 @@ public class CherryPickChange { // created later on, to ensure the cherry-picked commit is flushed // before patch sets are updated. ObjectInserter oi = git.newObjectInserter(); - CodeReviewRevWalk revWalk = CodeReviewCommit.newRevWalk(oi.newReader())) { + ObjectReader reader = oi.newReader(); + CodeReviewRevWalk revWalk = CodeReviewCommit.newRevWalk(reader)) { Ref destRef = git.getRefDatabase().exactRef(targetRef); if (destRef == null) { throw new InvalidChangeOperationException( diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java index 641fb5a150..656c9d11f1 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateChange.java @@ -76,6 +76,7 @@ import org.eclipse.jgit.lib.CommitBuilder; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; +import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; @@ -184,7 +185,8 @@ public class CreateChange implements RestModifyView groups; if (input.baseChange != null) { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java index 499b0d5b02..5bd651d4bc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/change/CreateMergePatchSet.java @@ -56,6 +56,7 @@ import java.sql.Timestamp; import java.util.TimeZone; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectInserter; +import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; @@ -126,7 +127,8 @@ public class CreateMergePatchSet implements RestModifyView { Project.NameKey project = resource.getRevision().getChange().getProject(); try (Repository repository = repoManager.openRepository(project); ObjectInserter ins = repository.newObjectInserter(); - RevWalk revWalk = new RevWalk(ins.newReader())) { + ObjectReader reader = ins.newReader(); + RevWalk revWalk = new RevWalk(reader)) { String refName = resource.getRevision().getEdit().isPresent() ? resource.getRevision().getEdit().get().getRefName() diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java index ec4899a17b..194372f0cc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/notedb/NoteDbUpdateManager.java @@ -178,6 +178,7 @@ public class NoteDbUpdateManager implements AutoCloseable { @Override public void close() { + rw.getObjectReader().close(); rw.close(); if (close) { if (finalIns != null) { @@ -295,10 +296,18 @@ public class NoteDbUpdateManager implements AutoCloseable { } private OpenRepo openRepo(Project.NameKey p) throws IOException { - Repository repo = repoManager.openRepository(p); - ObjectInserter ins = repo.newObjectInserter(); - return new OpenRepo( - repo, new RevWalk(ins.newReader()), ins, new ChainedReceiveCommands(repo), true); + Repository repo = repoManager.openRepository(p); // Closed by OpenRepo#close. + ObjectInserter ins = repo.newObjectInserter(); // Closed by OpenRepo#close. + ObjectReader reader = ins.newReader(); // Not closed by OpenRepo#close. + try (RevWalk rw = new RevWalk(reader)) { // Doesn't escape OpenRepo constructor. + return new OpenRepo(repo, rw, ins, new ChainedReceiveCommands(repo), true) { + @Override + public void close() { + reader.close(); + super.close(); + } + }; + } } private boolean isEmpty() { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdate.java index ba4d93ba5a..4d0939b63b 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/update/BatchUpdate.java @@ -234,6 +234,7 @@ public abstract class BatchUpdate implements AutoCloseable { @Override public void close() { if (closeRepo) { + revWalk.getObjectReader().close(); revWalk.close(); inserter.close(); repo.close(); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java b/gerrit-server/src/main/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java index abbc1d4a7f..cf4ea37bdc 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/update/ReviewDbBatchUpdate.java @@ -79,6 +79,7 @@ import org.eclipse.jgit.lib.BatchRefUpdate; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.NullProgressMonitor; import org.eclipse.jgit.lib.ObjectInserter; +import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevWalk; @@ -401,16 +402,14 @@ class ReviewDbBatchUpdate extends BatchUpdate { } if (onSubmitValidators != null && commands != null && !commands.isEmpty()) { - // Validation of refs has to take place here and not at the beginning - // executeRefUpdates. Otherwise failing validation in a second - // BatchUpdate object will happen *after* first object's - // executeRefUpdates has finished, hence after first repo's refs have - // been updated, which is too late. - onSubmitValidators.validate( - project, - new ReadOnlyRepository(getRepository()), - ctx.getInserter().newReader(), - commands.getCommands()); + try (ObjectReader reader = ctx.getInserter().newReader()) { + // Validation of refs has to take place here and not at the beginning + // executeRefUpdates. Otherwise failing validation in a second BatchUpdate object will + // happen *after* first object's executeRefUpdates has finished, hence after first repo's + // refs have been updated, which is too late. + onSubmitValidators.validate( + project, new ReadOnlyRepository(getRepository()), reader, commands.getCommands()); + } } if (inserter != null) { diff --git a/lib/jgit/jgit.bzl b/lib/jgit/jgit.bzl index 679e9dfed6..414ffc782a 100644 --- a/lib/jgit/jgit.bzl +++ b/lib/jgit/jgit.bzl @@ -1,6 +1,6 @@ load("//tools/bzl:maven_jar.bzl", "GERRIT", "MAVEN_LOCAL", "MAVEN_CENTRAL", "maven_jar") -_JGIT_VERS = "4.6.1.201703071140-r.149-g61f830d3a" +_JGIT_VERS = "4.6.1.201703071140-r.169-g61e336475" _DOC_VERS = "4.6.0.201612231935-r" # Set to _JGIT_VERS unless using a snapshot @@ -26,28 +26,28 @@ def jgit_maven_repos(): name = "jgit_lib", artifact = "org.eclipse.jgit:org.eclipse.jgit:" + _JGIT_VERS, repository = _JGIT_REPO, - sha1 = "dbb390b827b968558342e882e0c9b90e1ed037a2", - src_sha1 = "05d8939d08fe75a080fbf84f3163df5127950985", + sha1 = "ae2d80dfa58eff4228425eb49cd22fc3190637b9", + src_sha1 = "693c525ef00a5e1ab918d90aff9893a19ebf43dd", unsign = True, ) maven_jar( name = "jgit_servlet", artifact = "org.eclipse.jgit:org.eclipse.jgit.http.server:" + _JGIT_VERS, repository = _JGIT_REPO, - sha1 = "136026aa28b065d04194cadcb3371b5a3f6c7235", + sha1 = "7610fde96610fbc17782ed383a721c4168bfd760", unsign = True, ) maven_jar( name = "jgit_archive", artifact = "org.eclipse.jgit:org.eclipse.jgit.archive:" + _JGIT_VERS, repository = _JGIT_REPO, - sha1 = "8be5fa1000cf66ff3deae257bb29870c93f83363", + sha1 = "c5c6ecac620a62a1f4115dcff63d7baa257582f1", ) maven_jar( name = "jgit_junit", artifact = "org.eclipse.jgit:org.eclipse.jgit.junit:" + _JGIT_VERS, repository = _JGIT_REPO, - sha1 = "d6a6c49b137a7f1a30ec55a228826d9146c0eba4", + sha1 = "5ed3263792c677e3e5a594d235f8360c38433324", unsign = True, )