diff --git a/Documentation/licenses.txt b/Documentation/licenses.txt index 18501b3e27..394886d637 100644 --- a/Documentation/licenses.txt +++ b/Documentation/licenses.txt @@ -88,6 +88,8 @@ Apache2.0 * openid:xerces * polymer_externs:polymer_closure * blame-cache +* caffeine +* caffeine-guava * gson * guava * guava-failureaccess diff --git a/WORKSPACE b/WORKSPACE index 4e2c97027c..7529d8abda 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -241,6 +241,31 @@ maven_jar( sha1 = "1dcf1de382a0bf95a3d8b0849546c88bac1292c9", ) +CAFFEINE_VERS = "2.8.0" + +maven_jar( + name = "caffeine", + artifact = "com.github.ben-manes.caffeine:caffeine:" + CAFFEINE_VERS, + sha1 = "6000774d7f8412ced005a704188ced78beeed2bb", +) + +# TODO(davido): Rename guava.jar to caffeine-guava.jar on fetch to prevent potential +# naming collision between caffeine guava adapater and guava library itself. +# Remove this renaming procedure, once this upstream issue is fixed: +# https://github.com/ben-manes/caffeine/issues/364. +http_file( + name = "caffeine-guava-renamed", + downloaded_file_path = "caffeine-guava-" + CAFFEINE_VERS + ".jar", + sha256 = "3a66ee3ec70971dee0bae6e56bda7b8742bc4bedd7489161bfbbaaf7137d89e1", + urls = [ + "https://repo1.maven.org/maven2/com/github/ben-manes/caffeine/guava/" + + CAFFEINE_VERS + + "/guava-" + + CAFFEINE_VERS + + ".jar", + ], +) + maven_jar( name = "jsch", artifact = "com.jcraft:jsch:0.1.54", diff --git a/java/com/google/gerrit/server/cache/mem/BUILD b/java/com/google/gerrit/server/cache/mem/BUILD index d805e1fd20..a666df7bc8 100644 --- a/java/com/google/gerrit/server/cache/mem/BUILD +++ b/java/com/google/gerrit/server/cache/mem/BUILD @@ -8,6 +8,8 @@ java_library( "//java/com/google/gerrit/common:annotations", "//java/com/google/gerrit/extensions:api", "//java/com/google/gerrit/server", + "//lib:caffeine", + "//lib:caffeine-guava", "//lib:guava", "//lib:jgit", "//lib/guice", diff --git a/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java b/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java index f76b8dbcea..0a42ce10f8 100644 --- a/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java +++ b/java/com/google/gerrit/server/cache/mem/DefaultMemoryCacheFactory.java @@ -17,12 +17,15 @@ package com.google.gerrit.server.cache.mem; import static java.util.concurrent.TimeUnit.NANOSECONDS; import static java.util.concurrent.TimeUnit.SECONDS; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.RemovalListener; +import com.github.benmanes.caffeine.cache.Weigher; +import com.github.benmanes.caffeine.guava.CaffeinatedGuava; import com.google.common.base.Strings; import com.google.common.cache.Cache; -import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; -import com.google.common.cache.Weigher; +import com.google.common.cache.RemovalNotification; import com.google.gerrit.common.Nullable; import com.google.gerrit.server.cache.CacheDef; import com.google.gerrit.server.cache.ForwardingRemovalListener; @@ -47,28 +50,21 @@ class DefaultMemoryCacheFactory implements MemoryCacheFactory { @Override public Cache build(CacheDef def) { - return create(def).build(); + return CaffeinatedGuava.build(create(def)); } @Override public LoadingCache build(CacheDef def, CacheLoader loader) { - return create(def).build(loader); + return CaffeinatedGuava.build(create(def), loader); } - @SuppressWarnings("unchecked") - private CacheBuilder create(CacheDef def) { - CacheBuilder builder = newCacheBuilder(); + private Caffeine create(CacheDef def) { + Caffeine builder = newCacheBuilder(); builder.recordStats(); builder.maximumWeight( cfg.getLong("cache", def.configKey(), "memoryLimit", def.maximumWeight())); - - builder = builder.removalListener(forwardingRemovalListenerFactory.create(def.name())); - - Weigher weigher = def.weigher(); - if (weigher == null) { - weigher = unitWeight(); - } - builder.weigher(weigher); + builder = builder.removalListener(newRemovalListener(def.name())); + builder.weigher(newWeigher(def.weigher())); Duration expireAfterWrite = def.expireAfterWrite(); if (has(def.configKey(), "maxAge")) { @@ -107,11 +103,22 @@ class DefaultMemoryCacheFactory implements MemoryCacheFactory { } @SuppressWarnings("unchecked") - private static CacheBuilder newCacheBuilder() { - return (CacheBuilder) CacheBuilder.newBuilder(); + private static Caffeine newCacheBuilder() { + return (Caffeine) Caffeine.newBuilder(); } - private static Weigher unitWeight() { - return (key, value) -> 1; + @SuppressWarnings("unchecked") + private RemovalListener newRemovalListener(String cacheName) { + return (k, v, cause) -> + forwardingRemovalListenerFactory + .create(cacheName) + .onRemoval( + RemovalNotification.create( + k, v, com.google.common.cache.RemovalCause.valueOf(cause.name()))); + } + + private static Weigher newWeigher( + com.google.common.cache.Weigher guavaWeigher) { + return guavaWeigher == null ? Weigher.singletonWeigher() : (k, v) -> guavaWeigher.weigh(k, v); } } diff --git a/lib/BUILD b/lib/BUILD index 13580b1c9b..39c622abfe 100644 --- a/lib/BUILD +++ b/lib/BUILD @@ -1,4 +1,4 @@ -load("@rules_java//java:defs.bzl", "java_library") +load("@rules_java//java:defs.bzl", "java_import", "java_library") exports_files(glob([ "LICENSE-*", @@ -110,6 +110,29 @@ java_library( ], ) +java_library( + name = "caffeine", + data = ["//lib:LICENSE-Apache2.0"], + visibility = [ + "//java/com/google/gerrit/server/cache/mem:__pkg__", + ], + exports = ["@caffeine//jar"], +) + +java_import( + name = "caffeine-guava-renamed", + jars = ["@caffeine-guava-renamed//file"], +) + +java_library( + name = "caffeine-guava", + data = ["//lib:LICENSE-Apache2.0"], + visibility = [ + "//java/com/google/gerrit/server/cache/mem:__pkg__", + ], + exports = [":caffeine-guava-renamed"], +) + java_library( name = "jsch", data = ["//lib:LICENSE-jsch"],