pentaho/pentaho-kettle · error · KettleException

FilterRowsMeta.Exception.UnableToSaveStepInfoToRepository

FilterRowsMeta.Exception.UnableToSaveStepInfoToRepository

Error message

FilterRowsMeta.Exception.UnableToSaveStepInfoToRepository

What it means

FilterRowsMeta.saveRep wraps any exception raised while persisting the step's attributes (condition, send_true_to, send_false_to) to the repository in a KettleException with this message key, appending the id_step. It means the step definition could not be saved; the cause is chained.

Solutions

  1. Check the chained cause for the underlying repository write error (connection, permissions, disk)
  2. Verify the repository is writable and the user has INSERT/UPDATE rights on repository tables
  3. Reconnect to the repository and re-save the transformation
  4. If a condition cannot be serialized, clear/recreate the filter condition in the dialog and save again

Example fix

// before
rep.saveConditionStepAttribute( id_transformation, id_step, "id_condition", null ); // NPE wrapped in saveRep
// after
if ( getCondition() != null ) {
  rep.saveConditionStepAttribute( id_transformation, id_step, "id_condition", getCondition() );
}
Defensive patterns

Strategy: try-catch

Validate before calling

// before saving
if ( !rep.isConnected() || rep.isReadOnly() ) { throw new IllegalStateException( "Repository not writable" ); }

Try / catch

try {
  transMeta.saveRep( rep, metaStore, "my transformation" );
} catch ( KettleException e ) {
  logError( "Save failed for step " + e.getMessage() + ": " + e.getCause(), e );
  // fall back to local .ktr export
}

Prevention

When it happens

Trigger: Calling saveRep on a FilterRowsMeta when saveConditionStepAttribute or saveStepAttribute throws — repository write failure, lost connection, constraint violation, or insufficient repository permissions during transformation save.

Common situations: Database repository disk full or connection dropped mid-save; missing INSERT privileges on repository tables; saving to a read-only repository; concurrent edits causing key conflicts.

Understand the failure class

Background: "failed to write file", "Could not save figure", "Error saving remote file" — file write failed: causes and fixes across languages and libraries — this error's family across 38 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/filterrows/FilterRowsMeta.java:227

  }

  @Override
  public void searchInfoAndTargetSteps( List<StepMeta> steps ) {
    List<StreamInterface> targetStreams = getStepIOMeta().getTargetStreams();
    for ( StreamInterface stream : targetStreams ) {
      stream.setStepMeta( StepMeta.findStep( steps, (String) stream.getSubject() ) );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    try {
      if ( condition != null ) {
        rep.saveConditionStepAttribute( id_transformation, id_step, "id_condition", condition );
        rep.saveStepAttribute( id_transformation, id_step, "send_true_to", getTrueStepname() );
        rep.saveStepAttribute( id_transformation, id_step, "send_false_to", getFalseStepname() );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "FilterRowsMeta.Exception.UnableToSaveStepInfoToRepository" )
        + id_step, e );
    }
  }

  @Override
  public void getFields( Bowl bowl, RowMetaInterface rowMeta, String origin, RowMetaInterface[] info, StepMeta nextStep,
    VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {
    // Clear the sortedDescending flag on fields used within the condition - otherwise the comparisons will be
    // inverted!!
    String[] conditionField = condition.getUsedFields();
    for ( int i = 0; i < conditionField.length; i++ ) {
      int idx = rowMeta.indexOfValue( conditionField[i] );
      if ( idx >= 0 ) {
        ValueMetaInterface valueMeta = rowMeta.getValueMeta( idx );
        valueMeta.setSortedDescending( false );
      }
    }

View on GitHub (pinned to f3058517a1)