pentaho/pentaho-kettle · error · KettleException

SynchronizeAfterMergeMeta.Exception.UnableToSaveStepInfoToRe…

Error message

SynchronizeAfterMergeMeta.Exception.UnableToSaveStepInfoToRepository

What it means

SynchronizeAfterMergeMeta.saveRep() failed while persisting the step's settings to the repository (KettleException 'Unable to save step info to repository' + id_step). Any exception during attribute writes or insertStepDatabase is wrapped and rethrown, leaving the transformation partially saved.

Solutions

  1. Verify the repository user has INSERT/UPDATE privileges on the repository tables
  2. Check repository DB connectivity and retry the save
  3. Inspect the 'Caused by' exception to identify the failing SQL statement
  4. Free space / unlock the repository database if it is read-only or out of quota

Example fix

// before: user lacks privilege -> save fails
GRANT INSERT, UPDATE, DELETE ON R_STEP_ATTRIBUTE TO pdi_user;
// then retry saving the transformation in Spoon
Defensive patterns

Strategy: try-catch

Validate before calling

// before saveRep
if (!repository.isConnected()) throw new IllegalStateException("Repository not connected");
// verify write access
repository.getCountStepAttribute(id_step, "value_name", 0); // probe read; ensure user has write grants via DB check

Try / catch

try { stepMeta.saveRep(repository, metaStore, idTrans, idStep); }
catch (KettleException e) { log.error("Repository save failed for step " + idStep + " — check grants/connection: " + e.getMessage(), e.getCause()); throw e; }

Prevention

When it happens

Trigger: Repository insert fails while saving the step: DB connection lost, insufficient write permission, constraint violation, or database read-only mode during save of a transformation containing this step.

Common situations: Repository DB credentials lacking INSERT privileges; repository database in read-only/locked state; storage quota or connectivity failure on the repository server.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/synchronizeaftermerge/SynchronizeAfterMergeMeta.java:630

      for ( int i = 0; i < keyStream.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "key_name", keyStream[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "key_field", keyLookup[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "key_condition", keyCondition[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "key_name2", keyStream2[i] );
      }

      for ( int i = 0; i < updateLookup.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "value_name", updateLookup[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "value_rename", updateStream[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "value_update", update[i].booleanValue() );
      }

      // Also, save the step-database relationship!
      if ( databaseMeta != null ) {
        rep.insertStepDatabase( id_transformation, id_step, databaseMeta.getObjectId() );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "SynchronizeAfterMergeMeta.Exception.UnableToSaveStepInfoToRepository" )
        + id_step, e );
    }
  }

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

    if ( databaseMeta != null ) {
      Database db = new Database( loggingObject, databaseMeta );
      db.shareVariablesWith( transMeta );
      try {
        db.connect();

        if ( !Utils.isEmpty( tableName ) ) {

View on GitHub (pinned to f3058517a1)