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

  1. Grant the user running PDI read (and execute/traverse) permission on the listed folders.
  2. Verify network mounts/shares are up and credentials are valid.
  3. Test access manually as the PDI service user (ls / dir on each path).
  4. 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

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


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)