Skip to content

Commit fbe7c12

Browse files
peteralfonsiPeter Alfonsi
authored andcommitted
[Tiered Caching] Expose new cache stats API (opensearch-project#13237)
Step 3 out of 4 --------- Signed-off-by: Peter Alfonsi <petealft@amazon.com> Co-authored-by: Peter Alfonsi <petealft@amazon.com>
1 parent d56c5fe commit fbe7c12

File tree

37 files changed

+1362
-167
lines changed

37 files changed

+1362
-167
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
2222
- [Tiered Caching] Add dimension-based stats to ICache implementations. ([#12531](https://github.com/opensearch-project/OpenSearch/pull/12531))
2323
- Add changes for overriding remote store and replication settings during snapshot restore. ([#11868](https://github.com/opensearch-project/OpenSearch/pull/11868))
2424
- Add an individual setting of rate limiter for segment replication ([#12959](https://github.com/opensearch-project/OpenSearch/pull/12959))
25+
- [Tiered Caching] Expose new cache stats API ([#13237](https://github.com/opensearch-project/OpenSearch/pull/13237))
2526
- [Streaming Indexing] Ensure support of the new transport by security plugin ([#13174](https://github.com/opensearch-project/OpenSearch/pull/13174))
2627
- Add cluster setting to dynamically configure the buckets for filter rewrite optimization. ([#13179](https://github.com/opensearch-project/OpenSearch/pull/13179))
2728
- [Tiered Caching] Gate new stats logic behind FeatureFlags.PLUGGABLE_CACHE ([#13238](https://github.com/opensearch-project/OpenSearch/pull/13238))

libs/core/src/main/java/org/opensearch/core/common/io/stream/StreamInput.java

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@
8080
import java.util.Arrays;
8181
import java.util.Collection;
8282
import java.util.Collections;
83+
import java.util.Comparator;
8384
import java.util.Date;
8485
import java.util.EnumSet;
8586
import java.util.HashMap;
@@ -90,6 +91,8 @@
9091
import java.util.Locale;
9192
import java.util.Map;
9293
import java.util.Set;
94+
import java.util.SortedMap;
95+
import java.util.TreeMap;
9396
import java.util.concurrent.TimeUnit;
9497
import java.util.function.IntFunction;
9598

@@ -642,12 +645,47 @@ public <K, V> Map<K, V> readMap(Writeable.Reader<K> keyReader, Writeable.Reader<
642645
return Collections.emptyMap();
643646
}
644647
Map<K, V> map = new HashMap<>(size);
648+
readIntoMap(keyReader, valueReader, map, size);
649+
return map;
650+
}
651+
652+
/**
653+
* Read a serialized map into a SortedMap using the default ordering for the keys. If the result is empty it might be immutable.
654+
*/
655+
public <K extends Comparable<K>, V> SortedMap<K, V> readOrderedMap(Writeable.Reader<K> keyReader, Writeable.Reader<V> valueReader)
656+
throws IOException {
657+
return readOrderedMap(keyReader, valueReader, null);
658+
}
659+
660+
/**
661+
* Read a serialized map into a SortedMap, specifying a Comparator for the keys. If the result is empty it might be immutable.
662+
*/
663+
public <K extends Comparable<K>, V> SortedMap<K, V> readOrderedMap(
664+
Writeable.Reader<K> keyReader,
665+
Writeable.Reader<V> valueReader,
666+
@Nullable Comparator<K> keyComparator
667+
) throws IOException {
668+
int size = readArraySize();
669+
if (size == 0) {
670+
return Collections.emptySortedMap();
671+
}
672+
SortedMap<K, V> sortedMap;
673+
if (keyComparator == null) {
674+
sortedMap = new TreeMap<>();
675+
} else {
676+
sortedMap = new TreeMap<>(keyComparator);
677+
}
678+
readIntoMap(keyReader, valueReader, sortedMap, size);
679+
return sortedMap;
680+
}
681+
682+
private <K, V> void readIntoMap(Writeable.Reader<K> keyReader, Writeable.Reader<V> valueReader, Map<K, V> map, int size)
683+
throws IOException {
645684
for (int i = 0; i < size; i++) {
646685
K key = keyReader.read(this);
647686
V value = valueReader.read(this);
648687
map.put(key, value);
649688
}
650-
return map;
651689
}
652690

653691
/**

modules/cache-common/src/main/java/org/opensearch/cache/common/tier/TieredSpilloverCache.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ public void close() throws IOException {
230230
}
231231

232232
@Override
233-
public ImmutableCacheStatsHolder stats() {
233+
public ImmutableCacheStatsHolder stats(String[] levels) {
234234
return null; // TODO: in TSC stats PR
235235
}
236236

modules/cache-common/src/test/java/org/opensearch/cache/common/tier/MockDiskCache.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ public ImmutableCacheStatsHolder stats() {
9999
return null;
100100
}
101101

102+
@Override
103+
public ImmutableCacheStatsHolder stats(String[] levels) {
104+
return null;
105+
}
106+
102107
@Override
103108
public void close() {
104109

plugins/cache-ehcache/src/main/java/org/opensearch/cache/store/disk/EhcacheDiskCache.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ private EhcacheDiskCache(Builder<K, V> builder) {
164164
this.cache = buildCache(Duration.ofMillis(expireAfterAccess.getMillis()), builder);
165165
List<String> dimensionNames = Objects.requireNonNull(builder.dimensionNames, "Dimension names can't be null");
166166
// If this cache is being used, FeatureFlags.PLUGGABLE_CACHE is already on, so we can always use the DefaultCacheStatsHolder.
167-
this.cacheStatsHolder = new DefaultCacheStatsHolder(dimensionNames);
167+
this.cacheStatsHolder = new DefaultCacheStatsHolder(dimensionNames, EhcacheDiskCacheFactory.EHCACHE_DISK_CACHE_NAME);
168168
}
169169

170170
@SuppressWarnings({ "rawtypes" })
@@ -446,12 +446,13 @@ public void close() {
446446
}
447447

448448
/**
449-
* Relevant stats for this cache.
450-
* @return CacheStats
449+
* Relevant stats for this cache, aggregated by levels.
450+
* @param levels The levels to aggregate by.
451+
* @return ImmutableCacheStatsHolder
451452
*/
452453
@Override
453-
public ImmutableCacheStatsHolder stats() {
454-
return cacheStatsHolder.getImmutableCacheStatsHolder();
454+
public ImmutableCacheStatsHolder stats(String[] levels) {
455+
return cacheStatsHolder.getImmutableCacheStatsHolder(levels);
455456
}
456457

457458
/**
@@ -510,15 +511,15 @@ private long getNewValuePairSize(CacheEvent<? extends ICacheKey<K>, ? extends By
510511
public void onEvent(CacheEvent<? extends ICacheKey<K>, ? extends ByteArrayWrapper> event) {
511512
switch (event.getType()) {
512513
case CREATED:
513-
cacheStatsHolder.incrementEntries(event.getKey().dimensions);
514+
cacheStatsHolder.incrementItems(event.getKey().dimensions);
514515
cacheStatsHolder.incrementSizeInBytes(event.getKey().dimensions, getNewValuePairSize(event));
515516
assert event.getOldValue() == null;
516517
break;
517518
case EVICTED:
518519
this.removalListener.onRemoval(
519520
new RemovalNotification<>(event.getKey(), deserializeValue(event.getOldValue()), RemovalReason.EVICTED)
520521
);
521-
cacheStatsHolder.decrementEntries(event.getKey().dimensions);
522+
cacheStatsHolder.decrementItems(event.getKey().dimensions);
522523
cacheStatsHolder.decrementSizeInBytes(event.getKey().dimensions, getOldValuePairSize(event));
523524
cacheStatsHolder.incrementEvictions(event.getKey().dimensions);
524525
assert event.getNewValue() == null;
@@ -527,15 +528,15 @@ public void onEvent(CacheEvent<? extends ICacheKey<K>, ? extends ByteArrayWrappe
527528
this.removalListener.onRemoval(
528529
new RemovalNotification<>(event.getKey(), deserializeValue(event.getOldValue()), RemovalReason.EXPLICIT)
529530
);
530-
cacheStatsHolder.decrementEntries(event.getKey().dimensions);
531+
cacheStatsHolder.decrementItems(event.getKey().dimensions);
531532
cacheStatsHolder.decrementSizeInBytes(event.getKey().dimensions, getOldValuePairSize(event));
532533
assert event.getNewValue() == null;
533534
break;
534535
case EXPIRED:
535536
this.removalListener.onRemoval(
536537
new RemovalNotification<>(event.getKey(), deserializeValue(event.getOldValue()), RemovalReason.INVALIDATED)
537538
);
538-
cacheStatsHolder.decrementEntries(event.getKey().dimensions);
539+
cacheStatsHolder.decrementItems(event.getKey().dimensions);
539540
cacheStatsHolder.decrementSizeInBytes(event.getKey().dimensions, getOldValuePairSize(event));
540541
assert event.getNewValue() == null;
541542
break;

plugins/cache-ehcache/src/test/java/org/opensearch/cache/store/disk/EhCacheDiskCacheTests.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public void testBasicGetAndPut() throws IOException {
9393
String value = ehcacheTest.get(getICacheKey(entry.getKey()));
9494
assertEquals(entry.getValue(), value);
9595
}
96-
assertEquals(randomKeys, ehcacheTest.stats().getTotalEntries());
96+
assertEquals(randomKeys, ehcacheTest.stats().getTotalItems());
9797
assertEquals(randomKeys, ehcacheTest.stats().getTotalHits());
9898
assertEquals(expectedSize, ehcacheTest.stats().getTotalSizeInBytes());
9999
assertEquals(randomKeys, ehcacheTest.count());
@@ -217,7 +217,7 @@ public void testConcurrentPut() throws Exception {
217217
assertEquals(entry.getValue(), value);
218218
}
219219
assertEquals(randomKeys, ehcacheTest.count());
220-
assertEquals(randomKeys, ehcacheTest.stats().getTotalEntries());
220+
assertEquals(randomKeys, ehcacheTest.stats().getTotalItems());
221221
ehcacheTest.close();
222222
}
223223
}
@@ -416,7 +416,7 @@ public String load(ICacheKey<String> key) {
416416
assertEquals(1, numberOfTimesValueLoaded);
417417
assertEquals(0, ((EhcacheDiskCache) ehcacheTest).getCompletableFutureMap().size());
418418
assertEquals(1, ehcacheTest.stats().getTotalMisses());
419-
assertEquals(1, ehcacheTest.stats().getTotalEntries());
419+
assertEquals(1, ehcacheTest.stats().getTotalItems());
420420
assertEquals(numberOfRequest - 1, ehcacheTest.stats().getTotalHits());
421421
assertEquals(1, ehcacheTest.count());
422422
ehcacheTest.close();

0 commit comments

Comments
 (0)