pentaho/pentaho-kettle · error · KettleException
PropertyInput.Log.RequiredNotAccessibleFilesMissing
Error message
PropertyInput.Log.RequiredNotAccessibleFilesMissing
What it means
In handleMissingFiles(), PropertyInput throws this when required input files exist but cannot be accessed (e.g. unreadable due to permissions, locked, or VFS access failure). The inaccessible file names are included in the message.
Solutions
- Grant read permission on the files to the user running PDI
- Verify no other process holds an exclusive lock on the files
- Check VFS/SFTP credentials and mount availability for remote paths
- Retry after the producing process finishes writing (or use a job wait/check step)
- Point the step at a copy of the files in an accessible location
Example fix
// before: unreadable file // chmod 600 /data/app.properties owned by another user // after: make readable for the PDI user // shell: chmod 644 /data/app.properties // or run transformation as a user with read access
Defensive patterns
Strategy: validation
Validate before calling
for (FileObject f : files.getFiles()) {
if (f.exists() && !f.isReadable()) {
logError("File not accessible: " + f.getName());
}
} Type guard
boolean allAccessible = files.getNonAccessibleFiles().isEmpty();
Try / catch
try {
transformation.execute(params);
} catch (KettleException e) {
if (e.getMessage() != null && e.getMessage().contains("access")) {
logError("Check permissions/locks on configured files");
} else { throw e; }
} Prevention
- Run PDI under an account with read access to all input directories
- Wait for producers to finish writing (avoid reading in-flight files)
- Validate remote share/SFTP credentials before the run
- Test the exact paths as the service user, not your interactive user
When it happens
Trigger: Files matched by the step's file list that exist but cannot be opened by the transformation's user — permission denied, file locked by another process, or VFS cannot access remote location.
Common situations: Running the transformation/PDI server under a service account lacking read permissions; file still being written by a producer; network share/SFTP credentials insufficient; Windows file locking.
Understand the failure class
Background: Permission denied / not authorized / 403 Forbidden: access-control rejections when the caller lacks the required role, grant, or ownership — this error's family across 18 libraries.
Related errors
- AbsSecurityManager.ERROR_0005_INSUFFICIENT_PRIVELEGES
- AbsSecurityProvider.ERROR_0002_UNABLE_TO_ACCESS_IS_ALLOWED
- AbsSecurityProvider.ERROR_0003_UNABLE_TO_ACCESS_GET_ALLOWED_ACTIONS
- AccessInput.Log.RequiredNotAccessibleFilesMissing
- Could not delete stale file " + buildFilename
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/288d43e3da50a227.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/propertyinput/PropertyInput.java:130
}
private void handleMissingFiles() throws KettleException {
List<FileObject> nonExistantFiles = data.files.getNonExistantFiles();
if ( !nonExistantFiles.isEmpty() ) {
String message = FileInputList.getRequiredFilesDescription( nonExistantFiles );
logError( BaseMessages.getString( PKG, "PropertyInput.Log.RequiredFilesTitle" ), BaseMessages.getString(
PKG, "PropertyInput.Log.RequiredFiles", message ) );
throw new KettleException( BaseMessages.getString( PKG, "PropertyInput.Log.RequiredFilesMissing", message ) );
}
List<FileObject> nonAccessibleFiles = data.files.getNonAccessibleFiles();
if ( !nonAccessibleFiles.isEmpty() ) {
String message = FileInputList.getRequiredFilesDescription( nonAccessibleFiles );
logError( BaseMessages.getString( PKG, "PropertyInput.Log.RequiredFilesTitle" ), BaseMessages.getString(
PKG, "PropertyInput.Log.RequiredNotAccessibleFiles", message ) );
throw new KettleException( BaseMessages.getString(
PKG, "PropertyInput.Log.RequiredNotAccessibleFilesMissing", message ) );
}
}
private Object[] getOneRow() throws KettleException {
try {
if ( meta.isFileField() ) {
while ( ( data.readrow == null )
|| ( ( data.propfiles && !data.propIt.hasNext() ) || ( !data.propfiles && !data.iniIt.hasNext() ) ) ) {
// In case we read all sections
// maybe we have to change section for ini files...
if ( !data.propfiles && data.realSection == null && data.readrow != null && data.iniSectionIt.hasNext() ) {
data.currentSection = data.iniSectionIt.next();
data.iniSection = data.iniConf.getSection( data.currentSection );
data.iniIt = data.iniSection.getKeys();
} else {
if ( !openNextFile() ) {View on GitHub (pinned to f3058517a1)