From aed677a5b288695ee0be72521878710a0a278973 Mon Sep 17 00:00:00 2001 From: Armin Braun Date: Fri, 15 Nov 2019 10:14:18 +0100 Subject: [PATCH 1/2] Make FsBlobContainer Listing Resilient to Concurrent Modifications If we list out files in a folder via the lazily computed directory stream, we have to deal with concurrent deletes when reading the file attributes since we don't have a lock on the directory in any way. Closes #37581 --- .../elasticsearch/common/blobstore/fs/FsBlobContainer.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/common/blobstore/fs/FsBlobContainer.java b/server/src/main/java/org/elasticsearch/common/blobstore/fs/FsBlobContainer.java index d333691a9bc26..3b4cf53284f5a 100644 --- a/server/src/main/java/org/elasticsearch/common/blobstore/fs/FsBlobContainer.java +++ b/server/src/main/java/org/elasticsearch/common/blobstore/fs/FsBlobContainer.java @@ -97,7 +97,12 @@ public Map listBlobsByPrefix(String blobNamePrefix) throws blobNamePrefix = blobNamePrefix == null ? "" : blobNamePrefix; try (DirectoryStream stream = Files.newDirectoryStream(path, blobNamePrefix + "*")) { for (Path file : stream) { - final BasicFileAttributes attrs = Files.readAttributes(file, BasicFileAttributes.class); + final BasicFileAttributes attrs; + try { + attrs = Files.readAttributes(file, BasicFileAttributes.class); + } catch (FileNotFoundException e) { + continue; + } if (attrs.isRegularFile()) { builder.put(file.getFileName().toString(), new PlainBlobMetaData(file.getFileName().toString(), attrs.size())); } From 65087f40f0c685eea09b6618521b7109cb30f1f9 Mon Sep 17 00:00:00 2001 From: Armin Braun Date: Fri, 15 Nov 2019 14:47:39 +0100 Subject: [PATCH 2/2] more catching and comment --- .../org/elasticsearch/common/blobstore/fs/FsBlobContainer.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/elasticsearch/common/blobstore/fs/FsBlobContainer.java b/server/src/main/java/org/elasticsearch/common/blobstore/fs/FsBlobContainer.java index 3b4cf53284f5a..d3a9731b2f656 100644 --- a/server/src/main/java/org/elasticsearch/common/blobstore/fs/FsBlobContainer.java +++ b/server/src/main/java/org/elasticsearch/common/blobstore/fs/FsBlobContainer.java @@ -100,7 +100,8 @@ public Map listBlobsByPrefix(String blobNamePrefix) throws final BasicFileAttributes attrs; try { attrs = Files.readAttributes(file, BasicFileAttributes.class); - } catch (FileNotFoundException e) { + } catch (FileNotFoundException | NoSuchFileException e) { + // The file was concurrently deleted between listing files and trying to get its attributes so we skip it here continue; } if (attrs.isRegularFile()) {