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 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.

Solutions

  1. Read the cause in the log; restore repository connectivity/permissions and re-save.
  2. Grant the repository user INSERT/UPDATE rights on R_STEP_ATTRIBUTE.
  3. Retry the save after resolving lock/deadlock conflicts from concurrent editing.
  4. Save locally as .ktr as a workaround, then import to the repository once it is healthy.
Defensive patterns

Strategy: try-catch

Validate before calling

// Ensure repository is writable before save
if (rep.getConnection().isReadOnly()) {
  throw new IllegalStateException("Repository connection is read-only");
}

Try / catch

try {
  transMeta.saveRep(rep, metaStore, idTransformation);
} catch (KettleException e) {
  log.error("diminput save failed: " + e.getCause(), e);
  transMeta.saveXml(localBackup, null); // fallback local save
}

Prevention

When it happens

Trigger: 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.

Common situations: Repository database read-only or full; network interruption during save; insufficient DB privileges on R_STEP_ATTRIBUTE; concurrent edits causing lock conflicts.

Related errors


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

Appendix: source

Thrown at plugins/palo/core/src/main/java/org/pentaho/di/trans/steps/palo/diminput/PaloDimInputMeta.java:205

    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId idTransformation, ObjectId idStep )
    throws KettleException {
    try {
      rep.saveDatabaseMetaStepAttribute( idTransformation, idStep, "connection", databaseMeta );
      rep.saveStepAttribute( idTransformation, idStep, "dimension", this.dimension );
      rep.saveStepAttribute( idTransformation, idStep, "baseElementsOnly", this.baseElementsOnly );

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

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

  public 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)