#2677 - Change trimOnPut to be 10% of max or 1_000.

Can look to provide an explicit option via `@CacheBeanTuning` later.
This commit is contained in:
Rob Bygrave
2022-05-02 22:19:37 +12:00
parent 5c332286b6
commit 2cf83278ea
3 changed files with 37 additions and 14 deletions
@@ -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();
}
}
@@ -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;
}
}
@@ -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);
}
}