@Test void customWeighter() { RangeCache<Integer, RefString> cache = new RangeCache<>(value -> value.s.length()); cache.put(0, new RefString("zero")); cache.put(1, new RefString("one")); assertEquals(cache.getSize(), 7); assertEquals(cache.getNumberOfEntries(), 2); }
@Test void getRange() { RangeCache<Integer, RefString> cache = new RangeCache<>(); cache.put(0, new RefString("0")); cache.put(1, new RefString("1")); cache.put(3, new RefString("3")); cache.put(5, new RefString("5")); assertEquals(cache.getRange(1, 8), Lists.newArrayList(new RefString("1"), new RefString("3"), new RefString("5"))); cache.put(8, new RefString("8")); assertEquals(cache.getRange(1, 8), Lists.newArrayList(new RefString("1"), new RefString("3"), new RefString("5"), new RefString("8"))); cache.clear(); assertEquals(cache.getSize(), 0); assertEquals(cache.getNumberOfEntries(), 0); }
@Test void evictions() { RangeCache<Integer, RefString> cache = new RangeCache<>(); cache.put(i, new RefString(Integer.toString(i))); assertEquals(cache.getSize(), 100); Pair<Integer, Long> res = cache.evictLeastAccessedEntries(1); assertEquals((int) res.getLeft(), 1); assertEquals((long) res.getRight(), 1); assertEquals(cache.getSize(), 99); res = cache.evictLeastAccessedEntries(10); assertEquals((int) res.getLeft(), 10); assertEquals((long) res.getRight(), 10); assertEquals(cache.getSize(), 89); res = cache.evictLeastAccessedEntries(100); assertEquals((int) res.getLeft(), 89); assertEquals((long) res.getRight(), 89); assertEquals(cache.getSize(), 0); cache.put(i, new RefString(Integer.toString(i))); assertEquals(cache.getSize(), 100); res = cache.removeRange(10, 20, false); assertEquals((int) res.getLeft(), 10); assertEquals((long) res.getRight(), 10); assertEquals(cache.getSize(), 90);
@Override public Pair<Integer, Long> evictEntries(long sizeToFree) { checkArgument(sizeToFree > 0); Pair<Integer, Long> evicted = entries.evictLeastAccessedEntries(sizeToFree); int evictedEntries = evicted.getLeft(); long evictedSize = evicted.getRight(); if (log.isDebugEnabled()) { log.debug( "[{}] Doing cache eviction of at least {} Mb -- Deleted {} entries - Total size deleted: {} Mb " + " -- Current Size: {} Mb", ml.getName(), sizeToFree / MB, evictedEntries, evictedSize / MB, entries.getSize() / MB); } manager.entriesRemoved(evictedSize); return evicted; }
@Override public void invalidateEntries(final PositionImpl lastPosition) { final PositionImpl firstPosition = PositionImpl.get(-1, 0); Pair<Integer, Long> removed = entries.removeRange(firstPosition, lastPosition, true); int entriesRemoved = removed.getLeft(); long sizeRemoved = removed.getRight(); if (log.isDebugEnabled()) { log.debug("[{}] Invalidated entries up to {} - Entries removed: {} - Size removed: {}", ml.getName(), lastPosition, entriesRemoved, sizeRemoved); } manager.entriesRemoved(sizeRemoved); }
@Override public void clear() { long removedSize = entries.clear(); manager.entriesRemoved(removedSize); }
@Override public long getSize() { return entries.getSize(); }
public EntryCacheImpl(EntryCacheManager manager, ManagedLedgerImpl ml) { this.manager = manager; this.ml = ml; this.entries = new RangeCache<>(entryWeighter); if (log.isDebugEnabled()) { log.debug("[{}] Initialized managed-ledger entry cache", ml.getName()); } }
log.debug("[{}] Reading entry ledger {}: {}", ml.getName(), lh.getId(), position.getEntryId()); EntryImpl entry = entries.get(position); if (entry != null) { EntryImpl cachedEntry = EntryImpl.create(entry);
EntryImpl cacheEntry = EntryImpl.create(position, cachedData); cachedData.release(); if (entries.put(position, cacheEntry)) { manager.entryAdded(entry.getLength()); return true;
Collection<EntryImpl> cachedEntries = entries.getRange(firstPosition, lastPosition);
@Override public Pair<Integer, Long> evictEntries(long sizeToFree) { checkArgument(sizeToFree > 0); Pair<Integer, Long> evicted = entries.evictLeastAccessedEntries(sizeToFree); int evictedEntries = evicted.first; long evictedSize = evicted.second; if (log.isDebugEnabled()) { log.debug( "[{}] Doing cache eviction of at least {} Mb -- Deleted {} entries - Total size deleted: {} Mb " + " -- Current Size: {} Mb", ml.getName(), sizeToFree / MB, evictedEntries, evictedSize / MB, entries.getSize() / MB); } manager.entriesRemoved(evictedSize); return evicted; }
@Override public void invalidateAllEntries(long ledgerId) { final PositionImpl firstPosition = PositionImpl.get(ledgerId, 0); final PositionImpl lastPosition = PositionImpl.get(ledgerId + 1, 0); Pair<Integer, Long> removed = entries.removeRange(firstPosition, lastPosition, false); int entriesRemoved = removed.getLeft(); long sizeRemoved = removed.getRight(); if (log.isDebugEnabled()) { log.debug("[{}] Invalidated all entries on ledger {} - Entries removed: {} - Size removed: {}", ml.getName(), ledgerId, entriesRemoved, sizeRemoved); } manager.entriesRemoved(sizeRemoved); }
@Override public void clear() { long removedSize = entries.clear(); manager.entriesRemoved(removedSize); }
@Override public long getSize() { return entries.getSize(); }
public EntryCacheImpl(EntryCacheManager manager, ManagedLedgerImpl ml) { this.manager = manager; this.ml = ml; this.entries = new RangeCache<>(entryWeighter); if (log.isDebugEnabled()) { log.debug("[{}] Initialized managed-ledger entry cache", ml.getName()); } }
log.debug("[{}] Reading entry ledger {}: {}", ml.getName(), lh.getId(), position.getEntryId()); EntryImpl entry = entries.get(position); if (entry != null) { EntryImpl cachedEntry = EntryImpl.create(entry);
EntryImpl cacheEntry = EntryImpl.create(position, cachedData); cachedData.release(); if (entries.put(position, cacheEntry)) { manager.entryAdded(entry.getLength()); return true;
Collection<EntryImpl> cachedEntries = entries.getRange(firstPosition, lastPosition);
@Test void eviction() { RangeCache<Integer, RefString> cache = new RangeCache<>(value -> value.s.length()); cache.put(0, new RefString("zero")); cache.put(1, new RefString("one")); cache.put(2, new RefString("two")); cache.put(3, new RefString("three")); assertEquals(cache.evictLeastAccessedEntries(5), Pair.of(2, (long) 7)); assertEquals(cache.getNumberOfEntries(), 2); assertEquals(cache.getSize(), 8); assertEquals(cache.get(0), null); assertEquals(cache.get(1), null); assertEquals(cache.get(2).s, "two"); assertEquals(cache.get(3).s, "three"); assertEquals(cache.evictLeastAccessedEntries(100), Pair.of(2, (long) 8)); assertEquals(cache.getNumberOfEntries(), 0); assertEquals(cache.getSize(), 0); assertEquals(cache.get(0), null); assertEquals(cache.get(1), null); assertEquals(cache.get(2), null); assertEquals(cache.get(3), null); cache.evictLeastAccessedEntries(0); fail("should throw exception"); } catch (IllegalArgumentException e) {