pentaho/pentaho-kettle · error · KettleException

Unable to save step information to the repository for…

Error message

Unable to save step information to the repository for idStep=

What it means

PaloDimOutputMeta.saveRep persists level attributes via rep.saveStepAttribute(...). Any exception is wrapped as 'Unable to save step information to the repository for idStep=' + idStep, so changes to the step cannot be saved to the repository.

Solutions

  1. Check the wrapped cause for the underlying SQL/repository error
  2. Verify repository connectivity and that the user has write permissions
  3. Retry saving; if a specific attribute is too large, shorten level/field metadata
  4. Save the transformation locally as a KTR while the repository is unavailable

Example fix

// before
rep.saveStepAttribute(id, idStep, i, "fieldname", veryLongName); // exceeds column length
// after
rep.saveStepAttribute(id, idStep, i, "fieldname", shortenedName); // within DB column limit
Defensive patterns

Strategy: try-catch

Validate before calling

// check write access before saving
if (!rep.getConnection().isReadOnly()) { saveStep(); }

Try / catch

try { meta.saveRep(rep, metaStore, transId, stepId); } catch (KettleException e) {
  logError("Repository save failed: " + e.getCause(), e);
  saveLocally(); // fallback
}

Prevention

When it happens

Trigger: Repository write fails while saving step attributes: repository connection dropped, read-only repository/permissions, storage quota, or DB constraint violation on the step attribute table.

Common situations: Repository DB restarted mid-save; user lacks write permission on the repository; saving a very large number of levels exceeding a column limit; repository in read-only/maintenance mode.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/a024d7c9664a4d9c. Report an issue: GitHub.

Appendix: source

Thrown at plugins/palo/core/src/main/java/org/pentaho/di/trans/steps/palo/dimoutput/PaloDimOutputMeta.java:236

      rep.saveStepAttribute( idTransformation, idStep, "elementtype", this.elementType );
      rep.saveStepAttribute( idTransformation, idStep, "createdimension", this.createNewDimension );
      rep.saveStepAttribute( idTransformation, idStep, "cleardimension", this.clearDimension );
      rep.saveStepAttribute( idTransformation, idStep, "clearconsolidations", this.clearConsolidations );
      rep.saveStepAttribute( idTransformation, idStep, "recreatedimension", this.recreateDimension );
      rep.saveStepAttribute( idTransformation, idStep, "enableElementCache", this.enableElementCache );
      rep.saveStepAttribute( idTransformation, idStep, "preloadElementCache", this.preloadElementCache );

      for ( int i = 0; i < levels.size(); i++ ) {
        rep.saveStepAttribute( idTransformation, idStep, i, "levelname", this.levels.get( i ).getLevelName() );
        rep.saveStepAttribute( idTransformation, idStep, i, "levelnumber", this.levels.get( i ).getLevelNumber() );
        rep.saveStepAttribute( idTransformation, idStep, i, "fieldname", this.levels.get( i ).getFieldName() );
        rep.saveStepAttribute( idTransformation, idStep, i, "fieldtype", this.levels.get( i ).getFieldType() );
        rep.saveStepAttribute( idTransformation, idStep, i, "consolidationfieldname", this.levels.get( i )
            .getConsolidationFieldName() );
      }

    } catch ( Exception e ) {
      throw new KettleException( "Unable to save step information to the repository for idStep=" + idStep, e );
    }
  }

  public final void check( final List<CheckResultInterface> remarks, final TransMeta transMeta,
      final StepMeta stepMeta, final RowMetaInterface prev, final String[] input, final String[] output,
      final RowMetaInterface info, VariableSpace space, Repository repository, IMetaStore metaStore ) {

    CheckResult cr;

    if ( databaseMeta != null ) {
      cr = new CheckResult( CheckResultInterface.TYPE_RESULT_OK, "Connection exists", stepMeta );
      remarks.add( cr );

      final PaloHelper helper = new PaloHelper( databaseMeta, DefaultLogLevel.getLogLevel() );
      try {
        helper.connect();
        cr = new CheckResult( CheckResultInterface.TYPE_RESULT_OK, "Connection to database OK", stepMeta );
        remarks.add( cr );

View on GitHub (pinned to f3058517a1)