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

KettleException thrown by PaloCellOutputMeta.saveRep when saving the step's attributes to the Pentaho Repository fails. All saveStepAttribute calls (connection, dimensions, measure field) are inside one try block; any repository write error is wrapped with the step id appended to the message.

Solutions

  1. Check the wrapped cause: fix repository DB connectivity, permissions, or disk space and re-save the transformation.
  2. Confirm the repository user has INSERT/UPDATE rights on R_STEP_ATTRIBUTE.
  3. Retry the save; if deadlocks occur, avoid concurrent edits of the same transformation.
  4. Fall back to saving the transformation as a local .ktr file, then import it into the repository later.
Defensive patterns

Strategy: try-catch

Validate before calling

// Pre-check write access
if (!rep.getConnection().isReadOnly()) { /* proceed with save */ }

Try / catch

try {
  transMeta.saveRep(rep, metaStore, idTransformation);
} catch (KettleException e) {
  log.error("Save failed: " + e.getCause(), e);
  // fall back to local file save
  transMeta.saveXml(localPath, null);
}

Prevention

When it happens

Trigger: Saving a transformation to the repository while the database connection is down, the transaction fails, or a saveStepAttribute write for 'connection', 'dimensionname', 'fieldname', 'fieldtype', or measure attributes throws.

Common situations: Repository database read-only or out of space; network drop between Spoon and repository DB mid-save; repository permissions insufficient for INSERT/UPDATE on R_STEP_ATTRIBUTE; deadlock on concurrent saves.

Related errors


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

Appendix: source

Thrown at plugins/palo/core/src/main/java/org/pentaho/di/trans/steps/palo/celloutput/PaloCellOutputMeta.java:281

      rep.saveStepAttribute( idTransformation, idStep, "updateMode", this.updateMode );
      rep.saveStepAttribute( idTransformation, idStep, "splashMode", this.splashMode );
      rep.saveStepAttribute( idTransformation, idStep, "clearcube", this.clearCube );
      rep.saveStepAttribute( idTransformation, idStep, "preloadDimensionCache", this.preloadDimensionCache );
      rep.saveStepAttribute( idTransformation, idStep, "enableDimensionCache", this.enableDimensionCache );
      rep.saveStepAttribute( idTransformation, idStep, "commitSize", this.commitSize );

      rep.saveStepAttribute( idTransformation, idStep, "measurename", this.measureField.getDimensionName() );
      rep.saveStepAttribute( idTransformation, idStep, "measurefieldname", this.measureField.getFieldName() );
      rep.saveStepAttribute( idTransformation, idStep, "measurefieldtype", this.measureField.getFieldType() );

      for ( int i = 0; i < this.fields.size(); i++ ) {
        rep.saveStepAttribute( idTransformation, idStep, i, "dimensionname", this.fields.get( i ).getDimensionName() );
        rep.saveStepAttribute( idTransformation, idStep, i, "fieldname", this.fields.get( i ).getFieldName() );
        rep.saveStepAttribute( idTransformation, idStep, i, "fieldtype", this.fields.get( i ).getFieldType() );
      }

    } 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 );

View on GitHub (pinned to f3058517a1)