Move tryPut to ChronicleMapStore
Inserting a new entry into chronicle-map is a store level operation
and as such belongs to the ChronicleMapStore rather than the
ChronicleMapCacheImpl.
Also, this allows to emit metrics related to failed put operation, which
will be addressed in a follow up change.
Change-Id: I812d8d930e096c1757925dbe304d1c2b180ddabc
diff --git a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheImpl.java b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheImpl.java
index 4d7a343..b704a7b 100644
--- a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheImpl.java
+++ b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheImpl.java
@@ -257,7 +257,7 @@
public void putUnchecked(Object key, Object value, Timestamp created) {
TimedValue<?> wrappedValue = new TimedValue<>(value, created.toInstant().toEpochMilli());
KeyWrapper<?> wrappedKey = new KeyWrapper<>(key);
- if (tryPut(store, (KeyWrapper<K>) wrappedKey, (TimedValue<V>) wrappedValue)) {
+ if (store.tryPut((KeyWrapper<K>) wrappedKey, (TimedValue<V>) wrappedValue)) {
mem.put((K) key, (TimedValue<V>) wrappedValue);
}
}
@@ -274,7 +274,7 @@
*/
@SuppressWarnings("unchecked")
public void putUnchecked(KeyWrapper<Object> wrappedKey, TimedValue<Object> wrappedValue) {
- if (tryPut(store, (KeyWrapper<K>) wrappedKey, (TimedValue<V>) wrappedValue)) {
+ if (store.tryPut((KeyWrapper<K>) wrappedKey, (TimedValue<V>) wrappedValue)) {
mem.put((K) wrappedKey.getValue(), (TimedValue<V>) wrappedValue);
}
}
@@ -289,39 +289,13 @@
boolean putTimedToStore(K key, TimedValue<V> timedVal) {
KeyWrapper<K> wrappedKey = new KeyWrapper<>(key);
- boolean putSuccess = tryPut(store, wrappedKey, timedVal);
+ boolean putSuccess = store.tryPut(wrappedKey, timedVal);
if (putSuccess) {
hotEntries.add(key);
}
return putSuccess;
}
- /**
- * Attempt to put the key/value pair into the chronicle-map cache. Also catches and warns on disk
- * allocation errors, so that such failures result in non-cached entries rather than throwing.
- *
- * @param store the chronicle-map store
- * @param wrappedKey the wrapped key value
- * @param timedVal the timed value
- * @param <K> the type of the wrapped key
- * @param <V> the type of the timed value
- * @return true when the value was successfully inserted in chronicle-map, false otherwise
- */
- static <K, V> boolean tryPut(
- ChronicleMap<KeyWrapper<K>, TimedValue<V>> store,
- KeyWrapper<K> wrappedKey,
- TimedValue<V> timedVal) {
- try {
- store.put(wrappedKey, timedVal);
- } catch (IllegalArgumentException | IllegalStateException e) {
- logger.atWarning().withCause(e).log(
- "[cache %s] Caught exception when inserting entry '%s' in chronicle-map",
- store.name(), wrappedKey.getValue());
- return false;
- }
- return true;
- }
-
public void prune() {
if (!config.getExpireAfterWrite().isZero()) {
store.forEachEntry(
diff --git a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheLoader.java b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheLoader.java
index 33d970f..9a68780 100644
--- a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheLoader.java
+++ b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheLoader.java
@@ -14,8 +14,6 @@
package com.googlesource.gerrit.modules.cache.chroniclemap;
-import static com.googlesource.gerrit.modules.cache.chroniclemap.ChronicleMapCacheImpl.tryPut;
-
import com.google.common.cache.CacheLoader;
import com.google.common.cache.CacheStats;
import com.google.common.flogger.FluentLogger;
@@ -101,7 +99,7 @@
// Note that we return a loadedValue, even when we
// we fail populating the cache with it, to make clients more
// resilient to storage cache failures
- if (tryPut(store, new KeyWrapper<>(key), loadedValue)) {
+ if (store.tryPut(new KeyWrapper<>(key), loadedValue)) {
loadSuccessCount.increment();
}
});
@@ -143,7 +141,7 @@
new FutureCallback<V>() {
@Override
public void onSuccess(V result) {
- if (tryPut(store, new KeyWrapper<>(key), new TimedValue<>(result))) {
+ if (store.tryPut(new KeyWrapper<>(key), new TimedValue<>(result))) {
loadSuccessCount.increment();
}
totalLoadTime.add(System.nanoTime() - start);
@@ -186,7 +184,7 @@
@Override
public void put(K key, TimedValue<V> value) {
- tryPut(store, new KeyWrapper<>(key), value);
+ store.tryPut(new KeyWrapper<>(key), value);
}
@Override
diff --git a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapStore.java b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapStore.java
index 5161cd0..1f829bb 100644
--- a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapStore.java
+++ b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapStore.java
@@ -53,6 +53,26 @@
metrics.registerCallBackMetrics(this);
}
+ /**
+ * Attempt to put the key/value pair into the chronicle-map store. Also catches and warns on disk
+ * allocation errors, so that such failures result in non-cached entries rather than throwing.
+ *
+ * @param wrappedKey the wrapped key value
+ * @param timedVal the timed value
+ * @return true when the value was successfully inserted in chronicle-map, false otherwise
+ */
+ public boolean tryPut(KeyWrapper<K> wrappedKey, TimedValue<V> timedVal) {
+ try {
+ store.put(wrappedKey, timedVal);
+ } catch (IllegalArgumentException | IllegalStateException e) {
+ logger.atWarning().withCause(e).log(
+ "[cache %s] Caught exception when inserting entry '%s' in chronicle-map",
+ store.name(), wrappedKey.getValue());
+ return false;
+ }
+ return true;
+ }
+
@SuppressWarnings("rawtypes")
public double percentageUsedAutoResizes() {
/*