From 89303301eff437e0d4cb4a499cdf8f57ab60c79c Mon Sep 17 00:00:00 2001 From: Tanguy Leroux Date: Fri, 8 Dec 2023 15:48:43 +0100 Subject: [PATCH] Decref CacheFileRegion after read is done not before (#102848) (#103200) The CacheFileRegion instance is decref before the read operation is executed, meaning that the SharedBytes.IO instance can return to the pool of free regions, being polled and written by another thread for another cache file region, before the first read is effectively completed (and will return incorrect bytes). --- docs/changelog/102848.yaml | 5 +++++ .../blobcache/shared/SharedBlobCacheService.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 docs/changelog/102848.yaml diff --git a/docs/changelog/102848.yaml b/docs/changelog/102848.yaml new file mode 100644 index 0000000000000..971d91a878579 --- /dev/null +++ b/docs/changelog/102848.yaml @@ -0,0 +1,5 @@ +pr: 102848 +summary: Decref `SharedBytes.IO` after read is done not before +area: Snapshot/Restore +type: bug +issues: [] 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 2b6521c2454fb..8c410591e2b6a 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 @@ -915,7 +915,7 @@ void populateAndRead( final List gaps = tracker.waitForRange( rangeToWrite, rangeToRead, - ActionListener.runBefore(listener, resource::close).delegateFailureAndWrap((l, success) -> { + ActionListener.runAfter(listener, resource::close).delegateFailureAndWrap((l, success) -> { var ioRef = io; assert regionOwners.get(ioRef) == this; final int start = Math.toIntExact(rangeToRead.start());