Allow to restrict the caches to auto-tune Introduce the cache-name parameter to the auto-adjust-caches command for reducing the scope of adjusting and converting caches reducing the footprint on Gerrit and focusing the changes to individual cache files. Change-Id: I504e82808cefa73db09581c814eb4f9656d0d05e
diff --git a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCaches.java b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCaches.java index 4298a81..a5849a8 100644 --- a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCaches.java +++ b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCaches.java
@@ -27,7 +27,10 @@ import java.io.File; import java.io.IOException; import java.nio.file.Path; +import java.util.HashSet; +import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentMap; import java.util.stream.Collectors; import org.apache.commons.io.FilenameUtils; @@ -47,6 +50,7 @@ private final AdministerCachePermission adminCachePermission; private boolean dryRun; + private Set<String> cacheNames = new HashSet<>(); @Inject AutoAdjustCaches( @@ -69,6 +73,10 @@ this.dryRun = dryRun; } + public void addCacheNames(List<String> cacheNames) { + this.cacheNames.addAll(cacheNames); + } + protected Config run(@Nullable ProgressMonitor optionalProgressMonitor) throws AuthException, PermissionBackendException, IOException { ProgressMonitor progressMonitor = @@ -228,6 +236,7 @@ pair -> pair.getValue() instanceof ChronicleMapCacheImpl && ((ChronicleMapCacheImpl) pair.getValue()).diskStats().size() > 0) + .filter(pair -> cacheNames.isEmpty() ? true : cacheNames.contains(pair.getKey())) .collect( Collectors.toMap( ImmutablePair::getKey, p -> (ChronicleMapCacheImpl<Object, Object>) p.getValue()));
diff --git a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesCommand.java b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesCommand.java index 7aa240e..e57e130 100644 --- a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesCommand.java +++ b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesCommand.java
@@ -19,8 +19,10 @@ import com.google.gerrit.sshd.SshCommand; import com.google.inject.Inject; import java.io.IOException; +import java.util.Arrays; import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.TextProgressMonitor; +import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; public class AutoAdjustCachesCommand extends SshCommand { @@ -38,6 +40,16 @@ autoAdjustCachesEngine.setDryRun(dryRun); } + @Argument( + index = 0, + required = false, + multiValued = true, + metaVar = "CACHE_NAME", + usage = "name of cache to be adjusted") + public void setCacheName(String cacheName) { + autoAdjustCachesEngine.addCacheNames(Arrays.asList(cacheName)); + } + @Inject AutoAdjustCachesCommand(AutoAdjustCaches autoAdjustCachesEngine) { this.autoAdjustCachesEngine = autoAdjustCachesEngine;
diff --git a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesServlet.java b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesServlet.java index b217b0e..59d29ae 100644 --- a/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesServlet.java +++ b/src/main/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesServlet.java
@@ -24,6 +24,7 @@ import com.google.inject.Provider; import com.google.inject.Singleton; import java.io.IOException; +import java.util.Arrays; import java.util.Optional; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; @@ -56,6 +57,11 @@ .or(() -> Optional.ofNullable(req.getParameter("d"))) .isPresent()); + String[] cacheNames = req.getParameterValues("CACHE_NAME"); + if (cacheNames != null) { + autoAdjustCachesEngine.addCacheNames(Arrays.asList(cacheNames)); + } + try { Config outputChronicleMapConfig = autoAdjustCachesEngine.run(null);
diff --git a/src/main/resources/Documentation/tuning.md b/src/main/resources/Documentation/tuning.md index feb98fc..c3979b2 100644 --- a/src/main/resources/Documentation/tuning.md +++ b/src/main/resources/Documentation/tuning.md
@@ -148,7 +148,7 @@ * You can now run an the tuning command: ```bash -ssh -p 29418 admin@<gerrit-server> cache-chroniclemap auto-adjust-caches [--dry-run] +ssh -p 29418 admin@<gerrit-server> cache-chroniclemap auto-adjust-caches [--dry-run] [cache-name] ``` * You can also use the REST-API: @@ -159,6 +159,10 @@ * `--dry-run` or `-d` (SSH), `?dry-run` or `?d` (REST-API) optional parameter +* `cache-name` (SSH), `?CACHE_NAME=cache-name` (REST-API) optional restriction of the caches + to analyze and auto-tune. The parameter can be repeated multiple times for analyzing + multiple caches. By default, analyze and adjust all persistent caches. + Calculate the average key and value size, but do not migrate current cache data into new files
diff --git a/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesIT.java b/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesIT.java index 8fad5ed..209b43e 100644 --- a/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesIT.java +++ b/src/test/java/com/googlesource/gerrit/modules/cache/chroniclemap/AutoAdjustCachesIT.java
@@ -135,6 +135,19 @@ } @Test + public void shouldCreateNewCacheFileForSingleDiffCache() throws Exception { + createChange(); + + adminSshSession.exec(SSH_CMD + " " + DIFF); + + adminSshSession.assertSuccess(); + Set<String> tunedCaches = + tunedFileNamesSet(n -> n.matches(".*" + AutoAdjustCaches.TUNED_INFIX + ".*")); + + assertThat(tunedCaches.size()).isEqualTo(1); + } + + @Test @GerritConfig(name = "cache.test_cache.avgKeySize", value = "207") @GerritConfig(name = "cache.test_cache.avgValueSize", value = "207") public void shouldNotRecreateTestCacheFileWhenAlreadyTuned() throws Exception {