diff --git a/x-pack/plugin/blob-cache/src/main/java/org/elasticsearch/blobcache/shared/SharedBlobCacheService.java b/x-pack/plugin/blob-cache/src/main/java/org/elasticsearch/blobcache/shared/SharedBlobCacheService.java index ed7965b85a36a..05b39f32bfc7a 100644 --- a/x-pack/plugin/blob-cache/src/main/java/org/elasticsearch/blobcache/shared/SharedBlobCacheService.java +++ b/x-pack/plugin/blob-cache/src/main/java/org/elasticsearch/blobcache/shared/SharedBlobCacheService.java @@ -500,6 +500,7 @@ public boolean maybeFetchFullEntry( ActionListener listener ) { int finalRegion = getEndingRegion(length); + // TODO freeRegionCount uses freeRegions.size() which is is NOT a constant-time operation. Can we do better? if (freeRegionCount() < finalRegion) { // Not enough room to download a full file without evicting existing data, so abort listener.onResponse(null); @@ -571,7 +572,7 @@ public void maybeFetchRegion( final Executor fetchExecutor, final ActionListener listener ) { - if (freeRegionCount() < 1 && maybeEvictLeastUsed() == false) { + if (freeRegions.isEmpty() && maybeEvictLeastUsed() == false) { // no free page available and no old enough unused region to be evicted logger.info("No free regions, skipping loading region [{}]", region); listener.onResponse(false); @@ -619,7 +620,7 @@ public void maybeFetchRange( final Executor fetchExecutor, final ActionListener listener ) { - if (freeRegionCount() < 1 && maybeEvictLeastUsed() == false) { + if (freeRegions.isEmpty() && maybeEvictLeastUsed() == false) { // no free page available and no old enough unused region to be evicted logger.info("No free regions, skipping loading region [{}]", region); listener.onResponse(false); @@ -671,7 +672,11 @@ private static void throwAlreadyClosed(String message) { throw new AlreadyClosedException(message); } - // used by tests + /** + * NOTE: Method is package private mostly to allow checking the number of fee regions in tests. + * However, it is also used by {@link SharedBlobCacheService#maybeFetchFullEntry} but we should try + * to move away from that because calling "size" on a ConcurrentLinkedQueue is not a constant time operation. + */ int freeRegionCount() { return freeRegions.size(); }