{"record":{"id":"17320da7fcb59492","repo":"pentaho/pentaho-kettle","slug":"unable-to-save-step-information-to-the-repository-for-id-17320d","errorCode":null,"errorMessage":"Unable to save step information to the repository for id_step={id_step}","messagePattern":"Unable to save step information to the repository for id_step=(.+?)","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/textfileinput/TextFileInputMeta.java","lineNumber":1582,"sourceCode":"      rep.saveStepAttribute( id_transformation, id_step, \"error_line_files_ext\", errorFilesExtension );\n      rep.saveStepAttribute(\n        id_transformation, id_step, \"line_number_files_dest_dir\", lineNumberFilesDestinationDirectory );\n      rep.saveStepAttribute( id_transformation, id_step, \"line_number_files_ext\", lineNumberFilesExtension );\n\n      rep.saveStepAttribute( id_transformation, id_step, \"date_format_lenient\", dateFormatLenient );\n      rep.saveStepAttribute( id_transformation, id_step, \"date_format_locale\", dateFormatLocale.toString() );\n\n      rep.saveStepAttribute( id_transformation, id_step, \"shortFileFieldName\", shortFileFieldName );\n      rep.saveStepAttribute( id_transformation, id_step, \"pathFieldName\", pathFieldName );\n      rep.saveStepAttribute( id_transformation, id_step, \"hiddenFieldName\", hiddenFieldName );\n      rep.saveStepAttribute(\n        id_transformation, id_step, \"lastModificationTimeFieldName\", lastModificationTimeFieldName );\n      rep.saveStepAttribute( id_transformation, id_step, \"uriNameFieldName\", uriNameFieldName );\n      rep.saveStepAttribute( id_transformation, id_step, \"rootUriNameFieldName\", rootUriNameFieldName );\n      rep.saveStepAttribute( id_transformation, id_step, \"extensionFieldName\", extensionFieldName );\n      rep.saveStepAttribute( id_transformation, id_step, \"sizeFieldName\", sizeFieldName );\n    } catch ( Exception e ) {\n      throw new KettleException( \"Unable to save step information to the repository for id_step=\" + id_step, e );\n    }\n  }\n\n  @Override\n  public String[] getFilePaths( Bowl bowl, VariableSpace space ) {\n    return FileInputList.createFilePathList(\n      bowl, space, fileName, fileMask, excludeFileMask, fileRequired, includeSubFolderBoolean() );\n  }\n\n  public FileInputList getTextFileList( Bowl bowl, VariableSpace space ) {\n    return FileInputList.createFileList(\n      bowl, space, fileName, fileMask, excludeFileMask, fileRequired, includeSubFolderBoolean() );\n  }\n\n  private boolean[] includeSubFolderBoolean() {\n    int len = fileName.length;\n    boolean[] includeSubFolderBoolean = new boolean[len];\n    for ( int i = 0; i < len; i++ ) {","sourceCodeStart":1564,"sourceCodeEnd":1600,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/textfileinput/TextFileInputMeta.java#L1564-L1600","documentation":"This KettleException wraps any exception raised while persisting the TextFileInput step's metadata (field name attributes like uriNameFieldName, sizeFieldName, etc.) to the Kettle repository via saveStepAttribute calls. It is a generic repository-save wrapper: the root cause is in the underlying repository connection or schema, preserved as the cause. The step definition cannot be saved until the repository issue is resolved.","triggerScenarios":"Calling saveRep() on TextFileInputMeta when the repository is unreachable, the repository schema/tables are missing or outdated (e.g. after a Kettle version upgrade without running the upgrade SQL), or a saveStepAttribute call fails on null/oversized attribute values.","commonSituations":"Database repository (RDBMS) down or credentials expired after DB maintenance; repository tables not upgraded after a Pentaho Data Integration upgrade; file-based repository corrupted or read-only filesystem; network partition between PDI server and repository database.","solutions":["Check the chained cause exception (e.getCause()) to find the actual repository failure","Verify the repository database is reachable and credentials are valid in the Kettle connection","Run the repository upgrade scripts so all step-attribute tables exist for your PDI version","Retry saving the transformation; if transient DB connectivity caused it, reconnect and re-save"],"exampleFix":"// before\nmeta.saveRep( rep, transMeta.getRepositoryDirectory(), transMeta.getObjectId(), transMeta.getTransformationID() ); // fails silently at DB level\n// after\ntry {\n  meta.saveRep( rep, transMeta.getRepositoryDirectory(), transMeta.getObjectId(), transMeta.getTransformationID() );\n} catch ( KettleException e ) {\n  logError( \"Repository save failed, cause: \" + e.getCause(), e ); // inspect real cause\n  throw e;\n}","handlingStrategy":"try-catch","validationCode":"// before saving\nif ( !rep.isConnected() && !rep.connect() ) {\n  throw new IllegalStateException( \"Repository not connected\" );\n}\nif ( rep.getDatabaseMeta() != null && !rep.getDatabaseMeta().testConnection().isSuccess() ) {\n  throw new IllegalStateException( \"Repository DB unreachable: \" + rep.getDatabaseMeta().testConnection().getMessage() );\n}","typeGuard":null,"tryCatchPattern":"try {\n  meta.saveRep( rep, dir, transId, stepId );\n} catch ( KettleException e ) {\n  Throwable cause = e.getCause();\n  logError( \"Repo save failed: \" + ( cause != null ? cause.getMessage() : e.getMessage() ), e );\n  // retry on transient SQLException / connection timeouts\n}","preventionTips":["Always inspect getCause() — the wrapper hides the real repository error","Keep the repository schema upgraded to match your PDI version","Monitor repository DB connectivity before batch save operations"],"tags":["repository","database","persistence","kettle"],"backgroundTag":"database-write-failed","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"}