From fae952ff0921168f450fbf32f9db74ccba1083a8 Mon Sep 17 00:00:00 2001 From: Matthias Thieroff Date: Thu, 21 Apr 2022 07:45:44 +0200 Subject: [PATCH] Fix open file handle prevent deleting a repository on Windows (#2008) Fixes the problem of unclosed file handles which occur when a repository or pack file is accessed (e.g. asynchronously in a post receive hook) after the file had already been closed. Such open file handle prevents deleting a repositories on Windows. --- gradle/changelog/fix_open_file_handles.yaml | 2 ++ .../repository/GitHookChangesetCollector.java | 25 ++++++------------- .../sonia/scm/web/GitRepositoryResolver.java | 6 ++--- 3 files changed, 11 insertions(+), 22 deletions(-) create mode 100644 gradle/changelog/fix_open_file_handles.yaml diff --git a/gradle/changelog/fix_open_file_handles.yaml b/gradle/changelog/fix_open_file_handles.yaml new file mode 100644 index 0000000000..8e13b093db --- /dev/null +++ b/gradle/changelog/fix_open_file_handles.yaml @@ -0,0 +1,2 @@ +- type: fixed + description: Open file handle prevent deleting a repository on Windows ([#2008](https://github.com/scm-manager/scm-manager/pull/2008)) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitHookChangesetCollector.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitHookChangesetCollector.java index 5d7de5ce27..4565e17754 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitHookChangesetCollector.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/GitHookChangesetCollector.java @@ -29,7 +29,6 @@ package sonia.scm.repository; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import org.eclipse.jgit.errors.IncorrectObjectTypeException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevSort; @@ -40,7 +39,6 @@ import org.eclipse.jgit.transport.ReceivePack; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import sonia.scm.util.IOUtil; import sonia.scm.web.CollectingPackParserListener; //~--- JDK imports ------------------------------------------------------------ @@ -92,16 +90,12 @@ public class GitHookChangesetCollector { Map changesets = Maps.newLinkedHashMap(); - org.eclipse.jgit.lib.Repository repository = rpack.getRepository(); - - RevWalk walk = null; - - GitChangesetConverter converter = null; - - try - { - walk = rpack.getRevWalk(); - converter = converterFactory.create(repository, walk); + try ( + org.eclipse.jgit.lib.Repository repository = rpack.getRepository(); + RevWalk walk = rpack.getRevWalk(); + GitChangesetConverter converter = converterFactory.create(repository, walk) + ) { + repository.incrementOpen(); for (ReceiveCommand rc : receiveCommands) { @@ -142,18 +136,13 @@ public class GitHookChangesetCollector { logger.error("could not collect changesets", ex); } - finally - { - IOUtil.close(converter); - GitUtil.release(walk); - } return Lists.newArrayList(changesets.values()); } private void collectChangesets(Map changesets, GitChangesetConverter converter, RevWalk walk, ReceiveCommand rc) - throws IncorrectObjectTypeException, IOException + throws IOException { ObjectId newId = rc.getNewId(); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java index 6ef843f38f..24bdbbd5e3 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/web/GitRepositoryResolver.java @@ -30,16 +30,14 @@ import com.google.common.base.Preconditions; import com.google.inject.Inject; import org.eclipse.jgit.errors.RepositoryNotFoundException; import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.lib.RepositoryCache; -import org.eclipse.jgit.lib.RepositoryCache.FileKey; import org.eclipse.jgit.transport.resolver.RepositoryResolver; import org.eclipse.jgit.transport.resolver.ServiceNotAuthorizedException; import org.eclipse.jgit.transport.resolver.ServiceNotEnabledException; -import org.eclipse.jgit.util.FS; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.GitConfig; import sonia.scm.repository.GitRepositoryHandler; +import sonia.scm.repository.GitUtil; import sonia.scm.repository.RepositoryProvider; import javax.servlet.http.HttpServletRequest; @@ -103,7 +101,7 @@ public class GitRepositoryResolver implements RepositoryResolver