apache/seatunnel · error · IOException
Failed during source_listing root_stat for protocol=
Error message
Failed during source_listing root_stat for protocol=%s, path=%s
What it means
Logged by FileDiscoveryScanner.scan when obtaining the root path's FileStatus via the filesystem client fails during source listing setup. It names the scheme/protocol and path whose initial stat failed, typically an unreachable or misconfigured filesystem.
Solutions
- Verify the path exists and is accessible under the given scheme (hdfs://, s3a://, file://, etc.)
- Check filesystem credentials/configuration (Hadoop conf, S3 keys) for the configured protocol
- Ensure the filesystem client jar for the protocol is on the classpath
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/source/reader/FileDiscoveryScanner.java:52 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10).
Data as JSON: /api/errors/b0ba0fb49c0f48c3.
Report an issue: GitHub.
Appendix: source
Thrown at seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/source/reader/FileDiscoveryScanner.java:52
private static final long PROGRESS_INTERVAL = 10_000L;
private FileDiscoveryScanner() {}
/** Traverses directories explicitly and applies the filter in the listing callback. */
static ScanStats scan(
Path root,
boolean recursive,
FileStatusListingSession session,
FileFilter filter,
FileStatusListingSession.FileStatusConsumer candidateConsumer)
throws IOException {
long started = System.nanoTime();
ScanStats stats = new ScanStats();
FileStatus rootStatus;
try {
rootStatus = session.getFileStatus(root);
} catch (IOException e) {
throw new IOException(
"Failed during source_listing root_stat for protocol="
+ scheme(root)
+ ", path="
+ mask(root),
e);
}
if (rootStatus.isFile()) {
stats.sourceEntries++;
process(rootStatus, filter, candidateConsumer, stats);
} else {
Deque<Path> directories = new ArrayDeque<>();
directories.push(rootStatus.getPath());
while (!directories.isEmpty()) {
Path directory = directories.pop();
try {
session.list(
directory,
status -> {View on GitHub (pinned to cf67b549a7)