Update browser result after computation

This commit is contained in:
René Pfeuffer
2019-12-10 18:10:11 +01:00
parent 87904e3da8
commit 6f4074c21c
4 changed files with 70 additions and 40 deletions

View File

@@ -300,6 +300,13 @@ public final class BrowseCommandBuilder
return this; return this;
} }
private void updateCache(BrowserResult updatedResult) {
if (!disableCache) {
CacheKey key = new CacheKey(repository, request);
cache.put(key, updatedResult);
}
}
//~--- inner classes -------------------------------------------------------- //~--- inner classes --------------------------------------------------------
/** /**
@@ -416,5 +423,5 @@ public final class BrowseCommandBuilder
private final Repository repository; private final Repository repository;
/** request for the command */ /** request for the command */
private final BrowseCommandRequest request = new BrowseCommandRequest(); private final BrowseCommandRequest request = new BrowseCommandRequest(this::updateCache);
} }

View File

@@ -37,6 +37,10 @@ package sonia.scm.repository.spi;
import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects;
import com.google.common.base.Objects; import com.google.common.base.Objects;
import sonia.scm.repository.BrowserResult;
import java.util.function.Consumer;
/** /**
* *
* @author Sebastian Sdorra * @author Sebastian Sdorra
@@ -48,6 +52,14 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest
/** Field description */ /** Field description */
private static final long serialVersionUID = 7956624623516803183L; private static final long serialVersionUID = 7956624623516803183L;
public BrowseCommandRequest() {
this(null);
}
public BrowseCommandRequest(Consumer<BrowserResult> updater) {
this.updater = updater;
}
//~--- methods -------------------------------------------------------------- //~--- methods --------------------------------------------------------------
/** /**
@@ -220,6 +232,12 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest
return recursive; return recursive;
} }
public void updateCache(BrowserResult update) {
if (updater != null) {
updater.accept(update);
}
}
//~--- fields --------------------------------------------------------------- //~--- fields ---------------------------------------------------------------
/** disable last commit */ /** disable last commit */
@@ -230,4 +248,6 @@ public final class BrowseCommandRequest extends FileBaseCommandRequest
/** browse file objects recursive */ /** browse file objects recursive */
private boolean recursive = false; private boolean recursive = false;
private final Consumer<BrowserResult> updater;
} }

View File

@@ -56,6 +56,7 @@ import sonia.scm.repository.BrowserResult;
import sonia.scm.repository.FileObject; import sonia.scm.repository.FileObject;
import sonia.scm.repository.GitSubModuleParser; import sonia.scm.repository.GitSubModuleParser;
import sonia.scm.repository.GitUtil; import sonia.scm.repository.GitUtil;
import sonia.scm.repository.InternalRepositoryException;
import sonia.scm.repository.Repository; import sonia.scm.repository.Repository;
import sonia.scm.repository.SubRepository; import sonia.scm.repository.SubRepository;
import sonia.scm.store.Blob; import sonia.scm.store.Blob;
@@ -71,9 +72,7 @@ import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import static java.util.Optional.empty; import static java.util.Optional.empty;
import static sonia.scm.ContextEntry.ContextBuilder.entity; import static sonia.scm.ContextEntry.ContextBuilder.entity;
@@ -99,7 +98,6 @@ public class GitBrowseCommand extends AbstractGitCommand
LoggerFactory.getLogger(GitBrowseCommand.class); LoggerFactory.getLogger(GitBrowseCommand.class);
private final LfsBlobStoreFactory lfsBlobStoreFactory; private final LfsBlobStoreFactory lfsBlobStoreFactory;
private boolean fetchCommits = true;
private ExecutorService executorService; private ExecutorService executorService;
//~--- constructors --------------------------------------------------------- //~--- constructors ---------------------------------------------------------
@@ -130,13 +128,25 @@ public class GitBrowseCommand extends AbstractGitCommand
ObjectId revId = computeRevIdToBrowse(request, repo); ObjectId revId = computeRevIdToBrowse(request, repo);
if (revId != null) { 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 { } else {
logger.warn("could not find head of repository {}, empty?", repository.getNamespaceAndName()); logger.warn("could not find head of repository {}, empty?", repository.getNamespaceAndName());
return new BrowserResult(Constants.HEAD, request.getRevision(), createEmtpyRoot()); return new BrowserResult(Constants.HEAD, request.getRevision(), createEmtpyRoot());
} }
} finally { } finally {
executorService.shutdown(); 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 // don't show message and date for directories to improve performance
if (!file.isDirectory() &&!request.isDisableLastCommit()) if (!file.isDirectory() &&!request.isDisableLastCommit())
{ {
RevCommit commit = null; executorService.execute(() -> {
if (fetchCommits) {
logger.trace("fetch last commit for {} at {}", path, revId.getName()); logger.trace("fetch last commit for {} at {}", path, revId.getName());
Future<RevCommit> f = executorService.submit(() -> getLatestCommit(repo, revId, path)); RevCommit commit = getLatestCommit(repo, revId, path);
Optional<LfsPointer> lfsPointer;
try { try {
commit = f.get(100, TimeUnit.MILLISECONDS); lfsPointer = commit == null ? empty() : GitUtil.getLfsPointer(repo, path, commit, treeWalk);
} catch (TimeoutException e) { } catch (IOException e) {
logger.info("lookup of latest commit took too much time for {} at {}; disabling lookup on {}", path, revId.name(), repository.getNamespaceAndName()); throw new InternalRepositoryException(repository, "could not read lfs pointer", e);
fetchCommits = false;
} catch (Exception e) {
logger.warn("got exception while computing last commit for {} on {}", path, revId.name(), e);
} }
}
Optional<LfsPointer> lfsPointer = commit == null? empty(): GitUtil.getLfsPointer(repo, path, commit, treeWalk); if (lfsPointer.isPresent()) {
BlobStore lfsBlobStore = lfsBlobStoreFactory.getLfsBlobStore(repository);
if (lfsPointer.isPresent()) { String oid = lfsPointer.get().getOid().getName();
BlobStore lfsBlobStore = lfsBlobStoreFactory.getLfsBlobStore(repository); Blob blob = lfsBlobStore.get(oid);
String oid = lfsPointer.get().getOid().getName(); if (blob == null) {
Blob blob = lfsBlobStore.get(oid); logger.error("lfs blob for lob id {} not found in lfs store of repository {}", oid, repository.getNamespaceAndName());
if (blob == null) { file.setLength(-1);
logger.error("lfs blob for lob id {} not found in lfs store of repository {}", oid, repository.getNamespaceAndName()); } else {
file.setLength(-1); file.setLength(blob.getSize());
}
} else { } else {
file.setLength(blob.getSize()); file.setLength(loader.getSize());
} }
} else {
file.setLength(loader.getSize());
}
if (commit != null) if (commit != null) {
{ file.setLastModified(GitUtil.getCommitTime(commit));
file.setLastModified(GitUtil.getCommitTime(commit)); file.setDescription(commit.getShortMessage());
file.setDescription(commit.getShortMessage()); } else {
} logger.warn("could not find latest commit for {} on {}", path,
else if (fetchCommits) revId);
{ }
logger.warn("could not find latest commit for {} on {}", path, });
revId);
}
} }
} }
return file; return file;

View File

@@ -142,7 +142,7 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase {
} }
@Test @Test
public void testRecusive() throws IOException { public void testRecursive() throws IOException {
BrowseCommandRequest request = new BrowseCommandRequest(); BrowseCommandRequest request = new BrowseCommandRequest();
request.setRecursive(true); request.setRecursive(true);