Support for setting diskLimit from CacheModule bindings

For some persistent caches we may want a larger default diskLimit than
the overall default of 128MiB.

Change-Id: I9f8c85d7187d2edfe5ba48ea27c7b5f5e37e7abe
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 8141dfb..f7381a3 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
@@ -178,7 +178,7 @@
   public <K, V> LoadingCache<K, V> build(
       CacheBinding<K, V> def,
       CacheLoader<K, V> loader) {
-    long limit = config.getLong("cache", def.name(), "diskLimit", 128 << 20);
+    long limit = config.getLong("cache", def.name(), "diskLimit", def.diskLimit());
 
     if (cacheDir == null || limit <= 0) {
       return defaultFactory.build(def, loader);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheBinding.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheBinding.java
index 7062871..343827c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheBinding.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheBinding.java
@@ -26,6 +26,9 @@
   /** Set the total size of the cache. */
   CacheBinding<K, V> maximumWeight(long weight);
 
+  /** Set the total on-disk limit of the cache */
+  CacheBinding<K, V> diskLimit(long limit);
+
   /** Set the time an element lives before being expired. */
   CacheBinding<K, V> expireAfterWrite(long duration, TimeUnit durationUnits);
 
@@ -39,6 +42,7 @@
   TypeLiteral<K> keyType();
   TypeLiteral<V> valueType();
   long maximumWeight();
+  long diskLimit();
   @Nullable Long expireAfterWrite(TimeUnit unit);
   @Nullable Weigher<K, V> weigher();
   @Nullable CacheLoader<K, V> loader();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java
index 6d9ae0f..c73760c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/cache/CacheProvider.java
@@ -38,6 +38,7 @@
   private final TypeLiteral<V> valType;
   private boolean persist;
   private long maximumWeight;
+  private long diskLimit;
   private Long expireAfterWrite;
   private Provider<CacheLoader<K, V>> loader;
   private Provider<Weigher<K, V>> weigher;
@@ -86,6 +87,15 @@
   }
 
   @Override
+  public CacheBinding<K, V> diskLimit(long limit) {
+    Preconditions.checkState(!frozen, "binding frozen, cannot be modified");
+    Preconditions.checkState(persist,
+        "diskLimit supported for persistent caches only");
+    diskLimit = limit;
+    return this;
+  }
+
+  @Override
   public CacheBinding<K, V> expireAfterWrite(long duration, TimeUnit unit) {
     Preconditions.checkState(!frozen, "binding frozen, cannot be modified");
     expireAfterWrite = SECONDS.convert(duration, unit);
@@ -130,6 +140,14 @@
   }
 
   @Override
+  public long diskLimit() {
+    if (diskLimit > 0) {
+      return diskLimit;
+    }
+    return 128 << 20;
+  }
+
+  @Override
   @Nullable
   public Long expireAfterWrite(TimeUnit unit) {
    return expireAfterWrite != null