Skip to content

Commit 2886d4c

Browse files
Make FsBlobContainer Listing Resilient to Concurrent Modifications (#49142) (#49176)
* 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
1 parent 57f5722 commit 2886d4c

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

server/src/main/java/org/elasticsearch/common/blobstore/fs/FsBlobContainer.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,13 @@ public Map<String, BlobMetaData> listBlobsByPrefix(String blobNamePrefix) throws
9797
blobNamePrefix = blobNamePrefix == null ? "" : blobNamePrefix;
9898
try (DirectoryStream<Path> stream = Files.newDirectoryStream(path, blobNamePrefix + "*")) {
9999
for (Path file : stream) {
100-
final BasicFileAttributes attrs = Files.readAttributes(file, BasicFileAttributes.class);
100+
final BasicFileAttributes attrs;
101+
try {
102+
attrs = Files.readAttributes(file, BasicFileAttributes.class);
103+
} catch (FileNotFoundException | NoSuchFileException e) {
104+
// The file was concurrently deleted between listing files and trying to get its attributes so we skip it here
105+
continue;
106+
}
101107
if (attrs.isRegularFile()) {
102108
builder.put(file.getFileName().toString(), new PlainBlobMetaData(file.getFileName().toString(), attrs.size()));
103109
}

0 commit comments

Comments
 (0)