Merge branch 'stable-3.3' into master
* stable-3.3:
Move migration command over HTTP
Separate H2 command operations from SSH
Fix 'invalid metric name' error
Fix NPE thrown by LRU Cache
Change-Id: Ic562124d11ffbb2d60003bc66774acbcf4ab99d7
diff --git a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheFactory.java b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheFactory.java
index 491b5dc..b4cec3b 100644
--- a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheFactory.java
+++ b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheFactory.java
@@ -16,15 +16,14 @@
import com.google.common.cache.Cache;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
-import com.google.common.flogger.FluentLogger;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.metrics.MetricMaker;
import com.google.gerrit.server.cache.CacheBackend;
import com.google.gerrit.server.cache.MemoryCacheFactory;
+import com.google.gerrit.server.cache.PersistentCacheBaseFactory;
import com.google.gerrit.server.cache.PersistentCacheDef;
-import com.google.gerrit.server.cache.PersistentCacheFactory;
import com.google.gerrit.server.config.GerritServerConfig;
import com.google.gerrit.server.config.SitePaths;
import com.google.gerrit.server.logging.LoggingContextAwareScheduledExecutorService;
@@ -34,7 +33,6 @@
import java.io.File;
import java.io.IOException;
import java.io.UncheckedIOException;
-import java.nio.file.Files;
import java.nio.file.Path;
import java.util.LinkedList;
import java.util.List;
@@ -45,17 +43,12 @@
import org.eclipse.jgit.lib.Config;
@Singleton
-class ChronicleMapCacheFactory implements PersistentCacheFactory, LifecycleListener {
- private static final FluentLogger logger = FluentLogger.forEnclosingClass();
-
- private final MemoryCacheFactory memCacheFactory;
- private final Config config;
+class ChronicleMapCacheFactory extends PersistentCacheBaseFactory implements LifecycleListener {
private final ChronicleMapCacheConfig.Factory configFactory;
private final MetricMaker metricMaker;
private final DynamicMap<Cache<?, ?>> cacheMap;
private final List<ChronicleMapCacheImpl<?, ?>> caches;
private final ScheduledExecutorService cleanup;
- private final Path cacheDir;
@Inject
ChronicleMapCacheFactory(
@@ -65,12 +58,10 @@
ChronicleMapCacheConfig.Factory configFactory,
DynamicMap<Cache<?, ?>> cacheMap,
MetricMaker metricMaker) {
- this.memCacheFactory = memCacheFactory;
- this.config = cfg;
+ super(memCacheFactory, cfg, site);
this.configFactory = configFactory;
this.metricMaker = metricMaker;
this.caches = new LinkedList<>();
- this.cacheDir = getCacheDir(site, cfg.getString("cache", null, "directory"));
this.cacheMap = cacheMap;
this.cleanup =
new LoggingContextAwareScheduledExecutorService(
@@ -83,10 +74,8 @@
}
@Override
- public <K, V> Cache<K, V> build(PersistentCacheDef<K, V> in, CacheBackend backend) {
- if (isInMemoryCache(in)) {
- return memCacheFactory.build(in, backend);
- }
+ public <K, V> Cache<K, V> buildImpl(
+ PersistentCacheDef<K, V> in, long limit, CacheBackend backend) {
ChronicleMapCacheConfig config =
configFactory.create(
in.configKey(),
@@ -106,11 +95,8 @@
}
@Override
- public <K, V> LoadingCache<K, V> build(
- PersistentCacheDef<K, V> in, CacheLoader<K, V> loader, CacheBackend backend) {
- if (isInMemoryCache(in)) {
- return memCacheFactory.build(in, loader, backend);
- }
+ public <K, V> LoadingCache<K, V> buildImpl(
+ PersistentCacheDef<K, V> in, CacheLoader<K, V> loader, long limit, CacheBackend backend) {
ChronicleMapCacheConfig config =
configFactory.create(
in.configKey(),
@@ -141,11 +127,6 @@
}
}
- private <K, V> boolean isInMemoryCache(PersistentCacheDef<K, V> in) {
- return cacheDir == null
- || config.getLong("cache", in.configKey(), "diskLimit", in.diskLimit()) <= 0;
- }
-
@Override
public void start() {
for (ChronicleMapCacheImpl<?, ?> cache : caches) {
@@ -161,25 +142,4 @@
public static File fileName(Path cacheDir, String name, Integer version) {
return cacheDir.resolve(String.format("%s_%s.dat", name, version)).toFile();
}
-
- private static Path getCacheDir(SitePaths site, String name) {
- if (name == null) {
- return null;
- }
- Path loc = site.resolve(name);
- if (!Files.exists(loc)) {
- try {
- Files.createDirectories(loc);
- } catch (IOException e) {
- logger.atWarning().log("Can't create disk cache: %s", loc.toAbsolutePath());
- return null;
- }
- }
- if (!Files.isWritable(loc)) {
- logger.atWarning().log("Can't write to disk cache: %s", loc.toAbsolutePath());
- return null;
- }
- logger.atInfo().log("Enabling disk cache %s", loc.toAbsolutePath());
- return loc;
- }
}