From a32bd01c45265b732a553ff470e892cac22b81c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 2 Jun 2020 21:31:33 +0200 Subject: [PATCH] Fix peer review issues --- .../work/SimpleCachingWorkingCopyPool.java | 2 +- .../work/SimpleWorkingCopyFactory.java | 95 +----------------- .../SimpleWorkingCopyFactory_Sequence.png | Bin 0 -> 59594 bytes .../spi/GitWorkingCopyInitializer.java | 7 +- .../spi/GitWorkingCopyReclaimer.java | 7 +- .../modules/WorkingCopyPoolModule.java | 2 +- 6 files changed, 12 insertions(+), 101 deletions(-) create mode 100644 scm-core/src/main/java/sonia/scm/repository/work/doc-files/SimpleWorkingCopyFactory_Sequence.png diff --git a/scm-core/src/main/java/sonia/scm/repository/work/SimpleCachingWorkingCopyPool.java b/scm-core/src/main/java/sonia/scm/repository/work/SimpleCachingWorkingCopyPool.java index 7033d59772..1cb38a72f0 100644 --- a/scm-core/src/main/java/sonia/scm/repository/work/SimpleCachingWorkingCopyPool.java +++ b/scm-core/src/main/java/sonia/scm/repository/work/SimpleCachingWorkingCopyPool.java @@ -40,7 +40,7 @@ import java.util.concurrent.ConcurrentHashMap; * requested for a repository with {@link #getWorkingCopy(SimpleWorkingCopyFactory.WorkingCopyContext)}, * this implementation fetches a new directory from the {@link WorkdirProvider}. * On {@link #contextClosed(SimpleWorkingCopyFactory.WorkingCopyContext, File)}, - * the directory is not deleted, buy put into a map with the repository id as key. + * the directory is not deleted, but put into a map with the repository id as key. * When a working copy is requested with {@link #getWorkingCopy(SimpleWorkingCopyFactory.WorkingCopyContext)} * for a repository with such an existing directory, it is taken from the map, reclaimed and * returned as {@link WorkingCopy}. diff --git a/scm-core/src/main/java/sonia/scm/repository/work/SimpleWorkingCopyFactory.java b/scm-core/src/main/java/sonia/scm/repository/work/SimpleWorkingCopyFactory.java index 0b842ad78c..0905ce1081 100644 --- a/scm-core/src/main/java/sonia/scm/repository/work/SimpleWorkingCopyFactory.java +++ b/scm-core/src/main/java/sonia/scm/repository/work/SimpleWorkingCopyFactory.java @@ -55,97 +55,10 @@ import java.io.File; *
{@link #closeRepository(R)}
*
Closes resources allocated for the central repository.
* - *
- *                     ┌─────────────┐          ┌───────────────────────────┐                                        ┌───────────────┐                                 ┌───────────────┐
- *                     │ModifyCommand│          │SimpleGitWorkingCopyFactory│                                        │WorkingCopyPool│                                 │WorkdirProvider│
- *                     └──────┬──────┘          └─────────────┬─────────────┘                                        └───────┬───────┘                                 └───────┬───────┘
- *                            │      createWorkingCopy        │                                                              │                                                 │
- *                            │──────────────────────────────>│                                                              │                                                 │
- *                            │                               │                                                              │                                                 │
- *                            │                               │        create          ┌──────────────────┐                  │                                                 │
- *                            │                               │──────────────────────> │WorkingCopyContext│                  │                                                 │
- *                            │                               │                        └────────┬─────────┘                  │                                                 │
- *                            │                               │                       getWorkingCopy                         │                                                 │
- *                            │                               │─────────────────────────────────────────────────────────────>│                                                 │
- *                            │                               │                                 │                            │                                                 │
- *                            │                               │                                 │                            │                                                 │
- *                            │                               │                                 │                            │                                                 │
- *                            │                               │                                 │                            │                                                 │
- *                            │                               │                                 │          reclaim           │                                                 │
- *                            │                               │                                 │ <──────────────────────────│                                                 │
- *                            │                               │                                 │                            │                                                 │
- *                            │                               │                                 │                            │                                                 │
- *                            │                               │              ╔══════╤═══════════╪════════════════════════════╪═════════════════════════════════════════════════╪═════════════════╗
- *                            │                               │              ║ ALT  │  reclaim successful                    │                                                 │                 ║
- *                            │                               │              ╟──────┘           │                            │                                                 │                 ║
- *                            │                               │              ║                  │                            │                  ┌───────────┐                  │                 ║
- *                            │                               │              ║                  │ ─────────────────────────────────────────────>│WorkingCopy│                  │                 ║
- *                            │                               │              ║                  │                            │                  └─────┬─────┘                  │                 ║
- *                            │                               │              ║                  │        WorkingCopy         │                                                 │                 ║
- *                            │                               │              ║                  │ ──────────────────────────>│                                                 │                 ║
- *                            │                               │              ╠══════════════════╪════════════════════════════╪═════════════════════════════════════════════════╪═════════════════╣
- *                            │                               │              ║ [reclaim fails; create new]                   │                                                 │                 ║
- *                            │                               │              ║                  │   ReclaimFailedException   │                                                 │                 ║
- *                            │                               │              ║                  │ ──────────────────────────>│                                                 │                 ║
- *                            │                               │              ║                  │                            │                                                 │                 ║
- *                            │                               │              ║                  │                            │                createNewWorkdir                 │                 ║
- *                            │                               │              ║                  │                            │────────────────────────────────────────────────>│                 ║
- *                            │                               │              ║                  │                            │                                                 │                 ║
- *                            │                               │              ║                  │                            │                                                 │                 ║
- *                            │                               │              ║                  │                            │<────────────────────────────────────────────────│                 ║
- *                            │                               │              ║                  │                            │                                                 │                 ║
- *                            │                               │              ║                  │         initialize         │                                                 │                 ║
- *                            │                               │              ║                  │ <──────────────────────────│                                                 │                 ║
- *                            │                               │              ║                  │                            │                                                 │                 ║
- *                            │                               │              ║                  │                            │                  ┌───────────┐                  │                 ║
- *                            │                               │              ║                  │ ─────────────────────────────────────────────>│WorkingCopy│                  │                 ║
- *                            │                               │              ║                  │                            │                  └─────┬─────┘                  │                 ║
- *                            │                               │              ║                  │        WorkingCopy         │                        │                        │                 ║
- *                            │                               │              ║                  │ ──────────────────────────>│                        │                        │                 ║
- *                            │                               │              ╚══════════════════╪════════════════════════════╪════════════════════════╪════════════════════════╪═════════════════╝
- *                            │                               │                                 │                            │                        │                        │
- *                            │                               │                         WorkingCopy                          │                        │                        │
- *                            │                               │<─────────────────────────────────────────────────────────────│                        │                        │
- *                            │                               │                                 │                            │                        │                        │
- *                            │         WorkingCopy           │                                 │                            │                        │                        │
- *                            │<──────────────────────────────│                                 │                            │                        │                        │
- *                            │                               │                                 │                            │                        │                        │
- *                            .                               .                                 .                            .                        .                        .
- *                            .                               .                                 .                            .                        .                        .
- *                            .                               .                                 .                            .                        .                        .
- *                            .                               .                                 .                            .                        .                        .
- *                            │                               │                        doWork   │                            │                        │                        │
- *                            │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────>│                        │
- *                            │                               │                                 │                            │                        │                        │
- *                            .                               .                                 .                            .                        .                        .
- *                            .                               .                                 .                            .                        .                        .
- *                            .                               .                                 .                            .                        .                        .
- *                            .                               .                                 .                            .                        .                        .
- *                            │                               │                        close    │                            │                        │                        │
- *                            │──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────>│                        │
- *                            │                               │                                 │                            │                        │                        │
- *                            │                               │                                 │      close                 │                        │                        │
- *                            │                               │<──────────────────────────────────────────────────────────────────────────────────────│                        │
- *                            │                               │                                 │                            │                        │                        │
- *                            │                               ────┐                             │                            │                        │                        │
- *                            │                                   │ closeWorkingCopy            │                            │                        │                        │
- *                            │                               <───┘                             │                            │                        │                        │
- *                            │                               │                                 │                            │                        │                        │
- *                            │                               ────┐                             │                            │                        │                        │
- *                            │                                   │ closeRepository             │                            │                        │                        │
- *                            │                               <───┘                             │                            │                        │                        │
- *                            │                               │                                 │                            │                        │                        │
- *                            │                               │                        contextClosed                         │                        │                        │
- *                            │                               │─────────────────────────────────────────────────────────────>│                        │                        │
- *                            │                               │                                 │                            │                        │                        │
- *                            │                               │                                 │                            ────┐                    │                        │
- *                            │                               │                                 │                                │ cacheDirectory     │                        │
- *                            │                               │                                 │                            <───┘                    │                        │
- *                     ┌──────┴──────┐          ┌─────────────┴─────────────┐          ┌────────┴─────────┐          ┌───────┴───────┐          ┌─────┴─────┐          ┌───────┴───────┐
- *                     │ModifyCommand│          │SimpleGitWorkingCopyFactory│          │WorkingCopyContext│          │WorkingCopyPool│          │WorkingCopy│          │WorkdirProvider│
- *                     └─────────────┘          └───────────────────────────┘          └──────────────────┘          └───────────────┘          └───────────┘          └───────────────┘
- * 
- * + *
+ * The general process looks like this: + *
+ * * @param Type of central repository location * @param Type of working copy for repository * @param Type of repository context diff --git a/scm-core/src/main/java/sonia/scm/repository/work/doc-files/SimpleWorkingCopyFactory_Sequence.png b/scm-core/src/main/java/sonia/scm/repository/work/doc-files/SimpleWorkingCopyFactory_Sequence.png new file mode 100644 index 0000000000000000000000000000000000000000..6e9306bdddbbafc60fbd1dbe4be64c25a3f61e5f GIT binary patch literal 59594 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 literal 0 HcmV?d00001 diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java index d48a64cc25..11019b288c 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyInitializer.java @@ -24,6 +24,7 @@ package sonia.scm.repository.spi; +import com.google.common.base.Stopwatch; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.Constants; @@ -54,7 +55,7 @@ class GitWorkingCopyInitializer { public ParentAndClone initialize(File target, String initialBranch) { LOG.trace("clone repository {}", context.getRepository().getId()); - long start = System.nanoTime(); + Stopwatch stopwatch = Stopwatch.createStarted(); try { Repository clone = Git.cloneRepository() .setURI(simpleGitWorkingCopyFactory.createScmTransportProtocolUri(context.getDirectory())) @@ -73,9 +74,7 @@ class GitWorkingCopyInitializer { } catch (GitAPIException | IOException e) { throw new InternalRepositoryException(context.getRepository(), "could not clone working copy of repository", e); } finally { - long end = System.nanoTime(); - long duration = end - start; - LOG.trace("took {} ns to clone repository {}", duration, context.getRepository().getId()); + LOG.trace("took {} to clone repository {}", stopwatch.stop(), context.getRepository().getId()); } } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyReclaimer.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyReclaimer.java index c5ffd24aa7..3b605b531e 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyReclaimer.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitWorkingCopyReclaimer.java @@ -24,6 +24,7 @@ package sonia.scm.repository.spi; +import com.google.common.base.Stopwatch; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.ResetCommand; import org.eclipse.jgit.api.errors.GitAPIException; @@ -49,7 +50,7 @@ class GitWorkingCopyReclaimer { public ParentAndClone reclaim(File target, String initialBranch) throws SimpleWorkingCopyFactory.ReclaimFailedException { LOG.trace("reclaim repository {}", context.getRepository().getId()); - long start = System.nanoTime(); + Stopwatch stopwatch = Stopwatch.createStarted(); Repository repo = openTarget(target); try (Git git = Git.open(target)) { git.reset().setMode(ResetCommand.ResetType.HARD).call(); @@ -62,9 +63,7 @@ class GitWorkingCopyReclaimer { } catch (GitAPIException | IOException e) { throw new SimpleWorkingCopyFactory.ReclaimFailedException(e); } finally { - long end = System.nanoTime(); - long duration = end - start; - LOG.trace("took {} ns to reclaim repository {}\n", duration, context.getRepository().getId()); + LOG.trace("took {} to reclaim repository {}", stopwatch.stop(), context.getRepository().getId()); } } diff --git a/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/WorkingCopyPoolModule.java b/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/WorkingCopyPoolModule.java index 209e8263d0..a6871b8b74 100644 --- a/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/WorkingCopyPoolModule.java +++ b/scm-webapp/src/main/java/sonia/scm/lifecycle/modules/WorkingCopyPoolModule.java @@ -45,7 +45,7 @@ public class WorkingCopyPoolModule extends AbstractModule { Class strategyClass = (Class) classLoader.loadClass(workingCopyPoolStrategy); bind(WorkingCopyPool.class).to(strategyClass); } catch (Exception e) { - throw new RuntimeException("could not instantiate class for working copy pool: " + workingCopyPoolStrategy, e); + throw new IllegalStateException("could not instantiate class for working copy pool: " + workingCopyPoolStrategy, e); } } }