pentaho/pentaho-kettle · error · KettleException
LoadFileInput.Log.RequiredNotAccessibleFilesMissing
LoadFileInput.Log.RequiredNotAccessibleFilesMissing
Error message
LoadFileInput.Log.RequiredNotAccessibleFilesMissing
What it means
LoadFileInput (Text File Input variant that loads whole files) validates at step initialization that all files marked as 'required' are accessible. In handleMissingFiles, any files returned by FileInputList.getNonAccessibleFiles() cause logError output plus this KettleException, aborting the transformation init. The library throws it because a file declared required is missing or unreadable, so the step cannot proceed reliably.
Solutions
- Verify the file(s) listed exist and are readable by the user running Kettle; fix path or permissions.
- If the file is genuinely optional, set the 'Required?' flag to 'N' for that file entry in the step dialog (fileRequired in meta).
- Replace static paths with parameters/variables and validate existence before execution (e.g. a 'Check if file exists' or ETL Metadata Injection pre-step).
- Check the agent/server working directory; use fully qualified paths or ${Internal.Transformation.Filename.Directory} based paths.
Example fix
// before
fileName = "/data/inbound/sales_20260913.txt"; fileRequired = "Y"; // file moved to archive
// after
fileName = "${Internal.Transformation.Filename.Directory}/inbound/sales_20260913.txt"; fileRequired = "N"; // or restore file/permissions Defensive patterns
Strategy: validation
Validate before calling
// In the parent transformation before the LoadFileInput step, or via a pre-check:
File f = new File(resolvedPath);
if (!f.exists() || !f.canRead()) {
throw new IllegalStateException("Required file missing/unreadable: " + resolvedPath);
}
// Or in the step dialog: set 'Required?' = N for optional files Try / catch
try {
trans.execute(null);
} catch (KettleException e) {
if (e.getMessage().contains("RequiredNotAccessibleFilesMissing") || e.getMessage().contains("not accessible")) {
log.error("Required input file(s) missing or unreadable: check paths/permissions", e);
} else { throw e; }
} Prevention
- Use variables/parameters instead of hardcoded absolute paths.
- Set the 'Required?' flag to N for optional file entries.
- Pre-check file existence with a 'Check if file exists' style step or script before the transformation.
- Run under an account with read access to all input directories.
When it happens
Trigger: Step init() calls handleMissingFiles after building data.files; getNonAccessibleFiles() is non-empty when a filename/mask resolved to a file that does not exist, or exists but is not readable, while the 'Required' column for that file was set to 'Y' (FileExists/FileIsHidden-style required flags).
Common situations: Typo'd or hardcoded absolute paths in the file list; files moved/deleted between design time and runtime; running under a service account lacking read permission; wildcards matching nothing but the entry marked required; relative paths resolved against a different working directory on a cluster.
Understand the failure class
Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.
Related errors
- GetXMLData.Log.RequiredNotAccessibleFilesMissing (localized…
- The tablename is not defined (empty)
- AccessInput.Exception.CouldnotFindField
- AccessInput.Log.NoField
- AccessInput.Log.RequiredFilesMissing
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/3f7a659fe441210f.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/loadfileinput/LoadFileInput.java:300
}
private void handleMissingFiles() throws KettleException {
List<FileObject> nonExistantFiles = data.files.getNonExistantFiles();
if ( !nonExistantFiles.isEmpty() ) {
String message = FileInputList.getRequiredFilesDescription( nonExistantFiles );
logError( BaseMessages.getString( PKG, "LoadFileInput.Log.RequiredFilesTitle" ), BaseMessages.getString(
PKG, "LoadFileInput.Log.RequiredFiles", message ) );
throw new KettleException( BaseMessages.getString( PKG, "LoadFileInput.Log.RequiredFilesMissing", message ) );
}
List<FileObject> nonAccessibleFiles = data.files.getNonAccessibleFiles();
if ( !nonAccessibleFiles.isEmpty() ) {
String message = FileInputList.getRequiredFilesDescription( nonAccessibleFiles );
logError( BaseMessages.getString( PKG, "LoadFileInput.Log.RequiredFilesTitle" ), BaseMessages.getString(
PKG, "LoadFileInput.Log.RequiredNotAccessibleFiles", message ) );
throw new KettleException( BaseMessages.getString(
PKG, "LoadFileInput.Log.RequiredNotAccessibleFilesMissing", message ) );
}
}
/**
* Build an empty row based on the meta-data...
*
* @return
*/
private Object[] buildEmptyRow() {
return RowDataUtil.allocateRowData( data.outputRowMeta.size() );
}
Object[] getOneRow() throws KettleException {
if ( !openNextFile() ) {
return null;
}View on GitHub (pinned to f3058517a1)