remove lastAccessMap
In the last commit I added a lastAccessMap to the HotEntryCache. This map made it much more efficient to evict entries. But it also made and put and get operation much more expensive. Overall that change lead to a 65% decrease in ingestion performance of the PerformanceDB. Fixed by removing the map again. Eviction has to look at all elements again.
This commit is contained in:
@@ -35,7 +35,6 @@ public class HotEntryCacheTest {
|
||||
|
||||
final String cachedValue2 = cache.get("key");
|
||||
Assert.assertEquals(cachedValue2, "value2");
|
||||
cache.checkInvariants();
|
||||
}
|
||||
|
||||
public void testPutTouches() throws InterruptedException, ExecutionException, TimeoutException {
|
||||
@@ -44,20 +43,30 @@ public class HotEntryCacheTest {
|
||||
final HotEntryCache<String, String> cache = new HotEntryCache<>(timeToLive, clock);
|
||||
|
||||
cache.put("key", "value1");
|
||||
final Instant oldestLastAccessTime = cache.getLastAccessMap().firstKey();
|
||||
Assert.assertEquals(oldestLastAccessTime, Instant.now(clock));
|
||||
|
||||
clock.plusSeconds(1);
|
||||
clock.plusSeconds(2);
|
||||
|
||||
cache.put("key", "value2");
|
||||
Assert.assertEquals(cache.getLastAccessMap().size(), 1);
|
||||
|
||||
final Instant oldestLastAccessTimeAfterTouch = cache.getLastAccessMap().firstKey();
|
||||
Assert.assertEquals(oldestLastAccessTimeAfterTouch, Instant.now(clock));
|
||||
cache.checkInvariants();
|
||||
clock.plus(timeToLive.minusSeconds(1));
|
||||
cache.triggerEvictionAndWait();
|
||||
// at this point the entry would have been evicted it it was not touched by the
|
||||
// second put.
|
||||
|
||||
final String cachedValue2 = cache.get("key");
|
||||
Assert.assertEquals(cachedValue2, "value2");
|
||||
|
||||
clock.plus(timeToLive.plusSeconds(1));
|
||||
// time elapsed since the last put: timeToLive +1s
|
||||
cache.triggerEvictionAndWait();
|
||||
|
||||
final String cachedValue1_evicted = cache.get("key");
|
||||
Assert.assertEquals(cachedValue1_evicted, null);
|
||||
}
|
||||
|
||||
public void testEvictOnGet() throws InterruptedException, ExecutionException, TimeoutException {
|
||||
// TODO that does not make sense. Get should not evict. We should be happy that
|
||||
// the element is still in the map when we need it.
|
||||
public void testGetEvicts() throws Exception {
|
||||
final ModifiableFixedTimeClock clock = new ModifiableFixedTimeClock();
|
||||
final Duration timeToLive = Duration.ofSeconds(10);
|
||||
final HotEntryCache<String, String> cache = new HotEntryCache<>(timeToLive, clock);
|
||||
@@ -65,11 +74,9 @@ public class HotEntryCacheTest {
|
||||
cache.put("key", "value1");
|
||||
|
||||
clock.plus(timeToLive.plusMillis(1));
|
||||
// cache.triggerEviction();
|
||||
|
||||
final String cachedValue1_evicted = cache.get("key");
|
||||
Assert.assertEquals(cachedValue1_evicted, null);
|
||||
cache.checkInvariants();
|
||||
}
|
||||
|
||||
public void testEvictionByBackgroundThread() throws InterruptedException, ExecutionException, TimeoutException {
|
||||
@@ -88,11 +95,10 @@ public class HotEntryCacheTest {
|
||||
|
||||
cache.put("key2", "value2");
|
||||
clock.plus(Duration.ofSeconds(1).plusMillis(1));
|
||||
cache.triggerEviction();
|
||||
cache.triggerEvictionAndWait();
|
||||
|
||||
final String evictedValue1 = evictionEventFuture.get(5, TimeUnit.MINUTES); // enough time for debugging
|
||||
Assert.assertEquals(evictedValue1, "value1");
|
||||
cache.checkInvariants();
|
||||
}
|
||||
|
||||
public void testRemove() throws InterruptedException, ExecutionException, TimeoutException {
|
||||
@@ -109,7 +115,6 @@ public class HotEntryCacheTest {
|
||||
Assert.assertEquals(removedValues, Arrays.asList("value1"));
|
||||
|
||||
Assert.assertEquals(cache.get("key"), null);
|
||||
cache.checkInvariants();
|
||||
}
|
||||
|
||||
public void testClear() throws InterruptedException, ExecutionException, TimeoutException {
|
||||
@@ -127,7 +132,6 @@ public class HotEntryCacheTest {
|
||||
Assert.assertEquals(cache.get("key2"), null);
|
||||
|
||||
Assert.assertEquals(removedValues, Arrays.asList("value1", "value2"));
|
||||
cache.checkInvariants();
|
||||
}
|
||||
|
||||
public void testForEachTouches() throws InterruptedException, ExecutionException, TimeoutException {
|
||||
@@ -160,7 +164,6 @@ public class HotEntryCacheTest {
|
||||
clock.plus(timeToLive.minusMillis(1));
|
||||
|
||||
Assert.assertEquals(cache.get("key"), null);
|
||||
cache.checkInvariants();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -206,7 +209,6 @@ public class HotEntryCacheTest {
|
||||
} finally {
|
||||
pool.shutdownNow();
|
||||
}
|
||||
cache.checkInvariants();
|
||||
}
|
||||
|
||||
public void testPutIfAbsentReturnsExistingValue() throws Exception {
|
||||
@@ -223,7 +225,6 @@ public class HotEntryCacheTest {
|
||||
|
||||
final String actualInCache = cache.get(key);
|
||||
Assert.assertEquals(actualInCache, valueA);
|
||||
cache.checkInvariants();
|
||||
}
|
||||
|
||||
public void testPutIfAbsentDoesNotAddNull() throws Exception {
|
||||
@@ -235,7 +236,6 @@ public class HotEntryCacheTest {
|
||||
|
||||
final String actualInCache = cache.get(key);
|
||||
Assert.assertEquals(actualInCache, null);
|
||||
cache.checkInvariants();
|
||||
}
|
||||
|
||||
private void sleep(final TimeUnit timeUnit, final long timeout) {
|
||||
|
||||
Reference in New Issue
Block a user