Revert "Reduce chance of deadlock in account cache"
This reverts commit 00fc15ac0073b86270e7c0f40d386f95dfe31e86.
With Caffeine, accessing the cache from the cache loader is causing an
infinite loop [1]. On stable-2.14, the only circular dependency was removed
but it looks like there is another one on stable-2.15. Revert the change
until circular dependency is removed or a solution is found to access
the cache from the cache loader.
The test going into an infinite loop is
RevisionDiffIT.rebaseHunksOneLineApartFromRegularHunkAreIdentified.
[1]https://github.com/ben-manes/caffeine/issues/89
Bug: Issue 8464
Change-Id: If65560b4a9bfcf0a03decaedd83ad000c6b28f4f
diff --git a/WORKSPACE b/WORKSPACE
index f975c8d..5f994da 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -213,18 +213,6 @@
)
maven_jar(
- name = "caffeine",
- artifact = "com.github.ben-manes.caffeine:caffeine:2.6.1",
- sha1 = "fc7a29feda0a3c5aaf1ff55e0df5417025e6d5f4",
-)
-
-maven_jar(
- name = "caffeine_guava",
- artifact = "com.github.ben-manes.caffeine:guava:2.6.1",
- sha1 = "e1fbe0d8c06639d6fee74404f687f00da25671eb",
-)
-
-maven_jar(
name = "velocity",
artifact = "org.apache.velocity:velocity:1.7",
sha1 = "2ceb567b8f3f21118ecdec129fe1271dbc09aa7a",
diff --git a/gerrit-cache-h2/BUILD b/gerrit-cache-h2/BUILD
index 55d47c2..45cf416 100644
--- a/gerrit-cache-h2/BUILD
+++ b/gerrit-cache-h2/BUILD
@@ -8,8 +8,6 @@
"//gerrit-common:server",
"//gerrit-extension-api:api",
"//gerrit-server:server",
- "//lib:caffeine",
- "//lib:caffeine_guava",
"//lib:guava",
"//lib:h2",
"//lib/guice",
@@ -24,8 +22,6 @@
deps = [
":cache-h2",
"//gerrit-server:server",
- "//lib:caffeine",
- "//lib:caffeine_guava",
"//lib:guava",
"//lib:h2",
"//lib:junit",
diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/DefaultCacheFactory.java b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/DefaultCacheFactory.java
index 7b85834..3566955 100644
--- a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/DefaultCacheFactory.java
+++ b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/DefaultCacheFactory.java
@@ -14,16 +14,12 @@
package com.google.gerrit.server.cache.h2;
-import com.github.benmanes.caffeine.cache.Caffeine;
-import com.github.benmanes.caffeine.cache.RemovalCause;
-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.RemovalNotification;
+import com.google.common.cache.Weigher;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.server.cache.CacheBinding;
import com.google.gerrit.server.cache.ForwardingRemovalListener;
@@ -61,48 +57,35 @@
@Override
public <K, V> Cache<K, V> build(CacheBinding<K, V> def) {
- return CaffeinatedGuava.build(create(def, false));
+ return create(def, false).build();
}
@Override
public <K, V> LoadingCache<K, V> build(CacheBinding<K, V> def, CacheLoader<K, V> loader) {
- return CaffeinatedGuava.build(create(def, false), loader);
+ return create(def, false).build(loader);
}
@SuppressWarnings("unchecked")
- <K, V> Caffeine<K, V> create(CacheBinding<K, V> def, boolean unwrapValueHolder) {
- Caffeine<K, V> builder = newCacheBuilder();
+ <K, V> CacheBuilder<K, V> create(CacheBinding<K, V> def, boolean unwrapValueHolder) {
+ CacheBuilder<K, V> builder = newCacheBuilder();
builder.recordStats();
builder.maximumWeight(cfg.getLong("cache", def.name(), "memoryLimit", def.maximumWeight()));
- builder =
- builder.removalListener(
- new CaffeineToGuavaRemovalListener<K, V>(
- forwardingRemovalListenerFactory.create(def.name())));
+ builder = builder.removalListener(forwardingRemovalListenerFactory.create(def.name()));
- Weigher<K, V> weigher = null;
- com.google.common.cache.Weigher<K, V> guavaWeigher = def.weigher();
- if (guavaWeigher != null) {
- if (unwrapValueHolder) {
- weigher =
- (Weigher<K, V>)
- new Weigher<K, ValueHolder<V>>() {
- @Override
- public int weigh(K key, ValueHolder<V> value) {
- return guavaWeigher.weigh(key, value.value);
- }
- };
- } else {
- weigher =
- new Weigher<K, V>() {
- @Override
- public int weigh(K key, V value) {
- return guavaWeigher.weigh(key, value);
- }
- };
- }
- } else {
- weigher = Weigher.singletonWeigher();
+ Weigher<K, V> weigher = def.weigher();
+ if (weigher != null && unwrapValueHolder) {
+ final Weigher<K, V> impl = weigher;
+ weigher =
+ (Weigher<K, V>)
+ new Weigher<K, ValueHolder<V>>() {
+ @Override
+ public int weigh(K key, ValueHolder<V> value) {
+ return impl.weigh(key, value.value);
+ }
+ };
+ } else if (weigher == null) {
+ weigher = unitWeight();
}
builder.weigher(weigher);
@@ -124,24 +107,16 @@
}
@SuppressWarnings("unchecked")
- private static <K, V> Caffeine<K, V> newCacheBuilder() {
- return (Caffeine<K, V>) Caffeine.newBuilder();
+ private static <K, V> CacheBuilder<K, V> newCacheBuilder() {
+ return (CacheBuilder<K, V>) CacheBuilder.newBuilder();
}
- private static class CaffeineToGuavaRemovalListener<K, V> implements RemovalListener<K, V> {
-
- private com.google.common.cache.RemovalListener<K, V> guavalistener;
-
- private CaffeineToGuavaRemovalListener(
- com.google.common.cache.RemovalListener<K, V> guavalistener) {
- this.guavalistener = guavalistener;
- }
-
- @Override
- public void onRemoval(K key, V value, RemovalCause cause) {
- guavalistener.onRemoval(
- RemovalNotification.create(
- key, value, com.google.common.cache.RemovalCause.valueOf(cause.name())));
- }
+ private static <K, V> Weigher<K, V> unitWeight() {
+ return new Weigher<K, V>() {
+ @Override
+ public int weigh(K key, V value) {
+ return 1;
+ }
+ };
}
}
diff --git a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
index 7e49bd0..1283452 100644
--- a/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
+++ b/gerrit-cache-h2/src/main/java/com/google/gerrit/server/cache/h2/H2CacheFactory.java
@@ -14,7 +14,6 @@
package com.google.gerrit.server.cache.h2;
-import com.github.benmanes.caffeine.guava.CaffeinatedGuava;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
@@ -169,7 +168,7 @@
executor,
store,
def.keyType(),
- (Cache<K, ValueHolder<V>>) CaffeinatedGuava.build(defaultFactory.create(def, true)));
+ (Cache<K, ValueHolder<V>>) defaultFactory.create(def, true).build());
synchronized (caches) {
caches.add(cache);
}
@@ -189,9 +188,9 @@
newSqlStore(def.name(), def.keyType(), limit, def.expireAfterWrite(TimeUnit.SECONDS));
Cache<K, ValueHolder<V>> mem =
(Cache<K, ValueHolder<V>>)
- CaffeinatedGuava.build(
- defaultFactory.create(def, true),
- (CacheLoader<K, V>) new H2CacheImpl.Loader<>(executor, store, loader));
+ defaultFactory
+ .create(def, true)
+ .build((CacheLoader<K, V>) new H2CacheImpl.Loader<>(executor, store, loader));
H2CacheImpl<K, V> cache = new H2CacheImpl<>(executor, store, def.keyType(), mem);
caches.add(cache);
return cache;
diff --git a/gerrit-plugin-api/BUILD b/gerrit-plugin-api/BUILD
index c788888..fe9ce19 100644
--- a/gerrit-plugin-api/BUILD
+++ b/gerrit-plugin-api/BUILD
@@ -16,8 +16,6 @@
"//gerrit-server:metrics",
"//gerrit-reviewdb:server",
"//gerrit-server:prolog-common",
- "//lib:caffeine",
- "//lib:caffeine_guava",
"//lib/commons:dbcp",
"//lib/commons:lang",
"//lib/commons:lang3",
diff --git a/lib/BUILD b/lib/BUILD
index 8e752c0..91334cb 100644
--- a/lib/BUILD
+++ b/lib/BUILD
@@ -83,20 +83,6 @@
)
java_library(
- name = "caffeine",
- data = ["//lib:LICENSE-Apache2.0"],
- visibility = ["//visibility:public"],
- exports = ["@caffeine//jar"],
-)
-
-java_library(
- name = "caffeine_guava",
- data = ["//lib:LICENSE-Apache2.0"],
- visibility = ["//visibility:public"],
- exports = ["@caffeine_guava//jar"],
-)
-
-java_library(
name = "velocity",
data = ["//lib:LICENSE-Apache2.0"],
visibility = ["//visibility:public"],