diff --git a/gradle/changelog/cache_metrics.yaml b/gradle/changelog/cache_metrics.yaml new file mode 100644 index 0000000000..a90b8e49d9 --- /dev/null +++ b/gradle/changelog/cache_metrics.yaml @@ -0,0 +1,2 @@ +- type: added + description: Collect guava caching statistics as metrics ([#1590](https://github.com/scm-manager/scm-manager/pull/1590)) diff --git a/scm-core/src/main/java/sonia/scm/cache/CacheStatistics.java b/scm-core/src/main/java/sonia/scm/cache/CacheStatistics.java index a0d9546be7..e7971afcae 100644 --- a/scm-core/src/main/java/sonia/scm/cache/CacheStatistics.java +++ b/scm-core/src/main/java/sonia/scm/cache/CacheStatistics.java @@ -21,10 +21,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - -package sonia.scm.cache; -//~--- non-JDK imports -------------------------------------------------------- +package sonia.scm.cache; import com.google.common.base.MoreObjects; import com.google.common.base.Objects; @@ -36,19 +34,16 @@ import com.google.common.base.Objects; * @author Sebastian Sdorra * @since 2.0.0 */ -public final class CacheStatistics -{ +public final class CacheStatistics { /** * Constructs a new performance statistic for a {@link Cache}. * - * - * @param name name of the cache - * @param hitCount hit count + * @param name name of the cache + * @param hitCount hit count * @param missCount miss count */ - public CacheStatistics(String name, long hitCount, long missCount) - { + public CacheStatistics(String name, long hitCount, long missCount) { this.name = name; this.hitCount = hitCount; this.missCount = missCount; @@ -60,15 +55,12 @@ public final class CacheStatistics * {@inheritDoc} */ @Override - public boolean equals(Object obj) - { - if (obj == null) - { + public boolean equals(Object obj) { + if (obj == null) { return false; } - if (getClass() != obj.getClass()) - { + if (getClass() != obj.getClass()) { return false; } @@ -83,8 +75,7 @@ public final class CacheStatistics * {@inheritDoc} */ @Override - public int hashCode() - { + public int hashCode() { return Objects.hashCode(name, hitCount, missCount); } @@ -92,14 +83,13 @@ public final class CacheStatistics * {@inheritDoc} */ @Override - public String toString() - { + public String toString() { //J- return MoreObjects.toStringHelper(this) - .add("name", name) - .add("hitCount", hitCount) - .add("missCount", missCount) - .toString(); + .add("name", name) + .add("hitCount", hitCount) + .add("missCount", missCount) + .toString(); //J+ } @@ -108,81 +98,64 @@ public final class CacheStatistics /** * Returns number of times requested elements were found in the cache. * - * * @return number of cache hits */ - public long getHitCount() - { + public long getHitCount() { return hitCount; } /** * Returns the ratio of cache requests which were hits. * - * * @return ratio of cache hits */ - public double getHitRate() - { + public double getHitRate() { return ratio(hitCount); } /** * Returns number of times a requested element was not found in the cache. * - * * @return number of cache misses */ - public long getMissCount() - { + public long getMissCount() { return missCount; } /** * Returns the ratio of cache requests which were misses. * - * * @return ratio of cache misses */ - public double getMissRate() - { + public double getMissRate() { return ratio(missCount); } /** * Returns name of the cache. * - * * @return name of the cache */ - public String getName() - { + public String getName() { return name; } /** * Returns the total number of requests, this includes hits and misses. * - * * @return numer of requests */ - public long getRequestCount() - { + public long getRequestCount() { return hitCount + missCount; } - //~--- methods -------------------------------------------------------------- - /** * Calculates the ratio of a counter. * - * * @param counter counter - * * @return rate of counter */ - private double ratio(long counter) - { + private double ratio(long counter) { long requestCount = getRequestCount(); return (requestCount == 0) @@ -190,14 +163,18 @@ public final class CacheStatistics : (double) counter / requestCount; } - //~--- fields --------------------------------------------------------------- - - /** hit count */ + /** + * hit count + */ private final long hitCount; - /** miss count */ + /** + * miss count + */ private final long missCount; - /** name of cache */ + /** + * name of cache + */ private final String name; } diff --git a/scm-webapp/src/main/java/sonia/scm/cache/GuavaCache.java b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCache.java index 2154fea6e8..d887d2f50e 100644 --- a/scm-webapp/src/main/java/sonia/scm/cache/GuavaCache.java +++ b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCache.java @@ -24,143 +24,56 @@ package sonia.scm.cache; -//~--- non-JDK imports -------------------------------------------------------- - -import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Predicate; +import com.google.common.cache.CacheStats; import com.google.common.collect.Sets; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -//~--- JDK imports ------------------------------------------------------------ - import java.util.Collection; import java.util.Map.Entry; import java.util.Set; -import java.util.concurrent.atomic.AtomicLong; -/** - * - * @author Sebastian Sdorra - * - * @param - * @param - */ -public class GuavaCache implements Cache -{ +public class GuavaCache implements Cache { - /** - * the logger for GuavaCache - */ private static final Logger logger = LoggerFactory.getLogger(GuavaCache.class); - //~--- constructors --------------------------------------------------------- + private final com.google.common.cache.Cache cache; + private final CopyStrategy copyStrategy; + private final String name; - /** - * Constructs ... - * - * - * @param configuration - */ - public GuavaCache(GuavaNamedCacheConfiguration configuration) - { - this(configuration, configuration.getName()); - } - - /** - * Constructs ... - * - * - * @param configuration - * @param name - */ - @SuppressWarnings("unchecked") - public GuavaCache(GuavaCacheConfiguration configuration, String name) - { - this(GuavaCaches.create(configuration, name), configuration.getCopyStrategy(), name); - } - - /** - * Constructs ... - * - * - * @param cache - * @param copyStrategy - * @param name - */ - @VisibleForTesting - protected GuavaCache(com.google.common.cache.Cache cache, - CopyStrategy copyStrategy, String name) - { + GuavaCache(com.google.common.cache.Cache cache, CopyStrategy copyStrategy, String name) { this.cache = cache; this.name = name; - if (copyStrategy != null) - { + if (copyStrategy != null) { this.copyStrategy = copyStrategy; - } - else - { + } else { this.copyStrategy = CopyStrategy.NONE; } } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - */ @Override - public void clear() - { - if (logger.isDebugEnabled()) - { + public void clear() { + if (logger.isDebugEnabled()) { logger.debug("clear cache {}", name); } cache.invalidateAll(); } - /** - * Method description - * - * - * @param key - * - * @return - */ @Override - public boolean contains(K key) - { + public boolean contains(K key) { return cache.getIfPresent(key) != null; } - /** - * Method description - * - * - * @return - */ @Override - public Set keys() - { + public Set keys() { return cache.asMap().keySet(); } - /** - * Method description - * - * - * @param key - * @param value - * - * @return - */ @Override - public V put(K key, V value) - { + public V put(K key, V value) { V previous = cache.getIfPresent(key); cache.put(key, copyStrategy.copyOnWrite(value)); @@ -168,17 +81,8 @@ public class GuavaCache implements Cache return previous; } - /** - * Method description - * - * - * @param key - * - * @return - */ @Override - public V remove(K key) - { + public V remove(K key) { V value = cache.getIfPresent(key); cache.invalidate(key); @@ -186,116 +90,50 @@ public class GuavaCache implements Cache return value; } - /** - * Method description - * - * - * @param filter - * - * @return - */ @Override @SuppressWarnings("java:S4738") // we have to use guava predicate for compatibility - public Iterable removeAll(Predicate filter) - { + public Iterable removeAll(Predicate filter) { Set removedValues = Sets.newHashSet(); Set keysToRemove = Sets.newHashSet(); - for (Entry e : cache.asMap().entrySet()) - { - if (filter.apply(e.getKey())) - { + for (Entry e : cache.asMap().entrySet()) { + if (filter.apply(e.getKey())) { keysToRemove.add(e.getKey()); removedValues.add(e.getValue()); } } - if (!keysToRemove.isEmpty()) - { + if (!keysToRemove.isEmpty()) { cache.invalidateAll(keysToRemove); } return removedValues; } - /** - * Method description - * - * - * @return - */ @Override - public int size() - { + public int size() { return (int) cache.size(); } - /** - * Method description - * - * - * @return - */ @Override - public Collection values() - { + public Collection values() { return cache.asMap().values(); } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param key - * - * @return - */ @Override - public V get(K key) - { + public V get(K key) { V value = cache.getIfPresent(key); - if (value != null) - { + if (value != null) { value = copyStrategy.copyOnRead(value); - hitCount.incrementAndGet(); - } - else - { - missCount.incrementAndGet(); } return value; } - /** - * Method description - * - * - * @return - */ @Override - public CacheStatistics getStatistics() - { - return new CacheStatistics(name, hitCount.get(), missCount.get()); + public CacheStatistics getStatistics() { + CacheStats cacheStats = cache.stats(); + return new CacheStatistics(name, cacheStats.hitCount(), cacheStats.missCount()); } - - //~--- fields --------------------------------------------------------------- - - /** Field description */ - private final com.google.common.cache.Cache cache; - - /** Field description */ - private final CopyStrategy copyStrategy; - - /** Field description */ - private final AtomicLong hitCount = new AtomicLong(); - - /** Field description */ - private final AtomicLong missCount = new AtomicLong(); - - /** Field description */ - private final String name; } diff --git a/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheFactory.java b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheFactory.java new file mode 100644 index 0000000000..fb598e68d9 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheFactory.java @@ -0,0 +1,49 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.cache; + +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.core.instrument.binder.cache.GuavaCacheMetrics; + +import javax.inject.Inject; +import java.util.Collections; + +public class GuavaCacheFactory { + + private final MeterRegistry meterRegistry; + + @Inject + public GuavaCacheFactory(MeterRegistry meterRegistry) { + this.meterRegistry = meterRegistry; + } + + GuavaCache create(GuavaCacheConfiguration configuration, String name) { + com.google.common.cache.Cache cache = GuavaCaches.create(configuration, name); + + new GuavaCacheMetrics(cache, name, Collections.emptySet()).bindTo(meterRegistry); + + return new GuavaCache<>(cache, configuration.getCopyStrategy(), name); + } +} diff --git a/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheManager.java b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheManager.java index 6b9b4ac5bf..cdbdc787ab 100644 --- a/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheManager.java +++ b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCacheManager.java @@ -24,8 +24,6 @@ package sonia.scm.cache; -//~--- non-JDK imports -------------------------------------------------------- - import com.google.common.annotations.VisibleForTesting; import com.google.inject.Singleton; import org.slf4j.Logger; @@ -35,8 +33,6 @@ import javax.inject.Inject; import java.io.IOException; import java.util.concurrent.ConcurrentHashMap; -//~--- JDK imports ------------------------------------------------------------ - /** * Guava based implementation of {@link CacheManager} and {@link org.apache.shiro.cache.CacheManager}. * @@ -49,22 +45,23 @@ public class GuavaCacheManager implements CacheManager, org.apache.shiro.cache.C @SuppressWarnings({"java:S3740", "rawtypes"}) private final ConcurrentHashMap caches = new ConcurrentHashMap<>(); - private final GuavaCacheConfiguration defaultConfiguration; + private final GuavaCacheFactory cacheFactory; @Inject - public GuavaCacheManager(GuavaCacheConfigurationReader configurationReader) { - this(configurationReader.read()); + public GuavaCacheManager(GuavaCacheConfigurationReader configurationReader, GuavaCacheFactory cacheFactory) { + this(configurationReader.read(), cacheFactory); } @VisibleForTesting - protected GuavaCacheManager(GuavaCacheManagerConfiguration config) { + protected GuavaCacheManager(GuavaCacheManagerConfiguration config, GuavaCacheFactory cacheFactory) { defaultConfiguration = config.getDefaultCache(); + this.cacheFactory = cacheFactory; for (GuavaNamedCacheConfiguration ncc : config.getCaches()) { LOG.debug("create cache {} from configured configuration {}", ncc.getName(), ncc); - caches.put(ncc.getName(), new GuavaCache<>(ncc)); + caches.put(ncc.getName(), cacheFactory.create(ncc, ncc.getName())); } } @@ -78,7 +75,7 @@ public class GuavaCacheManager implements CacheManager, org.apache.shiro.cache.C "cache {} does not exists, creating a new instance from default configuration: {}", cacheName, defaultConfiguration ); - return new GuavaCache<>(defaultConfiguration, cacheName); + return cacheFactory.create(defaultConfiguration, cacheName); }); } diff --git a/scm-webapp/src/main/java/sonia/scm/cache/GuavaCaches.java b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCaches.java index bafa22fbe7..38e7f1d002 100644 --- a/scm-webapp/src/main/java/sonia/scm/cache/GuavaCaches.java +++ b/scm-webapp/src/main/java/sonia/scm/cache/GuavaCaches.java @@ -24,126 +24,76 @@ package sonia.scm.cache; -//~--- non-JDK imports -------------------------------------------------------- - import com.google.common.cache.CacheBuilder; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -//~--- JDK imports ------------------------------------------------------------ - import java.util.concurrent.TimeUnit; -/** - * - * @author Sebastian Sdorra - */ -public final class GuavaCaches -{ +public final class GuavaCaches { - /** - * the logger for GuavaCaches - */ - private static final Logger logger = - LoggerFactory.getLogger(GuavaCaches.class); + private static final Logger LOG = LoggerFactory.getLogger(GuavaCaches.class); - //~--- constructors --------------------------------------------------------- + private GuavaCaches() { + } - /** - * Constructs ... - * - */ - private GuavaCaches() {} - - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @param configuration - * @param name - * - * @return - */ - public static com.google.common.cache.Cache create( - GuavaCacheConfiguration configuration, String name) - { + public static com.google.common.cache.Cache create( + GuavaCacheConfiguration configuration, String name) { CacheBuilder builder = CacheBuilder.newBuilder(); - if (configuration.getConcurrencyLevel() != null) - { + // Collect guava cache statistics + builder.recordStats(); + + if (configuration.getConcurrencyLevel() != null) { builder.concurrencyLevel(configuration.getConcurrencyLevel()); } - if (configuration.getExpireAfterAccess() != null) - { + if (configuration.getExpireAfterAccess() != null) { builder.expireAfterAccess(configuration.getExpireAfterAccess(), TimeUnit.SECONDS); } - if (configuration.getExpireAfterWrite() != null) - { + if (configuration.getExpireAfterWrite() != null) { builder.expireAfterWrite(configuration.getExpireAfterWrite(), TimeUnit.SECONDS); } - if (configuration.getInitialCapacity() != null) - { + if (configuration.getInitialCapacity() != null) { builder.initialCapacity(configuration.getInitialCapacity()); } - if (configuration.getMaximumSize() != null) - { + if (configuration.getMaximumSize() != null) { builder.maximumSize(configuration.getMaximumSize()); } - if (configuration.getMaximumWeight() != null) - { + if (configuration.getMaximumWeight() != null) { builder.maximumWeight(configuration.getMaximumWeight()); } - if (isEnabled(configuration.getRecordStats())) - { + if (isEnabled(configuration.getRecordStats())) { builder.recordStats(); } - if (isEnabled(configuration.getSoftValues())) - { + if (isEnabled(configuration.getSoftValues())) { builder.softValues(); } - if (isEnabled(configuration.getWeakKeys())) - { + if (isEnabled(configuration.getWeakKeys())) { builder.weakKeys(); } - if (isEnabled(configuration.getWeakValues())) - { + if (isEnabled(configuration.getWeakValues())) { builder.weakKeys(); } - if (logger.isTraceEnabled()) - { - logger.trace("create new cache {} from builder: {}", name, builder); + if (LOG.isTraceEnabled()) { + LOG.trace("create new cache {} from builder: {}", name, builder); } return builder.build(); } - //~--- get methods ---------------------------------------------------------- - - /** - * Method description - * - * - * @param v - * - * @return - */ - private static boolean isEnabled(Boolean v) - { + private static boolean isEnabled(Boolean v) { return (v != null) && v; } } diff --git a/scm-webapp/src/test/java/sonia/scm/cache/CacheTestBase.java b/scm-webapp/src/test/java/sonia/scm/cache/CacheTestBase.java index 13309258aa..e262dda98a 100644 --- a/scm-webapp/src/test/java/sonia/scm/cache/CacheTestBase.java +++ b/scm-webapp/src/test/java/sonia/scm/cache/CacheTestBase.java @@ -21,10 +21,8 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - -package sonia.scm.cache; -//~--- non-JDK imports -------------------------------------------------------- +package sonia.scm.cache; import org.junit.After; import org.junit.Assume; @@ -33,51 +31,32 @@ import org.junit.Test; import sonia.scm.util.IOUtil; import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; -/** - * - * @author Sebastian Sdorra - */ -public abstract class CacheTestBase -{ +public abstract class CacheTestBase { + private Cache cache; + private CacheManager cm; - /** - * Method description - * - * - * @return - */ protected abstract CacheManager createCacheManager(); - /** - * Method description - * - */ - @After - public void after() - { - IOUtil.close(cm); - } - - /** - * Method description - * - */ @Before - public void before() - { + public void before() { cm = createCacheManager(); cache = cm.getCache("test"); } - /** - * Method description - * - */ + @After + public void after() { + IOUtil.close(cm); + } + @Test - public void testClear() - { + public void testClear() { cache.put("test", "test123"); cache.put("test-1", "test123"); cache.clear(); @@ -85,13 +64,8 @@ public abstract class CacheTestBase assertNull(cache.get("test-1")); } - /** - * Method description - * - */ @Test - public void testContains() - { + public void testContains() { cache.put("test", "test123"); cache.put("test-1", "test123"); assertTrue(cache.contains("test")); @@ -99,13 +73,8 @@ public abstract class CacheTestBase assertFalse(cache.contains("test-2")); } - /** - * Method description - * - */ @Test - public void testOverride() - { + public void testOverride() { cache.put("test", "test123"); String previous = cache.put("test", "test456"); @@ -114,24 +83,14 @@ public abstract class CacheTestBase assertEquals("test456", cache.get("test")); } - /** - * Method description - * - */ @Test - public void testPutAndGet() - { + public void testPutAndGet() { cache.put("test", "test123"); assertEquals("test123", cache.get("test")); } - /** - * Method description - * - */ @Test - public void testRemove() - { + public void testRemove() { cache.put("test", "test123"); assertEquals("test123", cache.get("test")); @@ -141,13 +100,8 @@ public abstract class CacheTestBase assertNull(cache.get("test")); } - /** - * Method description - * - */ @Test - public void testRemoveAll() - { + public void testRemoveAll() { cache.put("test-1", "test123"); cache.put("test-2", "test456"); cache.put("a-1", "test123"); @@ -161,12 +115,12 @@ public abstract class CacheTestBase assertNotNull(cache.get("a-1")); assertNotNull(cache.get("a-2")); } - + @Test - public void testCacheStatistics(){ + public void testCacheStatistics() { CacheStatistics stats = cache.getStatistics(); // skip test if implementation does not support stats - Assume.assumeTrue( stats != null ); + Assume.assumeTrue(stats != null); assertEquals("test", stats.getName()); assertEquals(0L, stats.getHitCount()); assertEquals(0L, stats.getMissCount()); @@ -176,23 +130,21 @@ public abstract class CacheTestBase cache.get("test-1"); cache.get("test-1"); cache.get("test-3"); + cache.get("test-4"); + cache.get("test-5"); // check that stats have not changed assertEquals(0L, stats.getHitCount()); assertEquals(0L, stats.getMissCount()); stats = cache.getStatistics(); assertEquals(3L, stats.getHitCount()); - assertEquals(1L, stats.getMissCount()); - assertEquals(0.75d, stats.getHitRate(), 0.0d); - assertEquals(0.25d, stats.getMissRate(), 0.0d); + // We get 2 misses on inserting new cache keys and 3 misses on the actual "cache.get" for non-existent cache keys + assertEquals(5L, stats.getMissCount()); + assertEquals(0.375d, stats.getHitRate(), 0.0d); + assertEquals(0.625d, stats.getMissRate(), 0.0d); } - /** - * Method description - * - */ @Test - public void testSize() - { + public void testSize() { assertEquals(0, cache.size()); cache.put("test", "test123"); assertEquals(1, cache.size()); @@ -204,11 +156,5 @@ public abstract class CacheTestBase assertEquals(0, cache.size()); } - //~--- fields --------------------------------------------------------------- - /** Field description */ - private Cache cache; - - /** Field description */ - private CacheManager cm; } diff --git a/scm-webapp/src/test/java/sonia/scm/cache/CacheTestUtil.java b/scm-webapp/src/test/java/sonia/scm/cache/CacheTestUtil.java index ae2758bbca..bb4e62a702 100644 --- a/scm-webapp/src/test/java/sonia/scm/cache/CacheTestUtil.java +++ b/scm-webapp/src/test/java/sonia/scm/cache/CacheTestUtil.java @@ -21,40 +21,25 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.cache; -//~--- JDK imports ------------------------------------------------------------ +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import java.util.Collections; -/** - * - * @author Sebastian Sdorra - */ -public final class CacheTestUtil -{ +public final class CacheTestUtil { - /** - * Constructs ... - * - */ - private CacheTestUtil() {} + private CacheTestUtil() { + } - //~--- methods -------------------------------------------------------------- - - /** - * Method description - * - * - * @return - */ @SuppressWarnings("unchecked") - public static GuavaCacheManager createDefaultGuavaCacheManager() - { + public static GuavaCacheManager createDefaultGuavaCacheManager() { GuavaCacheConfiguration config = new GuavaCacheConfiguration(); - return new GuavaCacheManager(new GuavaCacheManagerConfiguration(config, - Collections.EMPTY_LIST)); + return new GuavaCacheManager( + new GuavaCacheManagerConfiguration(config, Collections.EMPTY_LIST), + new GuavaCacheFactory(new SimpleMeterRegistry()) + ); } } diff --git a/scm-webapp/src/test/java/sonia/scm/cache/GuavaCacheTest.java b/scm-webapp/src/test/java/sonia/scm/cache/GuavaCacheTest.java index 776c2d4f4e..4cc71d9b89 100644 --- a/scm-webapp/src/test/java/sonia/scm/cache/GuavaCacheTest.java +++ b/scm-webapp/src/test/java/sonia/scm/cache/GuavaCacheTest.java @@ -21,27 +21,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.cache; -//~--- JDK imports ------------------------------------------------------------ +public class GuavaCacheTest extends CacheTestBase { -/** - * - * @author Sebastian Sdorra - */ -public class GuavaCacheTest extends CacheTestBase -{ - - /** - * Method description - * - * - * @return - */ @Override - protected CacheManager createCacheManager() - { + protected CacheManager createCacheManager() { return CacheTestUtil.createDefaultGuavaCacheManager(); } } diff --git a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerPerfTest.java b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerPerfTest.java index d75196f18f..fda8030b1d 100644 --- a/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerPerfTest.java +++ b/scm-webapp/src/test/java/sonia/scm/repository/DefaultRepositoryManagerPerfTest.java @@ -29,6 +29,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.google.inject.Provider; import com.google.inject.util.Providers; +import io.micrometer.core.instrument.simple.SimpleMeterRegistry; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; @@ -51,6 +52,7 @@ import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.SCMContextProvider; import sonia.scm.cache.DefaultCacheConfigurationLoader; import sonia.scm.cache.GuavaCacheConfigurationReader; +import sonia.scm.cache.GuavaCacheFactory; import sonia.scm.cache.GuavaCacheManager; import sonia.scm.config.ScmConfiguration; import sonia.scm.security.AuthorizationCollector; @@ -124,8 +126,8 @@ public class DefaultRepositoryManagerPerfTest { new DefaultCacheConfigurationLoader( DefaultRepositoryManagerPerfTest.class.getClassLoader() ) - ) - ); + ), + new GuavaCacheFactory(new SimpleMeterRegistry())); DefaultSecurityManager securityManager = new DefaultSecurityManager(new DummyRealm(authzCollector, cacheManager)); ThreadContext.bind(securityManager);