pentaho/pentaho-kettle · error · KettleException

PropertyInput.Log.RequiredFilesMissing

Error message

PropertyInput.Log.RequiredFilesMissing

What it means

Message key PropertyInput.Log.RequiredFilesMissing raised in handleMissingFiles (called from processRow): one or more files marked as required in the file list do not exist; the message includes a description of the missing files and the step refuses to run with an incomplete input set.

Solutions

  1. Create or restore the missing files at the configured paths before running
  2. Fix the filenames/paths in the step dialog to match the actual files
  3. Ensure the upstream process that generates the files completes first (dependency ordering)
  4. If missing files are acceptable, uncheck 'Fail on missing files'/enable 'Ignore missing files' in the step settings

Example fix

// before: fail on absent file
// /data/app.properties does not exist -> KettleException
// after: check existence first in a prior step
// use 'Check if file exists' (FileExists) step or Job entry:
if (new java.io.File("/data/app.properties").exists()) { runTransform(); } else { logError("file missing"); }
Defensive patterns

Strategy: validation

Validate before calling

for (String name : meta.getFilePaths(transMeta.getBowl(), null)) {
  if (!new java.io.File(name).exists()) {
    logError("Missing required file: " + name);
  }
}

Type guard

java.util.List<FileObject> missing = files.getNonExistantFiles();
boolean allPresent = missing.isEmpty();

Try / catch

try {
  transformation.execute(params);
} catch (KettleException e) {
  if (e.getMessage() != null && e.getMessage().contains("missing")) {
    // alert upstream producer / retry later
  } else { throw e; }
}

Prevention

When it happens

Trigger: Files configured in the step (or matched by wildcard) that are absent on disk/VFS at execution time, discovered when processRow calls handleMissingFiles after the file list is built.

Common situations: Files deleted or moved between designing and running the transformation; wrong environment (dev vs prod paths); scheduled job runs before upstream file generation finishes; typo in path.

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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/propertyinput/PropertyInput.java:121

      } else {
        logError( BaseMessages.getString( PKG, "PropertyInput.ErrorInStepRunning", e.getMessage() ) );
        setErrors( 1 );
        stopAll();
        setOutputDone(); // signal end to receiver(s)
        return false;
      }
    }
    return true;
  }

  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() ) ) ) {

View on GitHub (pinned to f3058517a1)