Don't check if directory is present to prevent races
We do check if a directory is present and then open a dir stream on it. Yet the file can be concurrrently deleted which is OK but we fail with a hard exception. This change tries to open the dir directly (listing via stream) and catches NoSuchFileEx | FNFEx.
This commit is contained in:
parent
907f648a88
commit
846cf620db
|
@ -43,12 +43,10 @@ import org.elasticsearch.common.xcontent.XContentHelper;
|
||||||
import org.elasticsearch.common.xcontent.XContentParser;
|
import org.elasticsearch.common.xcontent.XContentParser;
|
||||||
import org.elasticsearch.common.xcontent.XContentType;
|
import org.elasticsearch.common.xcontent.XContentType;
|
||||||
|
|
||||||
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.nio.file.DirectoryStream;
|
import java.nio.file.*;
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Path;
|
|
||||||
import java.nio.file.StandardCopyOption;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
|
@ -253,10 +251,9 @@ public abstract class MetaDataStateFormat<T> {
|
||||||
if (dataLocations != null) { // select all eligable files first
|
if (dataLocations != null) { // select all eligable files first
|
||||||
for (Path dataLocation : dataLocations) {
|
for (Path dataLocation : dataLocations) {
|
||||||
final Path stateDir = dataLocation.resolve(STATE_DIR_NAME);
|
final Path stateDir = dataLocation.resolve(STATE_DIR_NAME);
|
||||||
if (!Files.isDirectory(stateDir)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// now, iterate over the current versions, and find latest one
|
// now, iterate over the current versions, and find latest one
|
||||||
|
// we don't check if the stateDir is present since it could be deleted
|
||||||
|
// after the check. Also if there is a _state file and it's not a dir something is really wrong
|
||||||
try (DirectoryStream<Path> paths = Files.newDirectoryStream(stateDir)) { // we don't pass a glob since we need the group part for parsing
|
try (DirectoryStream<Path> paths = Files.newDirectoryStream(stateDir)) { // we don't pass a glob since we need the group part for parsing
|
||||||
for (Path stateFile : paths) {
|
for (Path stateFile : paths) {
|
||||||
final Matcher matcher = stateFilePattern.matcher(stateFile.getFileName().toString());
|
final Matcher matcher = stateFilePattern.matcher(stateFile.getFileName().toString());
|
||||||
|
@ -270,6 +267,8 @@ public abstract class MetaDataStateFormat<T> {
|
||||||
files.add(pav);
|
files.add(pav);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} catch (NoSuchFileException | FileNotFoundException ex) {
|
||||||
|
// no _state directory -- move on
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue