diff options
author | Burak Yavuz <brkyvz@gmail.com> | 2016-09-21 17:07:16 +0800 |
---|---|---|
committer | Wenchen Fan <wenchen@databricks.com> | 2016-09-21 17:07:16 +0800 |
commit | 28fafa3ee8f3478fa441e7bd6c8fd4ab482ca98e (patch) | |
tree | a1140ca387925cb362d8744c2aabe402cc1651f3 /sql | |
parent | 3977223a3268aaf6913a325ee459139a4a302b1c (diff) | |
download | spark-28fafa3ee8f3478fa441e7bd6c8fd4ab482ca98e.tar.gz spark-28fafa3ee8f3478fa441e7bd6c8fd4ab482ca98e.tar.bz2 spark-28fafa3ee8f3478fa441e7bd6c8fd4ab482ca98e.zip |
[SPARK-17599] Prevent ListingFileCatalog from failing if path doesn't exist
## What changes were proposed in this pull request?
The `ListingFileCatalog` lists files given a set of resolved paths. If a folder is deleted at any time between the paths were resolved and the file catalog can check for the folder, the Spark job fails. This may abruptly stop long running StructuredStreaming jobs for example.
Folders may be deleted by users or automatically by retention policies. These cases should not prevent jobs from successfully completing.
## How was this patch tested?
Unit test in `FileCatalogSuite`
Author: Burak Yavuz <brkyvz@gmail.com>
Closes #15153 from brkyvz/SPARK-17599.
Diffstat (limited to 'sql')
2 files changed, 21 insertions, 2 deletions
diff --git a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/ListingFileCatalog.scala b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/ListingFileCatalog.scala index 60742bdbed..3253208423 100644 --- a/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/ListingFileCatalog.scala +++ b/sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/ListingFileCatalog.scala @@ -17,6 +17,8 @@ package org.apache.spark.sql.execution.datasources +import java.io.FileNotFoundException + import scala.collection.mutable import org.apache.hadoop.fs.{FileStatus, LocatedFileStatus, Path} @@ -97,8 +99,14 @@ class ListingFileCatalog( logTrace(s"Listing $path on driver") val childStatuses = { - val stats = fs.listStatus(path) - if (pathFilter != null) stats.filter(f => pathFilter.accept(f.getPath)) else stats + try { + val stats = fs.listStatus(path) + if (pathFilter != null) stats.filter(f => pathFilter.accept(f.getPath)) else stats + } catch { + case _: FileNotFoundException => + logWarning(s"The directory $path was not found. Was it deleted very recently?") + Array.empty[FileStatus] + } } childStatuses.map { diff --git a/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileCatalogSuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileCatalogSuite.scala index 0d9ea51272..5c8d3226e9 100644 --- a/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileCatalogSuite.scala +++ b/sql/core/src/test/scala/org/apache/spark/sql/execution/datasources/FileCatalogSuite.scala @@ -67,4 +67,15 @@ class FileCatalogSuite extends SharedSQLContext { } } + + test("ListingFileCatalog: folders that don't exist don't throw exceptions") { + withTempDir { dir => + val deletedFolder = new File(dir, "deleted") + assert(!deletedFolder.exists()) + val catalog1 = new ListingFileCatalog( + spark, Seq(new Path(deletedFolder.getCanonicalPath)), Map.empty, None) + // doesn't throw an exception + assert(catalog1.listLeafFiles(catalog1.paths).isEmpty) + } + } } |