From 1edcee8298515b861671df19397843e63c5e6a5f Mon Sep 17 00:00:00 2001 From: Tanguy Leroux Date: Fri, 1 Dec 2023 14:54:11 +0100 Subject: [PATCH] Decref CacheFileRegion after read is done not before (#102848) 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 f9441b9145ca9..37b38c5de0c6a 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());