From 6f4074c21cc628c2500bffc540c37591751fb86c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 10 Dec 2019 18:10:11 +0100 Subject: [PATCH] Update browser result after computation --- .../repository/api/BrowseCommandBuilder.java | 11 ++- .../repository/spi/BrowseCommandRequest.java | 20 +++++ .../scm/repository/spi/GitBrowseCommand.java | 77 ++++++++++--------- .../repository/spi/GitBrowseCommandTest.java | 2 +- 4 files changed, 70 insertions(+), 40 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java b/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java index d482c04ea4..563557f0c1 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/BrowseCommandBuilder.java @@ -199,7 +199,7 @@ public final class BrowseCommandBuilder return this; } - + /** * Disabling the last commit means that every call to * {@link FileObject#getDescription()} and @@ -300,6 +300,13 @@ public final class BrowseCommandBuilder return this; } + private void updateCache(BrowserResult updatedResult) { + if (!disableCache) { + CacheKey key = new CacheKey(repository, request); + cache.put(key, updatedResult); + } + } + //~--- inner classes -------------------------------------------------------- /** @@ -416,5 +423,5 @@ public final class BrowseCommandBuilder private final Repository repository; /** request for the command */ - private final BrowseCommandRequest request = new BrowseCommandRequest(); + private final BrowseCommandRequest request = new BrowseCommandRequest(this::updateCache); } diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java index 39da9a9ace..0c82c71331 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/BrowseCommandRequest.java @@ -37,6 +37,10 @@ package sonia.scm.repository.spi; import com.google.common.base.MoreObjects; import com.google.common.base.Objects; +import sonia.scm.repository.BrowserResult; + +import java.util.function.Consumer; + /** * * @author Sebastian Sdorra @@ -48,6 +52,14 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest /** Field description */ private static final long serialVersionUID = 7956624623516803183L; + public BrowseCommandRequest() { + this(null); + } + + public BrowseCommandRequest(Consumer updater) { + this.updater = updater; + } + //~--- methods -------------------------------------------------------------- /** @@ -220,6 +232,12 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest return recursive; } + public void updateCache(BrowserResult update) { + if (updater != null) { + updater.accept(update); + } + } + //~--- fields --------------------------------------------------------------- /** disable last commit */ @@ -230,4 +248,6 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest /** browse file objects recursive */ private boolean recursive = false; + + private final Consumer updater; } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java index 753802d3eb..6b02ab5fd7 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitBrowseCommand.java @@ -56,6 +56,7 @@ import sonia.scm.repository.BrowserResult; import sonia.scm.repository.FileObject; import sonia.scm.repository.GitSubModuleParser; import sonia.scm.repository.GitUtil; +import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Repository; import sonia.scm.repository.SubRepository; import sonia.scm.store.Blob; @@ -71,9 +72,7 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; import static java.util.Optional.empty; import static sonia.scm.ContextEntry.ContextBuilder.entity; @@ -99,7 +98,6 @@ public class GitBrowseCommand extends AbstractGitCommand LoggerFactory.getLogger(GitBrowseCommand.class); private final LfsBlobStoreFactory lfsBlobStoreFactory; - private boolean fetchCommits = true; private ExecutorService executorService; //~--- constructors --------------------------------------------------------- @@ -130,13 +128,25 @@ public class GitBrowseCommand extends AbstractGitCommand ObjectId revId = computeRevIdToBrowse(request, repo); if (revId != null) { - return new BrowserResult(revId.getName(), request.getRevision(), getEntry(repo, request, revId)); + BrowserResult browserResult = new BrowserResult(revId.getName(), request.getRevision(), getEntry(repo, request, revId)); + executorService.execute(() -> { + request.updateCache(browserResult); + logger.info("updated browser result for repository {}", repository.getNamespaceAndName()); + }); + return browserResult; } else { logger.warn("could not find head of repository {}, empty?", repository.getNamespaceAndName()); return new BrowserResult(Constants.HEAD, request.getRevision(), createEmtpyRoot()); } } finally { executorService.shutdown(); + try { + if (!executorService.awaitTermination(10, TimeUnit.SECONDS)) { + logger.info("lookup of all commits took too long in repo {}", repository.getNamespaceAndName()); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } } } @@ -209,46 +219,39 @@ public class GitBrowseCommand extends AbstractGitCommand // don't show message and date for directories to improve performance if (!file.isDirectory() &&!request.isDisableLastCommit()) { - RevCommit commit = null; - if (fetchCommits) { + executorService.execute(() -> { logger.trace("fetch last commit for {} at {}", path, revId.getName()); - Future f = executorService.submit(() -> getLatestCommit(repo, revId, path)); + RevCommit commit = getLatestCommit(repo, revId, path); + + Optional lfsPointer; try { - commit = f.get(100, TimeUnit.MILLISECONDS); - } catch (TimeoutException e) { - logger.info("lookup of latest commit took too much time for {} at {}; disabling lookup on {}", path, revId.name(), repository.getNamespaceAndName()); - fetchCommits = false; - } catch (Exception e) { - logger.warn("got exception while computing last commit for {} on {}", path, revId.name(), e); + lfsPointer = commit == null ? empty() : GitUtil.getLfsPointer(repo, path, commit, treeWalk); + } catch (IOException e) { + throw new InternalRepositoryException(repository, "could not read lfs pointer", e); } - } - Optional lfsPointer = commit == null? empty(): GitUtil.getLfsPointer(repo, path, commit, treeWalk); - - if (lfsPointer.isPresent()) { - BlobStore lfsBlobStore = lfsBlobStoreFactory.getLfsBlobStore(repository); - String oid = lfsPointer.get().getOid().getName(); - Blob blob = lfsBlobStore.get(oid); - if (blob == null) { - logger.error("lfs blob for lob id {} not found in lfs store of repository {}", oid, repository.getNamespaceAndName()); - file.setLength(-1); + if (lfsPointer.isPresent()) { + BlobStore lfsBlobStore = lfsBlobStoreFactory.getLfsBlobStore(repository); + String oid = lfsPointer.get().getOid().getName(); + Blob blob = lfsBlobStore.get(oid); + if (blob == null) { + logger.error("lfs blob for lob id {} not found in lfs store of repository {}", oid, repository.getNamespaceAndName()); + file.setLength(-1); + } else { + file.setLength(blob.getSize()); + } } else { - file.setLength(blob.getSize()); + file.setLength(loader.getSize()); } - } else { - file.setLength(loader.getSize()); - } - if (commit != null) - { - file.setLastModified(GitUtil.getCommitTime(commit)); - file.setDescription(commit.getShortMessage()); - } - else if (fetchCommits) - { - logger.warn("could not find latest commit for {} on {}", path, - revId); - } + if (commit != null) { + file.setLastModified(GitUtil.getCommitTime(commit)); + file.setDescription(commit.getShortMessage()); + } else { + logger.warn("could not find latest commit for {} on {}", path, + revId); + } + }); } } return file; diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java index 4b854f6209..61d877bd4a 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitBrowseCommandTest.java @@ -142,7 +142,7 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase { } @Test - public void testRecusive() throws IOException { + public void testRecursive() throws IOException { BrowseCommandRequest request = new BrowseCommandRequest(); request.setRecursive(true);