Github user lw-lin commented on a diff in the pull request: https://github.com/apache/spark/pull/16987#discussion_r103404486 --- Diff: sql/core/src/main/scala/org/apache/spark/sql/execution/streaming/FileStreamSource.scala --- @@ -159,28 +161,64 @@ class FileStreamSource( /** * If the source has a metadata log indicating which files should be read, then we should use it. - * We figure out whether there exists some metadata log only when user gives a non-glob path. + * Only when user gives a non-glob path that will we figure out whether the source has some + * metadata log + * + * None means we don't know at the moment + * Some(true) means we know for sure the source DOES have metadata + * Some(false) means we know for sure the source DOSE NOT have metadata */ - private val sourceHasMetadata: Boolean = - !SparkHadoopUtil.get.isGlobPath(new Path(path)) && - FileStreamSink.hasMetadata(Seq(path), sparkSession.sessionState.newHadoopConf()) + @volatile private[sql] var sourceHasMetadata: Option[Boolean] = + if (SparkHadoopUtil.get.isGlobPath(new Path(path))) Some(false) else None + + private def allFilesUsingInMemoryFileIndex() = { + val globbedPaths = SparkHadoopUtil.get.globPathIfNecessary(qualifiedBasePath) + val fileIndex = new InMemoryFileIndex(sparkSession, globbedPaths, options, Some(new StructType)) + fileIndex.allFiles() + } + + private def allFilesUsingMetadataLogFileIndex() = { + // Note if `sourceHasMetadata` holds, then `qualifiedBasePath` is guaranteed to be a + // non-glob path + new MetadataLogFileIndex(sparkSession, qualifiedBasePath).allFiles() + } /** * Returns a list of files found, sorted by their timestamp. */ private def fetchAllFiles(): Seq[(String, Long)] = { val startTime = System.nanoTime - val catalog = - if (sourceHasMetadata) { - // Note if `sourceHasMetadata` holds, then `qualifiedBasePath` is guaranteed to be a - // non-glob path - new MetadataLogFileIndex(sparkSession, qualifiedBasePath) + --- End diff -- then based on `sourceHasMetadata`'s value, we can choose which `FileIndex` should be used. As showed below, `case None` should be dealt with most care.
--- If your project is set up for it, you can reply to this email and have your reply appear on GitHub as well. If your project does not have this feature enabled and wishes so, or if the feature is enabled but not working, please contact infrastructure at infrastruct...@apache.org or file a JIRA ticket with INFRA. --- --------------------------------------------------------------------- To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org For additional commands, e-mail: reviews-h...@spark.apache.org