pentaho/pentaho-kettle · error · KettleException

UpdateMeta.Exception.UnableToSaveStepInfoToRepository

Error message

UpdateMeta.Exception.UnableToSaveStepInfoToRepository

What it means

UpdateMeta.saveRep failed while persisting the Update step's settings to the repository; any Exception is wrapped in a KettleException with the UnableToSaveStepInfoToRepository message (the step id is appended).

Solutions

  1. Check the chained cause for the underlying repository SQL error
  2. Verify repository connection and that the user has write privileges on repository tables
  3. Retry saving after resolving connectivity; alternatively export the transformation to XML as a workaround
  4. Check repository table constraints and repair corrupted repository rows

Example fix

// before
user: pdi_read (read-only)
// after
user: pdi_admin (INSERT/UPDATE on r_step_attribute)
Defensive patterns

Strategy: try-catch

Validate before calling

// Before save, check write access: repository.testConnection() and user INSERT/UPDATE grants on repository tables

Try / catch

try { transMeta.saveRep(repository, metaStore, id_transformation, id_step); } catch (KettleException e) { log.error("Save failed for step " + id_step + ": " + e.getCause(), e); }

Prevention

When it happens

Trigger: saveRep -> rep.saveStepAttribute/insertStepDatabase throws (connection loss, constraint violation, insufficient privileges) while saving a transformation.

Common situations: Database repository locked or offline; user lacks INSERT/UPDATE rights on repository tables; duplicate/constraint violations in repository tables.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/update/UpdateMeta.java:566

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

      // 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, "UpdateMeta.Exception.UnableToSaveStepInfoToRepository" )
        + id_step, e );
    }
  }

  @Override
  public void getFields( Bowl bowl, RowMetaInterface row, String name, RowMetaInterface[] info, StepMeta nextStep,
    VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {
    if ( ignoreFlagField != null && ignoreFlagField.length() > 0 ) {
      ValueMetaInterface v = new ValueMetaBoolean( ignoreFlagField );
      v.setOrigin( name );

      row.addValueMeta( v );
    }
  }

  @Override
  public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepMeta,

View on GitHub (pinned to f3058517a1)