Adapt to the new PersistentCacheBaseFactory on master
Also manage the new v2 format for H2-DB v2 upgrade in Gerrit master and
adapt the way cache tables to files are computed.
Change-Id: I0bdc792f470406cdc4ed4c1f90495a7907fb34b5
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 27be43f..60fc7d4 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
@@ -18,6 +18,7 @@
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
+import com.google.gerrit.common.Nullable;
import com.google.gerrit.extensions.events.LifecycleListener;
import com.google.gerrit.extensions.registration.DynamicMap;
import com.google.gerrit.metrics.MetricMaker;
@@ -60,11 +61,11 @@
ChronicleMapCacheFactory(
MemoryCacheFactory memCacheFactory,
@GerritServerConfig Config cfg,
- SitePaths site,
+ @Nullable @ChronicleMapDir Path cacheDir,
ChronicleMapCacheConfig.Factory configFactory,
DynamicMap<Cache<?, ?>> cacheMap,
MetricMaker metricMaker) {
- super(memCacheFactory, cfg, site);
+ super(memCacheFactory, cfg, cacheDir);
this.configFactory = configFactory;
this.metricMaker = metricMaker;
this.caches = new LinkedList<>();
diff --git a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheModule.java b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheModule.java
index a9b3856..a5a05cc 100644
--- a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheModule.java
+++ b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheModule.java
@@ -13,14 +13,26 @@
// limitations under the License.
package com.googlesource.gerrit.modules.cache.chroniclemap;
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.Nullable;
import com.google.gerrit.lifecycle.LifecycleModule;
import com.google.gerrit.server.ModuleImpl;
import com.google.gerrit.server.cache.CacheModule;
import com.google.gerrit.server.cache.PersistentCacheFactory;
+import com.google.gerrit.server.config.GerritServerConfig;
+import com.google.gerrit.server.config.SitePaths;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import org.eclipse.jgit.lib.Config;
@ModuleImpl(name = CacheModule.PERSISTENT_MODULE)
public class ChronicleMapCacheModule extends LifecycleModule {
+ private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
@Override
protected void configure() {
factory(ChronicleMapCacheConfig.Factory.class);
@@ -28,4 +40,30 @@
listener().to(ChronicleMapCacheFactory.class);
bind(CachesWithoutChronicleMapConfigMetric.class).asEagerSingleton();
}
+
+ @Provides
+ @Singleton
+ @Nullable
+ @ChronicleMapDir
+ Path getChronicleMapDir(SitePaths site, @GerritServerConfig Config config) {
+ String name = config.getString("cache", null, "directory");
+ 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;
+ }
}
diff --git a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapDir.java b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapDir.java
new file mode 100644
index 0000000..a1cbef6
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapDir.java
@@ -0,0 +1,24 @@
+// Copyright (C) 2025 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.modules.cache.chroniclemap;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.inject.BindingAnnotation;
+import java.lang.annotation.Retention;
+
+@Retention(RUNTIME)
+@BindingAnnotation
+public @interface ChronicleMapDir {}
diff --git a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/H2CacheCommand.java b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/H2CacheCommand.java
index b956a7b..1522f94 100644
--- a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/H2CacheCommand.java
+++ b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/H2CacheCommand.java
@@ -29,10 +29,11 @@
public class H2CacheCommand {
protected static final FluentLogger logger = FluentLogger.forEnclosingClass();
- public static final String H2_SUFFIX = "h2.db";
+ public static final String H2_SUFFIX = "-v2.mv.db";
public static String baseName(Path h2File) {
- return FilenameUtils.removeExtension(FilenameUtils.getBaseName(h2File.toString()));
+ String filename = h2File.toString();
+ return FilenameUtils.getBaseName(filename.substring(0, filename.length() - H2_SUFFIX.length()));
}
protected static H2AggregateData getStats(Path h2File) throws Exception {
@@ -65,7 +66,7 @@
protected static String jdbcUrl(Path h2FilePath) {
final String normalized =
FilenameUtils.removeExtension(FilenameUtils.removeExtension(h2FilePath.toString()));
- return "jdbc:h2:" + normalized + ";AUTO_SERVER=TRUE";
+ return "jdbc:h2:" + normalized + ";AUTO_SERVER=TRUE;DATABASE_TO_UPPER=false";
}
protected static Optional<Path> getCacheDir(Config gerritConfig, SitePaths site)
diff --git a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/H2MigrationServlet.java b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/H2MigrationServlet.java
index 0055dd7..c18b0bd 100644
--- a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/H2MigrationServlet.java
+++ b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/H2MigrationServlet.java
@@ -280,7 +280,7 @@
}
private Optional<Path> getH2CacheFile(Path cacheDir, String name) {
- Path h2CacheFile = cacheDir.resolve(String.format("%s.%s", name, H2_SUFFIX));
+ Path h2CacheFile = cacheDir.resolve(String.format("%s%s", name, H2_SUFFIX));
if (Files.exists(h2CacheFile)) {
return Optional.of(h2CacheFile);
}
diff --git a/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheExtendedIT.java b/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheExtendedIT.java
index 4735477..4c7ab75 100644
--- a/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheExtendedIT.java
+++ b/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/ChronicleMapCacheExtendedIT.java
@@ -31,10 +31,10 @@
import com.google.gerrit.server.cache.MemoryCacheFactory;
import com.google.gerrit.server.cache.serialize.CacheSerializer;
import com.google.gerrit.server.cache.serialize.StringCacheSerializer;
-import com.google.gerrit.server.config.SitePaths;
import com.google.inject.Inject;
import java.io.File;
import java.nio.ByteBuffer;
+import java.nio.file.Path;
import java.time.Duration;
import java.util.UUID;
import java.util.concurrent.ExecutionException;
@@ -54,7 +54,6 @@
@Inject MetricRegistry metricRegistry;
@Inject MemoryCacheFactory memCacheFactory;
- @Inject SitePaths sitePaths;
private StoredConfig gerritConfig;
private final String cacheDirectory = ".";
@@ -694,9 +693,11 @@
expireAfterWrite != null ? expireAfterWrite : Duration.ZERO,
refreshAfterWrite != null ? refreshAfterWrite : Duration.ZERO);
+ Path cacheDir = sitePaths.resolve(cfg.getString("cache", null, "directory"));
+
ChronicleMapCacheFactory cacheFactory =
new ChronicleMapCacheFactory(
- memCacheFactory, new Config(), sitePaths, null, null, metricMaker);
+ memCacheFactory, new Config(), cacheDir, null, null, metricMaker);
if (withLoader) {
return (ChronicleMapCacheImpl<String, String>)
diff --git a/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/MigrateH2CachesLocalDiskIT.java b/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/MigrateH2CachesLocalDiskIT.java
index c8d42b0..798cf3f 100644
--- a/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/MigrateH2CachesLocalDiskIT.java
+++ b/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/MigrateH2CachesLocalDiskIT.java
@@ -320,7 +320,7 @@
cacheDirectory,
persistentDef,
H2CacheCommand.getStats(
- cacheDirectory.resolve(String.format("%s.%s", cacheName, H2_SUFFIX))),
+ cacheDirectory.resolve(String.format("%s%s", cacheName, H2_SUFFIX))),
DEFAULT_SIZE_MULTIPLIER,
DEFAULT_MAX_BLOAT_FACTOR);