pentaho/pentaho-kettle · error · KettleException

Unable to save step information to the repository

Error message

Unable to save step information to the repository

What it means

UniqueRowsByHashSetMeta.saveRep writes the step's settings (reject_duplicate_row, error_description and each compare field_name) to the repository. A KettleException from the repository is rethrown wrapped with this message, meaning the step configuration could not be persisted.

Solutions

  1. Inspect the cause exception and repository logs for the DB error
  2. Confirm the repository user can write to the step attribute tables
  3. Retry after restoring the repository connection
  4. Save the transformation to file as a workaround
Defensive patterns

Strategy: try-catch

Validate before calling

// Java: confirm write access before saving step attributes
if ( !repository.isConnected() ) {
  throw new IllegalStateException( "Repository not connected before saveRep" );
}

Try / catch

try {
  meta.saveRep( repository, metaStore, idTransformation, idStep );
} catch ( KettleException e ) {
  logError( "Repository save of UniqueRowsByHashSet step failed: " + e.getCause(), e );
  // reconnect and retry, or save to file
}

Prevention

When it happens

Trigger: saveRep (public) fails while saving attributes — repository write error, lost connection, or constraint violation while iterating compareFields.

Common situations: Repository database read-only or down; insufficient repository user permissions; large field lists hitting database limits.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/uniquerowsbyhashset/UniqueRowsByHashSetMeta.java:214

      for ( int i = 0; i < nrfields; i++ ) {
        compareFields[i] = rep.getStepAttributeString( id_step, i, "field_name" );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "UniqueRowsByHashSetMeta.Exception.UnexpectedErrorReadingStepInfo" ), e );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "store_values", storeValues );
      rep.saveStepAttribute( id_transformation, id_step, "reject_duplicate_row", rejectDuplicateRow );
      rep.saveStepAttribute( id_transformation, id_step, "error_description", errorDescription );
      for ( int i = 0; i < compareFields.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "field_name", compareFields[i] );
      }
    } catch ( KettleException e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "UniqueRowsByHashSetMeta.Exception.UnableToSaveStepInfo" ), 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;

    if ( input.length > 0 ) {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
          PKG, "UniqueRowsByHashSetMeta.CheckResult.StepReceivingInfoFromOtherSteps" ), stepMeta );
      remarks.add( cr );
    } else {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_ERROR, BaseMessages.getString(
          PKG, "UniqueRowsByHashSetMeta.CheckResult.NoInputReceivedFromOtherSteps" ), stepMeta );

View on GitHub (pinned to f3058517a1)