pentaho/pentaho-kettle · error · KettleException

LoadFileInput.Log.RequiredNotAccessibleFilesMissing

LoadFileInput.Log.RequiredNotAccessibleFilesMissing

Error message

LoadFileInput.Log.RequiredNotAccessibleFilesMissing

What it means

LoadFileInput (Text File Input variant that loads whole files) validates at step initialization that all files marked as 'required' are accessible. In handleMissingFiles, any files returned by FileInputList.getNonAccessibleFiles() cause logError output plus this KettleException, aborting the transformation init. The library throws it because a file declared required is missing or unreadable, so the step cannot proceed reliably.

Solutions

  1. Verify the file(s) listed exist and are readable by the user running Kettle; fix path or permissions.
  2. If the file is genuinely optional, set the 'Required?' flag to 'N' for that file entry in the step dialog (fileRequired in meta).
  3. Replace static paths with parameters/variables and validate existence before execution (e.g. a 'Check if file exists' or ETL Metadata Injection pre-step).
  4. Check the agent/server working directory; use fully qualified paths or ${Internal.Transformation.Filename.Directory} based paths.

Example fix

// before
fileName = "/data/inbound/sales_20260913.txt"; fileRequired = "Y"; // file moved to archive
// after
fileName = "${Internal.Transformation.Filename.Directory}/inbound/sales_20260913.txt"; fileRequired = "N"; // or restore file/permissions
Defensive patterns

Strategy: validation

Validate before calling

// In the parent transformation before the LoadFileInput step, or via a pre-check:
File f = new File(resolvedPath);
if (!f.exists() || !f.canRead()) {
  throw new IllegalStateException("Required file missing/unreadable: " + resolvedPath);
}
// Or in the step dialog: set 'Required?' = N for optional files

Try / catch

try {
  trans.execute(null);
} catch (KettleException e) {
  if (e.getMessage().contains("RequiredNotAccessibleFilesMissing") || e.getMessage().contains("not accessible")) {
    log.error("Required input file(s) missing or unreadable: check paths/permissions", e);
  } else { throw e; }
}

Prevention

When it happens

Trigger: Step init() calls handleMissingFiles after building data.files; getNonAccessibleFiles() is non-empty when a filename/mask resolved to a file that does not exist, or exists but is not readable, while the 'Required' column for that file was set to 'Y' (FileExists/FileIsHidden-style required flags).

Common situations: Typo'd or hardcoded absolute paths in the file list; files moved/deleted between design time and runtime; running under a service account lacking read permission; wildcards matching nothing but the entry marked required; relative paths resolved against a different working directory on a cluster.

Understand the failure class

Background: "File not found" and ENOENT errors: why libraries can't find a file that should exist — this error's family across 50 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/3f7a659fe441210f. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/loadfileinput/LoadFileInput.java:300

  }

  private void handleMissingFiles() throws KettleException {
    List<FileObject> nonExistantFiles = data.files.getNonExistantFiles();

    if ( !nonExistantFiles.isEmpty() ) {
      String message = FileInputList.getRequiredFilesDescription( nonExistantFiles );
      logError( BaseMessages.getString( PKG, "LoadFileInput.Log.RequiredFilesTitle" ), BaseMessages.getString(
        PKG, "LoadFileInput.Log.RequiredFiles", message ) );

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

    List<FileObject> nonAccessibleFiles = data.files.getNonAccessibleFiles();
    if ( !nonAccessibleFiles.isEmpty() ) {
      String message = FileInputList.getRequiredFilesDescription( nonAccessibleFiles );
      logError( BaseMessages.getString( PKG, "LoadFileInput.Log.RequiredFilesTitle" ), BaseMessages.getString(
        PKG, "LoadFileInput.Log.RequiredNotAccessibleFiles", message ) );
      throw new KettleException( BaseMessages.getString(
        PKG, "LoadFileInput.Log.RequiredNotAccessibleFilesMissing", message ) );
    }
  }

  /**
   * Build an empty row based on the meta-data...
   *
   * @return
   */

  private Object[] buildEmptyRow() {
    return RowDataUtil.allocateRowData( data.outputRowMeta.size() );
  }

  Object[] getOneRow() throws KettleException {
    if ( !openNextFile() ) {
      return null;
    }

View on GitHub (pinned to f3058517a1)