pentaho/pentaho-kettle · error · KettleException

StringOperationsMeta.Exception.UnableToSaveStepInfo

Error message

StringOperationsMeta.Exception.UnableToSaveStepInfo

What it means

KettleException thrown by StringOperationsMeta.saveRep when saving the String Operations step's configuration to a Pentaho repository fails. saveRep writes per-row attributes (mask_xml, digits, remove_special_characters, etc.) via rep.saveStepAttribute; any exception in that block is wrapped with this localized message plus the step id and rethrown. The step ObjectId is appended to the message to help locate the failing step.

Solutions

  1. Check the chained cause exception to identify the underlying repository/database failure.
  2. Verify the repository account has write permission on the transformation folder.
  3. Test repository connectivity and retry the save after restoring the connection.
  4. Shorten or sanitize step attribute values (e.g., large mask XML) if the repository column limits are being hit.
Defensive patterns

Strategy: try-catch

Validate before calling

// before save: ensure repository is writable
if ( !repository.getSecurityProvider().hasAccess( ..., PermissionType.MODIFY ) ) throw ...

Try / catch

try { meta.saveRep( rep, metaStore, idTrans, idStep ); } catch ( KettleException e ) { log.error( "saveRep failed for step " + idStep + ": " + e.getCause(), e ); throw e; }

Prevention

When it happens

Trigger: Calling saveRep (transformation save) when the repository write fails: connection loss mid-save, database constraint violation, insufficient write permissions, or a null/oversized attribute value passed to saveStepAttribute.

Common situations: Saving a transformation to a read-only repository or without edit rights; DBA-enforced column size limits truncating long mask XML; intermittent database connectivity during save; concurrent edits locking repository rows.

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/e42e7b5f9b2d4db6. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/stringoperations/StringOperationsMeta.java:516

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    try {

      for ( int i = 0; i < fieldInStream.length; i++ ) {
        rep.saveStepAttribute( id_transformation, id_step, i, "in_stream_name", fieldInStream[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "out_stream_name", fieldOutStream[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "trim_type", trimType[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "lower_upper", lowerUpper[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "padding_type", padding_type[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "pad_char", padChar[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "pad_len", padLen[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "init_cap", initCap[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "mask_xml", maskXML[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "digits", digits[i] );
        rep.saveStepAttribute( id_transformation, id_step, i, "remove_special_characters", remove_special_characters[i] );

      }
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "StringOperationsMeta.Exception.UnableToSaveStepInfo" )
        + id_step, e );
    }
  }

  @Override
  public void getFields( Bowl bowl, RowMetaInterface inputRowMeta, String name, RowMetaInterface[] info,
    StepMeta nextStep, VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {
    // Add new field?
    for ( int i = 0; i < fieldOutStream.length; i++ ) {
      ValueMetaInterface v;
      String outputField = space.environmentSubstitute( fieldOutStream[i] );
      if ( !Utils.isEmpty( outputField ) ) {
        // Add a new field
        v = new ValueMetaString( outputField );
        v.setLength( 100, -1 );
        v.setOrigin( name );
        inputRowMeta.addValueMeta( v );

View on GitHub (pinned to f3058517a1)