Fix RepoView leak in CodeOwnerConfigValidator The onPreMerge() operation of CodeOwnerConfigValidator was creating a RepoView on-the-fly without a proper try-with-resource causing the leak of a Repository object reference counting. Extract the repoView creation in a separate variable and make sure it is included in the outer try-with-resource everywhere it is used. NOTE: ErrorProne should have spotted resources leaks in the first place, so we should consider enabling the MustBeClosedChecker. [1] https://errorprone.info/bugpattern/MustBeClosedChecker Change-Id: I2880a4cf8b76e2be979288c996720478f98b4fba
diff --git a/java/com/google/gerrit/plugins/codeowners/validation/CodeOwnerConfigValidator.java b/java/com/google/gerrit/plugins/codeowners/validation/CodeOwnerConfigValidator.java index 8411568..1a08131 100644 --- a/java/com/google/gerrit/plugins/codeowners/validation/CodeOwnerConfigValidator.java +++ b/java/com/google/gerrit/plugins/codeowners/validation/CodeOwnerConfigValidator.java
@@ -306,15 +306,15 @@ } else { try (InMemoryInserter ins = new InMemoryInserter(repository); ObjectReader reader = ins.newReader(); - RevWalk rw = new RevWalk(reader)) { + RevWalk rw = new RevWalk(reader); + RepoView repoView = new RepoView(repository, rw, ins)) { ChangeNotes changeNotes = changeNotesFactory.create(projectState.getNameKey(), commit.change().getId()); PatchSet patchSet = patchSetUtil.get(changeNotes, patchSetId); IdentifiedUser patchSetUploader = userFactory.create(patchSet.uploader()); validationResult = validateCodeOwnerConfig( - diffOperationsForCommitValidationFactory.create( - new RepoView(repository, rw, ins), ins), + diffOperationsForCommitValidationFactory.create(repoView, ins), branchNameKey, commit, patchSetUploader,
diff --git a/javatests/com/google/gerrit/plugins/codeowners/backend/config/CodeOwnersPluginConfigValidatorTest.java b/javatests/com/google/gerrit/plugins/codeowners/backend/config/CodeOwnersPluginConfigValidatorTest.java index c3dece0..0957119 100644 --- a/javatests/com/google/gerrit/plugins/codeowners/backend/config/CodeOwnersPluginConfigValidatorTest.java +++ b/javatests/com/google/gerrit/plugins/codeowners/backend/config/CodeOwnersPluginConfigValidatorTest.java
@@ -66,7 +66,8 @@ new TestRepository<>(repoManager.openRepository(project)); ObjectInserter ins = testRepo.getRepository().newObjectInserter(); ObjectReader reader = ins.newReader(); - RevWalk revWalk = new RevWalk(reader)) { + RevWalk revWalk = new RevWalk(reader); + RepoView repoView = new RepoView(testRepo.getRepository(), revWalk, ins)) { RevCommit commit = testRepo .commit() @@ -81,9 +82,7 @@ receiveEvent.commit = commit; receiveEvent.revWalk = testRepo.getRevWalk(); receiveEvent.repoConfig = new Config(); - receiveEvent.diffOperations = - diffOperationsForCommitValidationFactory.create( - new RepoView(testRepo.getRepository(), revWalk, ins), ins); + receiveEvent.diffOperations = diffOperationsForCommitValidationFactory.create(repoView, ins); CommitValidationException exception = assertThrows( CommitValidationException.class,