pentaho/pentaho-kettle · error · KettleException
GetSubFolders.Exception.NoAccessibleFiles
GetSubFolders.Exception.NoAccessibleFiles
Error message
GetSubFolders.Exception.NoAccessibleFiles
What it means
GetSubFolders.handleMissingFiles throws KettleException 'NoAccessibleFiles' when configured folder paths exist but cannot be accessed (permission or I/O failure). FileInputList collects non-accessible FileObjects, lists them in the message, and the step aborts rather than partially reading folders it can't open.
Solutions
- Grant the user running PDI read (and execute/traverse) permission on the listed folders.
- Verify network mounts/shares are up and credentials are valid.
- Test access manually as the PDI service user (ls / dir on each path).
- Fix ownership or ACLs on the folders, or run the transformation under an account with access.
Defensive patterns
Strategy: validation
Validate before calling
// Check read/traverse permission on folders before the run
for ( String folder : meta.getFolderName() ) {
File f = new File( transMeta.environmentSubstitute( folder ) );
if ( f.exists() && !f.canRead() )
throw new IllegalStateException( "No read permission on folder: " + f );
} Try / catch
try {
trans.execute( null );
} catch ( KettleException e ) {
if ( e.getMessage() != null && e.getMessage().contains( "NoAccessibleFiles" ) ) {
// surface the inaccessible paths to ops for permission/mount fixes
} else throw e;
} Prevention
- Run PDI under an account with access to all referenced shares
- Verify NFS/SMB mounts before scheduled runs
- Document required ACLs per environment
- Test with the same service user that executes the scheduler
When it happens
Trigger: handleMissingFiles (from processRow) finds data.files.getNonAccessibleFiles() non-empty: paths exist but the PDI process user lacks read/execute permission, or the mount is unavailable.
Common situations: Running PDI as a service account without permissions on shared/network folders; NFS/SMB mount down; Windows share credentials not configured; files owned by another user with restrictive modes.
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
- JsonOutput.Error.ErrorCreatingParentFolder
- GetSubFolders.Exception.MissingFiles
- GPLoad.Exception.DirectoryDoesNotExist
- JsonOutput.Error.OpenNewFile
- ProcessFiles.Error.CanNotDeleteFile
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/fe93e70ec9ab86ad.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/getsubfolders/GetSubFolders.java:236
}
return true;
}
private void handleMissingFiles() throws KettleException {
List<FileObject> nonExistantFiles = data.files.getNonExistantFiles();
if ( nonExistantFiles.size() != 0 ) {
String message = FileInputList.getRequiredFilesDescription( nonExistantFiles );
logError( BaseMessages.getString( PKG, "GetSubFolders.Error.MissingFiles", message ) );
throw new KettleException( BaseMessages.getString( PKG, "GetSubFolders.Exception.MissingFiles", message ) );
}
List<FileObject> nonAccessibleFiles = data.files.getNonAccessibleFiles();
if ( nonAccessibleFiles.size() != 0 ) {
String message = FileInputList.getRequiredFilesDescription( nonAccessibleFiles );
logError( BaseMessages.getString( PKG, "GetSubFolders.Error.NoAccessibleFiles", message ) );
throw new KettleException( BaseMessages
.getString( PKG, "GetSubFolders.Exception.NoAccessibleFiles", message ) );
}
}
public boolean init( StepMetaInterface smi, StepDataInterface sdi ) {
meta = (GetSubFoldersMeta) smi;
data = (GetSubFoldersData) sdi;
if ( super.init( smi, sdi ) ) {
//Set Embedded NamedCluter MetatStore Provider Key so that it can be passed to VFS
if ( getTransMeta().getNamedClusterEmbedManager() != null ) {
getTransMeta().getNamedClusterEmbedManager()
.passEmbeddedMetastoreKey( this, getTransMeta().getEmbeddedMetastoreProviderKey() );
}
try {
data.filessize = 0;
data.rownr = 1L;
data.filenr = 0;View on GitHub (pinned to f3058517a1)