[
https://issues.apache.org/jira/browse/FLINK-25453?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17465569#comment-17465569
]
Mingliang Liu commented on FLINK-25453:
---------------------------------------
I think it makes sense to ignore the FNFE.
> LocalFileSystem#listStatus throws FileNotFoundException when a file is
> deleted concurrently in the directory
> ------------------------------------------------------------------------------------------------------------
>
> Key: FLINK-25453
> URL: https://issues.apache.org/jira/browse/FLINK-25453
> Project: Flink
> Issue Type: Bug
> Components: API / Core
> Affects Versions: 1.14.2
> Reporter: Caizhi Weng
> Priority: Major
>
> Add the following test case to {{LocalFileSystemTest}} to reproduce this
> issue.
> {code:java}
> @Test
> public void myTest() throws Exception {
> temporaryFolder.create();
> Runnable r =
> () -> {
> try {
> Path path = new Path(temporaryFolder.getRoot() + "/" +
> UUID.randomUUID());
> FileSystem fs = path.getFileSystem();
> try (FSDataOutputStream out =
> fs.create(path,
> FileSystem.WriteMode.NO_OVERWRITE)) {
> OutputStreamWriter writer =
> new OutputStreamWriter(out,
> StandardCharsets.UTF_8);
> writer.write("test");
> writer.flush();
> }
> Thread.sleep(ThreadLocalRandom.current().nextInt(100));
> fs.listStatus(new
> Path(temporaryFolder.getRoot().toString()));
> Thread.sleep(ThreadLocalRandom.current().nextInt(100));
> fs.delete(path, false);
> } catch (Exception e) {
> e.printStackTrace();
> }
> };
> List<Thread> threads = new ArrayList<>();
> for (int i = 0; i < 100; i++) {
> Thread thread = new Thread(r);
> thread.start();
> threads.add(thread);
> }
> for (Thread thread : threads) {
> thread.join();
> }
> }
> {code}
> Exception stack
> {code}
> java.io.FileNotFoundException: File
> /var/folders/y9/hqm_j18s105g5n8_xq00rd7c0000gp/T/junit8680341925762938456/f3b7f8a3-7092-464a-af7e-e7f8465c041d
> does not exist or the user running Flink ('tsreaper') has insufficient
> permissions to access it.
> at
> org.apache.flink.core.fs.local.LocalFileSystem.getFileStatus(LocalFileSystem.java:106)
> at
> org.apache.flink.core.fs.local.LocalFileSystem.listStatus(LocalFileSystem.java:167)
> at
> org.apache.flink.core.fs.local.LocalFileSystemTest.lambda$myTest$0(LocalFileSystemTest.java:90)
> at java.lang.Thread.run(Thread.java:748)
> {code}
> This is because {{listStatus}} is not atomic. {{LocalFileSystem}} will first
> get all file names in the directory and query for the status of each file. If
> that file is removed after the start of {{listStatus}} but before the query
> {{FileNotFoundException}} will be thrown.
> Hadoop's {{RawLocalFileSystem}} handles this by ignoring
> {{FileNotFoundException}}.
> {code:java}
> for (int i = 0; i < names.length; i++) {
> try {
> // Assemble the path using the Path 3 arg constructor to make sure
> // paths with colon are properly resolved on Linux
> results[j] = getFileStatus(new Path(f, new Path(null, null, names[i])));
> j++;
> } catch (FileNotFoundException e) {
> // ignore the files not found since the dir list may have have changed
> // since the names[] list was generated.
> }
> }
> {code}
--
This message was sent by Atlassian Jira
(v8.20.1#820001)