pentaho/pentaho-kettle · error · KettleException

Unable to save step information to the repository, id_step=

Error message

Unable to save step information to the repository, id_step=<id_step>

What it means

DummyPluginMeta.saveRep writes the step's value metadata and text into repository step attributes. If any rep.saveStepAttribute call throws KettleDatabaseException (insert/update failure against the repository DB), it is rethrown as a KettleException with this message plus id_step. Note saveRep also assumes value is non-null, so an internal NPE would not produce this message.

Solutions

  1. Check the chained KettleDatabaseException/JDBC cause for the precise DB error (permissions, constraint, connectivity).
  2. Verify the repository user has write (INSERT/UPDATE) privileges on the step-attribute tables.
  3. Test repository connectivity and DB disk space; retry saving after fixing.
  4. Ensure the Dummy step's value is set (open the dialog and confirm) so saveRep has valid metadata to write.

Example fix

// before: read-only repo user
GRANT SELECT ON R_STEP_ATTRIBUTE TO pdi_user;
// after: grant write access
GRANT SELECT, INSERT, UPDATE, DELETE ON R_STEP_ATTRIBUTE TO pdi_user;
Defensive patterns

Strategy: try-catch

Validate before calling

// ensure the step has a value and the repo is writable before save
if ( meta.getValue() == null ) {
  meta.setDefault(); // supplies 123.456 Number default
}
// probe write access
rep.saveStepAttribute( id_transformation, id_step, 0, "probe_attr", "ok" );

Try / catch

try {
  meta.saveRep( rep, id_transformation, id_step );
} catch ( KettleException e ) {
  Throwable cause = e.getCause();
  if ( cause instanceof KettleDatabaseException ) {
    logError( "Repository write failed for id_step=" + id_step + ": " + cause.getMessage() );
    // retry after checking DB connectivity/permissions
  }
  throw e;
}

Prevention

When it happens

Trigger: saveRep(rep, id_transformation, id_step) failing on any of the saveStepAttribute calls: repository DB down, transaction/lock conflict, read-only repository account, attribute value exceeding column size, or DB constraint violation.

Common situations: Repository DB out of disk space or in read-only mode; saving a transformation with credentials lacking INSERT/UPDATE rights on R_STEP_ATTRIBUTE; unique-constraint collisions after concurrent saves; connection dropped mid-save.

Related errors


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

Appendix: source

Thrown at plugins/dummy/core/src/main/java/org/pentaho/di/be/ibridge/kettle/dummy/DummyPluginMeta.java:177

      }
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( "error reading step with id_step=" + id_step + " from the repository", dbe );
    } catch ( Exception e ) {
      throw new KettleException( "Unexpected error reading step with id_step=" + id_step + " from the repository", e );
    }
  }

  @Override
  public void saveRep( Repository rep, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "value_name", value.getValueMeta().getName() );
      rep.saveStepAttribute( id_transformation, id_step, 0, "value_type", value.getValueMeta().getTypeDesc() );
      rep.saveStepAttribute( id_transformation, id_step, 0, "value_text", value.getValueMeta().getString( value.getValueData() ) );
      rep.saveStepAttribute( id_transformation, id_step, 0, "value_null", value.getValueMeta().isNull( value.getValueData() ) );
      rep.saveStepAttribute( id_transformation, id_step, 0, "value_length", value.getValueMeta().getLength() );
      rep.saveStepAttribute( id_transformation, id_step, 0, "value_precision", value.getValueMeta().getPrecision() );
    } catch ( KettleDatabaseException dbe ) {
      throw new KettleException( "Unable to save step information to the repository, id_step=" + id_step, dbe );
    }
  }

  @Override
  public void check( List<CheckResultInterface> remarks, TransMeta transmeta, StepMeta stepMeta, RowMetaInterface prev, String[] input, String[] output, RowMetaInterface info ) {
    CheckResult cr;
    if ( prev == null || prev.size() == 0 ) {
      cr = new CheckResult( CheckResult.TYPE_RESULT_WARNING, "Not receiving any fields from previous steps!", stepMeta );
      remarks.add( cr );
    } else {
      cr = new CheckResult( CheckResult.TYPE_RESULT_OK, "Step is connected to previous one, receiving " + prev.size() + " fields", stepMeta );
      remarks.add( cr );
    }

    // See if we have input streams leading to this step!
    if ( input.length > 0 ) {
      cr = new CheckResult( CheckResult.TYPE_RESULT_OK, "Step is receiving info from other steps.", stepMeta );
      remarks.add( cr );

View on GitHub (pinned to f3058517a1)