From a61771547b158ece7b1a6145448670146ab3fbee Mon Sep 17 00:00:00 2001 From: Tanguy Leroux Date: Wed, 15 Nov 2023 13:18:47 +0100 Subject: [PATCH] [8.11] Fix listeners in SharedBlobCacheService.readMultiRegions Backport of #101727 for 8.11.2 --- .../shared/SharedBlobCacheService.java | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) 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 d7cbddf490df5..f9441b9145ca9 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 @@ -1093,16 +1093,22 @@ private int readMultiRegions( // nothing to read, skip continue; } - final CacheFileRegion fileRegion = get(cacheKey, length, region).chunk; - final long regionStart = getRegionStart(region); - fileRegion.populateAndRead( - mapSubRangeToRegion(rangeToWrite, region), - subRangeToRead, - readerWithOffset(reader, fileRegion, Math.toIntExact(rangeToRead.start() - regionStart)), - writerWithOffset(writer, fileRegion, Math.toIntExact(rangeToWrite.start() - regionStart)), - ioExecutor, - listeners.acquire(i -> bytesRead.updateAndGet(j -> Math.addExact(i, j))) - ); + ActionListener listener = listeners.acquire(i -> bytesRead.updateAndGet(j -> Math.addExact(i, j))); + try { + final CacheFileRegion fileRegion = get(cacheKey, length, region).chunk; + final long regionStart = getRegionStart(region); + fileRegion.populateAndRead( + mapSubRangeToRegion(rangeToWrite, region), + subRangeToRead, + readerWithOffset(reader, fileRegion, Math.toIntExact(rangeToRead.start() - regionStart)), + writerWithOffset(writer, fileRegion, Math.toIntExact(rangeToWrite.start() - regionStart)), + ioExecutor, + listener + ); + } catch (Exception e) { + assert e instanceof AlreadyClosedException : e; + listener.onFailure(e); + } } } readsComplete.get();