pentaho/pentaho-kettle · error · KettleException

YamlInput.Log.RequiredNotAccessibleFilesMissing

Error message

YamlInput.Log.RequiredNotAccessibleFilesMissing

What it means

YamlInput throws this KettleException in handleMissingFiles when files exist but are not accessible (cannot be opened/read by the process). FileInputList reports them via getNonAccessibleFiles(), and the step fails fast rather than reading a partial file set.

Solutions

  1. Check and grant read permission on the listed files for the user running the JVM (chmod/chown or ACLs).
  2. Confirm the path points to a regular file, not a directory.
  3. Close any process holding an exclusive lock on the file.
  4. If the file is optional, set its 'Required' flag to No so the step skips it instead of failing.

Example fix

// before: bash
# ls -l /data/input.yaml  -> -rw------- root root
// after: run as the right user or open permissions
chmod 644 /data/input.yaml   # or run PDI as a user in the file's group
Defensive patterns

Strategy: validation

Validate before calling

// pre-flight accessibility check as the same user that runs PDI
File f = new File(path);
if (!f.canRead() || f.isDirectory()) throw new IllegalStateException("Not readable: " + path);

Try / catch

try { trans.execute(...); } catch (KettleException e) {
  if (e.getMessage().contains("RequiredNotAccessibleFiles")) { fixPermissionsFromLog(e.getMessage()); }
  throw e;
}

Prevention

When it happens

Trigger: processRow -> handleMissingFiles; data.files.getNonAccessibleFiles() is non-empty, i.e. the FileObject exists but can't be read (no read permission, locked by another process, or a directory instead of a file).

Common situations: Running the transformation/PDI server under a service account lacking read permission on the file, files encrypted or locked by another application on Windows, path points to a directory, or SELinux/ACL restrictions on Linux.

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

Appendix: source

Thrown at plugins/yaml-input/impl/src/main/java/org/pentaho/di/trans/steps/yamlinput/YamlInput.java:73

  }

  private void handleMissingFiles() throws KettleException {
    List<FileObject> nonExistantFiles = data.files.getNonExistantFiles();
    if ( nonExistantFiles.size() != 0 ) {
      String message = FileInputList.getRequiredFilesDescription( nonExistantFiles );
      logError( BaseMessages.getString( PKG, "YamlInput.Log.RequiredFilesTitle" ), BaseMessages.getString(
        PKG, "YamlInput.Log.RequiredFiles", message ) );

      throw new KettleException( BaseMessages.getString( PKG, "YamlInput.Log.RequiredFilesMissing", message ) );
    }

    List<FileObject> nonAccessibleFiles = data.files.getNonAccessibleFiles();
    if ( nonAccessibleFiles.size() != 0 ) {
      String message = FileInputList.getRequiredFilesDescription( nonAccessibleFiles );
      logError( BaseMessages.getString( PKG, "YamlInput.Log.RequiredFilesTitle" ), BaseMessages.getString(
        PKG, "YamlInput.Log.RequiredNotAccessibleFiles", message ) );

      throw new KettleException( BaseMessages.getString(
        PKG, "YamlInput.Log.RequiredNotAccessibleFilesMissing", message ) );
    }
  }

  private boolean readNextString() {

    try {
      data.readrow = getRow(); // Grab another row ...

      if ( data.readrow == null ) {
        // finished processing!
        if ( log.isDetailed() ) {
          logDetailed( BaseMessages.getString( PKG, "YamlInput.Log.FinishedProcessing" ) );
        }
        return false;
      }

      if ( first ) {

View on GitHub (pinned to f3058517a1)