{"record":{"id":"b6666558943873ac","repo":"pentaho/pentaho-kettle","slug":"unable-to-save-step-information-to-the-repository-for-idstep-b66665","errorCode":null,"errorMessage":"Unable to save step information to the repository for idStep=","messagePattern":"Unable to save step information to the repository for idStep=","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/palo/core/src/main/java/org/pentaho/di/trans/steps/palo/diminput/PaloDimInputMeta.java","lineNumber":205,"sourceCode":"    }\n  }\n\n  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId idTransformation, ObjectId idStep )\n    throws KettleException {\n    try {\n      rep.saveDatabaseMetaStepAttribute( idTransformation, idStep, \"connection\", databaseMeta );\n      rep.saveStepAttribute( idTransformation, idStep, \"dimension\", this.dimension );\n      rep.saveStepAttribute( idTransformation, idStep, \"baseElementsOnly\", this.baseElementsOnly );\n\n      for ( int i = 0; i < levels.size(); i++ ) {\n        rep.saveStepAttribute( idTransformation, idStep, i, \"levelname\", this.levels.get( i ).getLevelName() );\n        rep.saveStepAttribute( idTransformation, idStep, i, \"levelnumber\", this.levels.get( i ).getLevelNumber() );\n        rep.saveStepAttribute( idTransformation, idStep, i, \"fieldname\", this.levels.get( i ).getFieldName() );\n        rep.saveStepAttribute( idTransformation, idStep, i, \"fieldtype\", this.levels.get( i ).getFieldType() );\n      }\n\n    } catch ( Exception e ) {\n      throw new KettleException( \"Unable to save step information to the repository for idStep=\" + idStep, e );\n    }\n  }\n\n  public void check( final List<CheckResultInterface> remarks, final TransMeta transMeta, final StepMeta stepMeta,\n      final RowMetaInterface prev, final String[] input, final String[] output, final RowMetaInterface info,\n      VariableSpace space, Repository repository, IMetaStore metaStore ) {\n    CheckResult cr;\n\n    if ( databaseMeta != null ) {\n      cr = new CheckResult( CheckResultInterface.TYPE_RESULT_OK, \"Connection exists\", stepMeta );\n      remarks.add( cr );\n\n      final PaloHelper helper = new PaloHelper( databaseMeta, DefaultLogLevel.getLogLevel() );\n      try {\n        helper.connect();\n        cr = new CheckResult( CheckResultInterface.TYPE_RESULT_OK, \"Connection to database OK\", stepMeta );\n        remarks.add( cr );\n","sourceCodeStart":187,"sourceCodeEnd":223,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/palo/core/src/main/java/org/pentaho/di/trans/steps/palo/diminput/PaloDimInputMeta.java#L187-L223","documentation":"KettleException thrown by PaloDimInputMeta.saveRep when persisting the step's level definitions to the Pentaho Repository fails. All saveStepAttribute writes (connection, dimension, per-level levelname/levelnumber/fieldname/fieldtype) happen in one try block; any repository write error is wrapped with the idStep in the message.","triggerScenarios":"Saving the transformation to the repository while the repository DB is unreachable, the user lacks write permission, or an individual saveStepAttribute call for a level attribute throws.","commonSituations":"Repository database read-only or full; network interruption during save; insufficient DB privileges on R_STEP_ATTRIBUTE; concurrent edits causing lock conflicts.","solutions":["Read the cause in the log; restore repository connectivity/permissions and re-save.","Grant the repository user INSERT/UPDATE rights on R_STEP_ATTRIBUTE.","Retry the save after resolving lock/deadlock conflicts from concurrent editing.","Save locally as .ktr as a workaround, then import to the repository once it is healthy."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// Ensure repository is writable before save\nif (rep.getConnection().isReadOnly()) {\n  throw new IllegalStateException(\"Repository connection is read-only\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  transMeta.saveRep(rep, metaStore, idTransformation);\n} catch (KettleException e) {\n  log.error(\"diminput save failed: \" + e.getCause(), e);\n  transMeta.saveXml(localBackup, null); // fallback local save\n}","preventionTips":["Grant write rights on R_STEP_ATTRIBUTE to the repository user","Watch repository DB space and read-only mode","Serialize saves of shared transformations","Keep a local .ktr copy as fallback"],"tags":["repository","persistence","write","palo"],"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"}