From db6a1867dc4b27bd8cc60b7d212c249a708651e1 Mon Sep 17 00:00:00 2001 From: Armin Braun Date: Fri, 19 Feb 2021 22:54:47 +0100 Subject: [PATCH] Fix Leaking Listener in BlobStoreRepository (#69110) We have no guarantees that implementations won't throw a non-IO exception in this spot so we have to make sure to resolve the listener on any exception to not leak it. --- .../repositories/blobstore/BlobStoreRepository.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreRepository.java b/server/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreRepository.java index 3160281c3bf36..dd3f71b0116b1 100644 --- a/server/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreRepository.java +++ b/server/src/main/java/org/elasticsearch/repositories/blobstore/BlobStoreRepository.java @@ -1371,7 +1371,7 @@ private void initializeRepoGenerationTracking(ActionListener lis } existingListener.onFailure(e); }; - threadPool.generic().execute(() -> doGetRepositoryData( + threadPool.generic().execute(ActionRunnable.wrap( ActionListener.wrap(repoData -> clusterService.submitStateUpdateTask( "set safe repository generation [" + metadata.name() + "][" + repoData + "]", new ClusterStateUpdateTask() { @@ -1410,7 +1410,7 @@ public void clusterStateProcessed(String source, ClusterState oldState, ClusterS existingListener.onResponse(repoData); }); } - }), onFailure))); + }), onFailure), this::doGetRepositoryData)); } else { logger.trace("[{}] waiting for existing initialization of repository metadata generation in cluster state", metadata.name()); @@ -1432,9 +1432,9 @@ private void doGetRepositoryData(ActionListener listener) { final long generation; try { generation = latestIndexBlobId(); - } catch (IOException ioe) { + } catch (Exception e) { listener.onFailure( - new RepositoryException(metadata.name(), "Could not determine repository generation from root blobs", ioe)); + new RepositoryException(metadata.name(), "Could not determine repository generation from root blobs", e)); return; } genToLoad = latestKnownRepoGen.updateAndGet(known -> Math.max(known, generation));