{"record":{"id":"00e41cce50d72623","repo":"pentaho/pentaho-kettle","slug":"appendmeta-exception-unabletosavestepinfo","errorCode":null,"errorMessage":"AppendMeta.Exception.UnableToSaveStepInfo","messagePattern":"AppendMeta\\.Exception\\.UnableToSaveStepInfo","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/append/AppendMeta.java","lineNumber":128,"sourceCode":"      StreamInterface headStream = infoStreams.get( 0 );\n      StreamInterface tailStream = infoStreams.get( 1 );\n      headStream.setSubject( rep.getStepAttributeString( id_step, \"head_name\" ) );\n      tailStream.setSubject( rep.getStepAttributeString( id_step, \"tail_name\" ) );\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString(\n        PKG, \"AppendMeta.Exception.UnexpectedErrorReadingStepInfo\" ), e );\n    }\n  }\n\n  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {\n    try {\n      List<StreamInterface> infoStreams = getStepIOMeta().getInfoStreams();\n      StreamInterface headStream = infoStreams.get( 0 );\n      StreamInterface tailStream = infoStreams.get( 1 );\n      rep.saveStepAttribute( id_transformation, id_step, \"head_name\", headStream.getStepname() );\n      rep.saveStepAttribute( id_transformation, id_step, \"tail_name\", tailStream.getStepname() );\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"AppendMeta.Exception.UnableToSaveStepInfo\" )\n        + id_step, e );\n    }\n  }\n\n  @Override\n  public void searchInfoAndTargetSteps( List<StepMeta> steps ) {\n    StepIOMetaInterface ioMeta = getStepIOMeta();\n    List<StreamInterface> infoStreams = ioMeta.getInfoStreams();\n    for ( StreamInterface stream : infoStreams ) {\n      stream.setStepMeta( StepMeta.findStep( steps, (String) stream.getSubject() ) );\n    }\n  }\n\n  public boolean chosesTargetSteps() {\n    return false;\n  }\n\n  public String[] getTargetSteps() {","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/append/AppendMeta.java#L110-L146","documentation":"AppendMeta.saveRep throws KettleException wrapping 'AppendMeta.Exception.UnableToSaveStepInfo' (with id_step appended) when saving head_name/tail_name step attributes to the repository fails. The message concatenates id_step directly after the localized text. It indicates a repository write failure while persisting the transformation.","triggerScenarios":"Calling saveRep (via saving a transformation) when rep.saveStepAttribute throws: DB down, read-only repository user, constraint violation, or missing head/tail stream subjects.","commonSituations":"Repository database out of space or locked; user lacking INSERT/UPDATE rights on r_step_attribute; saving after disconnecting the repository session.","solutions":["Check the repository database is reachable and writable.","Ensure the repository user has INSERT/UPDATE permission on r_step_attribute.","Reconnect the repository in Spoon and re-save the transformation.","Verify the Append step's head and tail hops are defined before saving."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// Pre-check write access before saving\ntry (Connection c = repoConnection) {\n  DatabaseMetaData md = c.getMetaData();\n  boolean canWrite = !md.isReadOnly();\n  if (!canWrite) throw new IllegalStateException(\"Repository is read-only\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  transMeta.saveRep(rep, metaStore, transName, transObjectId);\n} catch (KettleException e) {\n  logError(\"Save failed for step \" + e.getMessage(), e);\n  // check DB connectivity/permissions, then retry save\n}","preventionTips":["Grant the repository user INSERT/UPDATE on r_step_attribute.","Save transformations with an active, verified repository connection.","Monitor repository DB for disk space and lock issues."],"tags":["kettle","repository","metadata-save","database"],"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"}