summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLuca Milanesio <luca.milanesio@gmail.com>2022-10-28 21:25:47 +0100
committerLuca Milanesio <luca.milanesio@gmail.com>2022-10-28 21:25:47 +0100
commitdb624fd4d296bde8b62dc4ca8d9fd2b5dfcd99ab (patch)
treea69f044522a26827b6ca66cdcdf29c9f898fc716
parente551f73e64380f2181b3aa65339bf16ecd268c1d (diff)
parent9a0822b613f346ce43eada6a893e7121201270dd (diff)
Merge branch 'stable-3.0' into stable-3.1
* stable-3.0: Cache repository locations in LocalDiskRepositoryManager Release-Notes: skip Change-Id: I5b6cd9e19c4a0b052da9705e0a8ddb0eced148c2
-rw-r--r--java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java21
1 files changed, 15 insertions, 6 deletions
diff --git a/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java b/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
index d42ed2578a..6ccb73c6ce 100644
--- a/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
+++ b/java/com/google/gerrit/server/git/LocalDiskRepositoryManager.java
@@ -33,8 +33,10 @@ import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.Collections;
import java.util.EnumSet;
+import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
import org.eclipse.jgit.errors.RepositoryNotFoundException;
import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.lib.ConfigConstants;
@@ -108,6 +110,7 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager {
}
private final Path basePath;
+ private final Map<Project.NameKey, FileKey> fileKeyByProject = new ConcurrentHashMap<>();
@Inject
LocalDiskRepositoryManager(SitePaths site, @GerritServerConfig Config cfg) {
@@ -129,17 +132,23 @@ public class LocalDiskRepositoryManager implements GitRepositoryManager {
@Override
public Repository openRepository(Project.NameKey name) throws RepositoryNotFoundException {
- return openRepository(getBasePath(name), name);
- }
+ FileKey cachedLocation = fileKeyByProject.get(name);
+ if (cachedLocation != null) {
+ try {
+ return RepositoryCache.open(cachedLocation);
+ } catch (IOException e) {
+ fileKeyByProject.remove(name, cachedLocation);
+ }
+ }
- private Repository openRepository(Path path, Project.NameKey name)
- throws RepositoryNotFoundException {
if (isUnreasonableName(name)) {
throw new RepositoryNotFoundException("Invalid name: " + name);
}
- FileKey loc = FileKey.lenient(path.resolve(name.get()).toFile(), FS.DETECTED);
+ FileKey location = FileKey.lenient(getBasePath(name).resolve(name.get()).toFile(), FS.DETECTED);
try {
- return RepositoryCache.open(loc);
+ Repository repo = RepositoryCache.open(location);
+ fileKeyByProject.put(name, location);
+ return repo;
} catch (IOException e) {
throw new RepositoryNotFoundException("Cannot open repository " + name, e);
}