Merge branch 'stable-3.3' into stable-3.4 * stable-3.3: Front CacheChronicleMap with a Guava cache Change-Id: I571a7c16560c8b34a6075aaad94e8c19662e6f22
diff --git a/BUILD b/BUILD index 1f813d4..45afb1a 100644 --- a/BUILD +++ b/BUILD
@@ -52,6 +52,7 @@ srcs = glob(["src/test/java/**/*IT.java"]), group = "server_cache", labels = ["server"], + vm_args = ["-Xmx2G"], deps = [ ":cache-chroniclemap__plugin", ":chroniclemap-test-lib",
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 58e2ff5..e1eb5ab 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
@@ -17,15 +17,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.LoggingContextAwareExecutorService; @@ -36,7 +35,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; @@ -48,17 +46,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; private final LoggingContextAwareExecutorService storePersistenceExecutor; @@ -70,12 +63,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( @@ -92,15 +83,8 @@ } @Override - public <K, V> Cache<K, V> build(PersistentCacheDef<K, V> in, CacheBackend backend) { - return build(in, backend, metricMaker); - } - - public <K, V> Cache<K, V> build( - PersistentCacheDef<K, V> in, CacheBackend backend, MetricMaker metricMaker) { - 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(), @@ -151,21 +135,8 @@ } @Override - public <K, V> LoadingCache<K, V> build( - PersistentCacheDef<K, V> in, CacheLoader<K, V> loader, CacheBackend backend) { - return build(in, loader, backend, metricMaker); - } - - @VisibleForTesting - public <K, V> LoadingCache<K, V> build( - PersistentCacheDef<K, V> in, - CacheLoader<K, V> loader, - CacheBackend backend, - MetricMaker metricMaker) { - - 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(), @@ -227,11 +198,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) { @@ -249,23 +215,6 @@ } protected 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; + return site.resolve(name); } }
diff --git a/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/AnalyzeH2CachesIT.java b/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/AnalyzeH2CachesIT.java index 15140b8..482b9da 100644 --- a/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/AnalyzeH2CachesIT.java +++ b/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/AnalyzeH2CachesIT.java
@@ -49,7 +49,6 @@ String result = adminSshSession.exec(cmd); adminSshSession.assertSuccess(); - assertThat(result).contains("[cache \"mergeability\"]\n" + "\tmaxEntries = 1\n"); assertThat(result).contains("[cache \"diff\"]\n" + "\tmaxEntries = 1\n"); assertThat(result).contains("[cache \"accounts\"]\n" + "\tmaxEntries = 4\n"); assertThat(result).contains("[cache \"diff_summary\"]\n" + "\tmaxEntries = 1\n"); @@ -70,7 +69,6 @@ "WARN: Cache change_kind is empty, skipping.", "WARN: Cache diff_summary is empty, skipping.", "WARN: Cache diff is empty, skipping.", - "WARN: Cache mergeability is empty, skipping.", "WARN: Cache pure_revert is empty, skipping.", "WARN: Cache git_tags is empty, skipping."); String result = adminSshSession.exec(cmd); @@ -90,7 +88,6 @@ "WARN: Cache change_kind is empty, skipping.", "WARN: Cache diff_summary is empty, skipping.", "WARN: Cache diff is empty, skipping.", - "WARN: Cache mergeability is empty, skipping.", "WARN: Cache pure_revert is empty, skipping.", "WARN: Cache git_tags is empty, skipping."); String result = adminSshSession.exec(cmd);
diff --git a/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesIT.java b/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesIT.java index 8fad5ed..57b0e46 100644 --- a/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesIT.java +++ b/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesIT.java
@@ -58,7 +58,7 @@ public class AutoAdjustCachesIT extends LightweightPluginDaemonTest { private static final String SSH_CMD = "cache-chroniclemap auto-adjust-caches"; private static final String REST_CMD = "/plugins/cache-chroniclemap/auto-adjust-caches"; - private static final String MERGEABILITY = "mergeability"; + private static final String GROUPS_BYUUID_PERSISTED = "groups_byuuid_persisted"; private static final String DIFF = "diff"; private static final String DIFF_SUMMARY = "diff_summary"; private static final String ACCOUNTS = "accounts"; @@ -71,7 +71,7 @@ private static final Function<String, Boolean> MATCH_ALL = (n) -> true; private static final ImmutableList<String> EXPECTED_CACHES = - ImmutableList.of(MERGEABILITY, DIFF, DIFF_SUMMARY, ACCOUNTS, PERSISTED_PROJECTS); + ImmutableList.of(GROUPS_BYUUID_PERSISTED, DIFF, DIFF_SUMMARY, ACCOUNTS, PERSISTED_PROJECTS); @Inject private SitePaths sitePaths;