pentaho/pentaho-kettle · error · KettleException

Following required files are not accessible:

Error message

Following required files are not accessible: 

What it means

During init (handleMissingFiles), if any configured required files exist but cannot be accessed (e.g., no read permission), the step throws a KettleException listing them. The step will not start with inaccessible required inputs.

Solutions

  1. Grant read permission on the listed files/directories to the Pentaho/Kettle process user.
  2. Fix or remount the network share referenced by the paths.
  3. Mark files as not required ('N') if they are optional.
  4. Run the transformation under a user with proper access.

Example fix

// shell
// before: -rw------- file.txt
// after
chmod 644 file.txt  # or chown pentaho file.txt
Defensive patterns

Strategy: validation

Validate before calling

for (String path : configuredPaths) {
  File f = new File(path);
  if (f.exists() && !f.canRead()) {
    throw new IllegalStateException("Not accessible: " + path);
  }
}

Try / catch

try { trans.execute(); } catch (KettleException e) { if (e.getMessage().startsWith("Following required files are not accessible")) { /* fix permissions */ } throw e; }

Prevention

When it happens

Trigger: FileInputList.getNonAccessibleFiles() is non-empty at init: files exist but the process lacks read/execute permission or the mount is unavailable.

Common situations: Files owned by another user without read permission; unreadable directories in the path; network shares not mounted; service account lacks access.

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/c6107787214703d0. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/getfilenames/GetFileNames.java:289

  private void handleMissingFiles() throws KettleException {
    if ( meta.isdoNotFailIfNoFile() && data.files.nrOfFiles() == 0 ) {
      logBasic( BaseMessages.getString( PKG, "GetFileNames.Log.NoFile" ) );
      return;
    }
    List<FileObject> nonExistantFiles = data.files.getNonExistantFiles();

    if ( nonExistantFiles.size() != 0 ) {
      String message = FileInputList.getRequiredFilesDescription( nonExistantFiles );
      logBasic( "ERROR: Missing " + message );
      throw new KettleException( "Following required files are missing: " + message );
    }

    List<FileObject> nonAccessibleFiles = data.files.getNonAccessibleFiles();
    if ( nonAccessibleFiles.size() != 0 ) {
      String message = FileInputList.getRequiredFilesDescription( nonAccessibleFiles );
      logBasic( "WARNING: Not accessible " + message );
      throw new KettleException( "Following required files are not accessible: " + message );
    }
  }

  public boolean init( StepMetaInterface smi, StepDataInterface sdi ) {
    meta = (GetFileNamesMeta) smi;
    data = (GetFileNamesData) 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 {
        // Create the output row meta-data
        data.outputRowMeta = new RowMeta();

View on GitHub (pinned to f3058517a1)