pentaho/pentaho-kettle · error · KettleException

StreamLookupMeta.Exception.UnableToSaveStepInfoToRepository

Error message

StreamLookupMeta.Exception.UnableToSaveStepInfoToRepository

What it means

StreamLookupMeta throws this KettleException in saveRep() when persisting the step's settings to the repository fails unexpectedly. The message has the step's ObjectId appended. It wraps the underlying exception, so the real cause (write failure, constraint violation, connection loss) is in the cause chain.

Solutions

  1. Check the wrapped cause for the true repository write error
  2. Reconnect to the repository and retry the save
  3. Verify id_transformation and id_step still exist in the repository
  4. Save the transformation to XML/file as a workaround, then re-import

Example fix

// before
throw new KettleException(BaseMessages.getString(PKG, "StreamLookupMeta.Exception.UnableToSaveStepInfoToRepository") + id_step, e);
// after
// ensure repository connection is open and transaction committed:
repository.connect(login, password); // then retry saveRep
Defensive patterns

Strategy: try-catch

Validate before calling

// before save
if (!repository.isConnected()) repository.connect(user, pass);
if (idTransformation == null || idStep == null) throw new IllegalArgumentException("ids required");
// null-check field arrays
if (meta.getValue() == null || meta.getValueName() == null) meta.setDefault();

Type guard

boolean canSave(StepMetaInterface meta) {
  return meta != null && meta instanceof StreamLookupMeta
    && ((StreamLookupMeta) meta).getKeyField() != null;
}

Try / catch

try {
  meta.saveRep(repository, metaStore, idTransformation, idStep);
} catch (KettleException e) {
  logError("Save failed for step " + idStep + ": " + e.getCause(), e);
  // fallback: export to XML
  meta.saveXML(); // or save the whole trans to file
}

Prevention

When it happens

Trigger: Calling saveRep() when any rep.saveStepAttribute(...) call throws — repository write failure, disconnected session, invalid id_transformation/id_step, or null field arrays causing unexpected exceptions.

Common situations: Repository database down or read-only during save; transformation partially deleted while saving; very long field names exceeding repository column limits.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/streamlookup/StreamLookupMeta.java:336

      rep.saveStepAttribute( id_transformation, id_step, "input_sorted", isInputSorted() );
      rep.saveStepAttribute( id_transformation, id_step, "preserve_memory", isMemoryPreservationActive() );
      rep.saveStepAttribute( id_transformation, id_step, "sorted_list", isUsingSortedList() );
      rep.saveStepAttribute( id_transformation, id_step, "integer_pair", isUsingIntegerPair() );

      for ( int i = 0; i < getKeystream().length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "lookup_key_name", getKeystream()[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "lookup_key_field", getKeylookup()[i] );
      }

      for ( int i = 0; i < getValue().length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "return_value_name", getValue()[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "return_value_rename", getValueName()[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "return_value_default", getValueDefault()[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "return_value_type",
          ValueMetaFactory.getValueMetaName( getValueDefaultType()[i] ) );
      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "StreamLookupMeta.Exception.UnableToSaveStepInfoToRepository" )
        + id_step, e );
    }
  }

  @Override
  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 ( prev != null && prev.size() > 0 ) {
      cr =
        new CheckResult( CheckResultInterface.TYPE_RESULT_OK, BaseMessages.getString(
          PKG, "StreamLookupMeta.CheckResult.StepReceivingFields", prev.size() + "" ), stepMeta );
      remarks.add( cr );

      String error_message = "";

View on GitHub (pinned to f3058517a1)