diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCache.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCache.java index c479cdbfa..f3b49fd2e 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCache.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCache.java @@ -49,6 +49,7 @@ public class DefaultServerCache implements ServerCache { protected final int trimFrequency; protected final int maxIdleSecs; protected final int maxSecsToLive; + protected final long trimOnPut; protected final ReentrantLock lock = new ReentrantLock(); protected final AtomicLong mutationCounter = new AtomicLong(); @@ -60,6 +61,7 @@ public class DefaultServerCache implements ServerCache { this.maxIdleSecs = config.getMaxIdleSecs(); this.maxSecsToLive = config.getMaxSecsToLive(); this.trimFrequency = config.determineTrimFrequency(); + this.trimOnPut = config.determineTrimOnPut(); MetricFactory factory = MetricFactory.get(); String prefix = "l2n."; @@ -191,7 +193,7 @@ public class DefaultServerCache implements ServerCache { public void put(Object key, Object value) { map.put(key, new SoftReference<>(new CacheEntry(key, value))); putCount.increment(); - if (mutationCounter.incrementAndGet() > 1000) { + if (mutationCounter.incrementAndGet() > trimOnPut) { runEviction(); } } diff --git a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheConfig.java b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheConfig.java index 2e5c5dbcd..3f3a5c0f0 100644 --- a/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheConfig.java +++ b/ebean-core/src/main/java/io/ebeaninternal/server/cache/DefaultServerCacheConfig.java @@ -76,4 +76,14 @@ public final class DefaultServerCacheConfig { } return 0; } + + /** + * Determine the number of mutations/puts required to trigger a runEviction() in the foreground. + */ + public long determineTrimOnPut() { + if (maxSize > 0) { + return maxSize / 10; + } + return 1000; + } } diff --git a/ebean-core/src/test/java/io/ebeaninternal/server/cache/DefaultServerCacheConfigTest.java b/ebean-core/src/test/java/io/ebeaninternal/server/cache/DefaultServerCacheConfigTest.java index 512f663fd..19047e9c7 100644 --- a/ebean-core/src/test/java/io/ebeaninternal/server/cache/DefaultServerCacheConfigTest.java +++ b/ebean-core/src/test/java/io/ebeaninternal/server/cache/DefaultServerCacheConfigTest.java @@ -6,8 +6,7 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; -public class DefaultServerCacheConfigTest { - +class DefaultServerCacheConfigTest { private DefaultServerCacheConfig create(int maxSize, int maxIdleSecs, int maxSecsToLive, int trimFreq) { ServerCacheOptions options = new ServerCacheOptions(); @@ -20,33 +19,45 @@ public class DefaultServerCacheConfigTest { } @Test - public void trimFreq_halfIdle() { - + void trimFreq_halfIdle() { assertEquals(create(10000,10,20, 0).determineTrimFrequency(), 4); } - @Test - public void trimFreq_halfIdle_withRounding() { - + void trimFreq_halfIdle_withRounding() { assertEquals(create(10000,11,20, 0).determineTrimFrequency(), 4); } @Test - public void trimFreq_halfTTL() { - + void trimFreq_halfTTL() { assertEquals(create(10000,0,20, 0).determineTrimFrequency(), 9); } @Test - public void trimFreq_halfTTL_withRounding() { - + void trimFreq_halfTTL_withRounding() { assertEquals(create(10000,0,21, 0).determineTrimFrequency(), 9); } @Test - public void trimFreq_explicit() { - + void trimFreq_explicit() { assertEquals(create(10000,10,20, 42).determineTrimFrequency(), 42); } + + @Test + void trimOnPut_default() { + assertEquals(create(0,0,0, 0).determineTrimOnPut(), 1_000); + } + + @Test + void trimOnPut_tenPercent() { + assertEquals(create(10_000,0,0, 0).determineTrimOnPut(), 1_000); + assertEquals(create(9_000,0,0, 0).determineTrimOnPut(), 900); + assertEquals(create(100,0,0, 0).determineTrimOnPut(), 10); + } + + @Test + void trimOnPut_roundDown() { + assertEquals(create(9010,0,0, 0).determineTrimOnPut(), 901); + assertEquals(create(9009,0,0, 0).determineTrimOnPut(), 900); + } }