{"record":{"id":"288d43e3da50a227","repo":"pentaho/pentaho-kettle","slug":"propertyinput-log-requirednotaccessiblefilesmissing","errorCode":null,"errorMessage":"PropertyInput.Log.RequiredNotAccessibleFilesMissing","messagePattern":"PropertyInput\\.Log\\.RequiredNotAccessibleFilesMissing","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/propertyinput/PropertyInput.java","lineNumber":130,"sourceCode":"  }\n\n  private void handleMissingFiles() throws KettleException {\n    List<FileObject> nonExistantFiles = data.files.getNonExistantFiles();\n    if ( !nonExistantFiles.isEmpty() ) {\n      String message = FileInputList.getRequiredFilesDescription( nonExistantFiles );\n      logError( BaseMessages.getString( PKG, \"PropertyInput.Log.RequiredFilesTitle\" ), BaseMessages.getString(\n        PKG, \"PropertyInput.Log.RequiredFiles\", message ) );\n\n      throw new KettleException( BaseMessages.getString( PKG, \"PropertyInput.Log.RequiredFilesMissing\", message ) );\n    }\n\n    List<FileObject> nonAccessibleFiles = data.files.getNonAccessibleFiles();\n    if ( !nonAccessibleFiles.isEmpty() ) {\n      String message = FileInputList.getRequiredFilesDescription( nonAccessibleFiles );\n      logError( BaseMessages.getString( PKG, \"PropertyInput.Log.RequiredFilesTitle\" ), BaseMessages.getString(\n        PKG, \"PropertyInput.Log.RequiredNotAccessibleFiles\", message ) );\n\n      throw new KettleException( BaseMessages.getString(\n        PKG, \"PropertyInput.Log.RequiredNotAccessibleFilesMissing\", message ) );\n    }\n  }\n\n  private Object[] getOneRow() throws KettleException {\n    try {\n      if ( meta.isFileField() ) {\n        while ( ( data.readrow == null )\n          || ( ( data.propfiles && !data.propIt.hasNext() ) || ( !data.propfiles && !data.iniIt.hasNext() ) ) ) {\n\n          // In case we read all sections\n          // maybe we have to change section for ini files...\n          if ( !data.propfiles && data.realSection == null && data.readrow != null && data.iniSectionIt.hasNext() ) {\n            data.currentSection = data.iniSectionIt.next();\n            data.iniSection = data.iniConf.getSection( data.currentSection );\n            data.iniIt = data.iniSection.getKeys();\n          } else {\n            if ( !openNextFile() ) {","sourceCodeStart":112,"sourceCodeEnd":148,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/propertyinput/PropertyInput.java#L112-L148","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Grant read permission on the files to the user running PDI","Verify no other process holds an exclusive lock on the files","Check VFS/SFTP credentials and mount availability for remote paths","Retry after the producing process finishes writing (or use a job wait/check step)","Point the step at a copy of the files in an accessible location"],"exampleFix":"// before: unreadable file\n// chmod 600 /data/app.properties owned by another user\n// after: make readable for the PDI user\n// shell: chmod 644 /data/app.properties\n// or run transformation as a user with read access","handlingStrategy":"validation","validationCode":"for (FileObject f : files.getFiles()) {\n  if (f.exists() && !f.isReadable()) {\n    logError(\"File not accessible: \" + f.getName());\n  }\n}","typeGuard":"boolean allAccessible = files.getNonAccessibleFiles().isEmpty();","tryCatchPattern":"try {\n  transformation.execute(params);\n} catch (KettleException e) {\n  if (e.getMessage() != null && e.getMessage().contains(\"access\")) {\n    logError(\"Check permissions/locks on configured files\");\n  } else { throw e; }\n}","preventionTips":["Run PDI under an account with read access to all input directories","Wait for producers to finish writing (avoid reading in-flight files)","Validate remote share/SFTP credentials before the run","Test the exact paths as the service user, not your interactive user"],"tags":["kettle","file-input","permissions"],"backgroundTag":"permission-denied","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}