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

  1. Grant read permission on the files to the user running PDI
  2. Verify no other process holds an exclusive lock on the files
  3. Check VFS/SFTP credentials and mount availability for remote paths
  4. Retry after the producing process finishes writing (or use a job wait/check step)
  5. 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

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


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)