|
@@ -328,7 +328,6 @@ public class SharedBlobCacheService<KeyType> implements Releasable {
|
|
|
private final LongAdder writeCount = new LongAdder();
|
|
|
private final LongAdder writeBytes = new LongAdder();
|
|
|
|
|
|
- private final LongAdder readCount = new LongAdder();
|
|
|
private final LongAdder readBytes = new LongAdder();
|
|
|
|
|
|
private final LongAdder evictCount = new LongAdder();
|
|
@@ -741,8 +740,9 @@ public class SharedBlobCacheService<KeyType> implements Releasable {
|
|
|
evictCount.sum(),
|
|
|
writeCount.sum(),
|
|
|
writeBytes.sum(),
|
|
|
- readCount.sum(),
|
|
|
- readBytes.sum()
|
|
|
+ blobCacheMetrics.readCount(),
|
|
|
+ readBytes.sum(),
|
|
|
+ blobCacheMetrics.missCount()
|
|
|
);
|
|
|
}
|
|
|
|
|
@@ -1113,7 +1113,7 @@ public class SharedBlobCacheService<KeyType> implements Releasable {
|
|
|
+ '-'
|
|
|
+ rangeToRead.start()
|
|
|
+ ']';
|
|
|
- blobCacheService.readCount.increment();
|
|
|
+ blobCacheService.blobCacheMetrics.recordRead();
|
|
|
l.onResponse(read);
|
|
|
})
|
|
|
);
|
|
@@ -1228,12 +1228,14 @@ public class SharedBlobCacheService<KeyType> implements Releasable {
|
|
|
return false;
|
|
|
}
|
|
|
var fileRegion = lastAccessedRegion;
|
|
|
+ boolean incrementReads = false;
|
|
|
if (fileRegion != null && fileRegion.chunk.regionKey.region == startRegion) {
|
|
|
// existing item, check if we need to promote item
|
|
|
fileRegion.touch();
|
|
|
|
|
|
} else {
|
|
|
fileRegion = cache.get(cacheKey, length, startRegion);
|
|
|
+ incrementReads = true;
|
|
|
}
|
|
|
final var region = fileRegion.chunk;
|
|
|
if (region.tracker.checkAvailable(end - getRegionStart(startRegion)) == false) {
|
|
@@ -1241,6 +1243,10 @@ public class SharedBlobCacheService<KeyType> implements Releasable {
|
|
|
}
|
|
|
boolean res = region.tryRead(buf, offset);
|
|
|
lastAccessedRegion = res ? fileRegion : null;
|
|
|
+ if (res && incrementReads) {
|
|
|
+ blobCacheMetrics.recordRead();
|
|
|
+ // todo: should we add to readBytes? readBytes.add(end - offset);
|
|
|
+ }
|
|
|
return res;
|
|
|
}
|
|
|
|
|
@@ -1309,7 +1315,7 @@ public class SharedBlobCacheService<KeyType> implements Releasable {
|
|
|
mapSubRangeToRegion(rangeToWrite, region),
|
|
|
mapSubRangeToRegion(rangeToRead, region),
|
|
|
readerWithOffset(reader, fileRegion, Math.toIntExact(rangeToRead.start() - regionStart)),
|
|
|
- writerWithOffset(writer, fileRegion, Math.toIntExact(rangeToWrite.start() - regionStart)),
|
|
|
+ metricRecordingWriter(writerWithOffset(writer, fileRegion, Math.toIntExact(rangeToWrite.start() - regionStart))),
|
|
|
ioExecutor,
|
|
|
readFuture
|
|
|
);
|
|
@@ -1341,7 +1347,9 @@ public class SharedBlobCacheService<KeyType> implements Releasable {
|
|
|
mapSubRangeToRegion(rangeToWrite, region),
|
|
|
subRangeToRead,
|
|
|
readerWithOffset(reader, fileRegion, Math.toIntExact(rangeToRead.start() - regionStart)),
|
|
|
- writerWithOffset(writer, fileRegion, Math.toIntExact(rangeToWrite.start() - regionStart)),
|
|
|
+ metricRecordingWriter(
|
|
|
+ writerWithOffset(writer, fileRegion, Math.toIntExact(rangeToWrite.start() - regionStart))
|
|
|
+ ),
|
|
|
ioExecutor,
|
|
|
listener
|
|
|
);
|
|
@@ -1416,6 +1424,16 @@ public class SharedBlobCacheService<KeyType> implements Releasable {
|
|
|
return adjustedWriter;
|
|
|
}
|
|
|
|
|
|
+ private RangeMissingHandler metricRecordingWriter(RangeMissingHandler writer) {
|
|
|
+ return new DelegatingRangeMissingHandler(writer) {
|
|
|
+ @Override
|
|
|
+ public SourceInputStreamFactory sharedInputStreamFactory(List<SparseFileTracker.Gap> gaps) {
|
|
|
+ blobCacheMetrics.recordMiss();
|
|
|
+ return super.sharedInputStreamFactory(gaps);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
private RangeAvailableHandler readerWithOffset(RangeAvailableHandler reader, CacheFileRegion<KeyType> fileRegion, int readOffset) {
|
|
|
final RangeAvailableHandler adjustedReader = (channel, channelPos, relativePos, len) -> reader.onRangeAvailable(
|
|
|
channel,
|
|
@@ -1558,9 +1576,11 @@ public class SharedBlobCacheService<KeyType> implements Releasable {
|
|
|
long writeCount,
|
|
|
long writeBytes,
|
|
|
long readCount,
|
|
|
- long readBytes
|
|
|
+ long readBytes,
|
|
|
+ // miss-count not exposed in REST API for now
|
|
|
+ long missCount
|
|
|
) {
|
|
|
- public static final Stats EMPTY = new Stats(0, 0L, 0L, 0L, 0L, 0L, 0L, 0L);
|
|
|
+ public static final Stats EMPTY = new Stats(0, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L);
|
|
|
}
|
|
|
|
|
|
private class LFUCache implements Cache<KeyType, CacheFileRegion<KeyType>> {
|