pentaho/pentaho-kettle · error · KettleException

SymmetricCryptoTransMeta.Exception.UnableToSaveStepInfo

SymmetricCryptoTransMeta.Exception.UnableToSaveStepInfo

Error message

SymmetricCryptoTransMeta.Exception.UnableToSaveStepInfo + id_step

What it means

SymmetricCryptoTransMeta.saveRep() persists step settings via rep.saveStepAttribute(...) (secretKey encrypted, secretKeyInField, readKeyAsBinary, outputResultAsBinary). If any repository save call throws, it is wrapped in a KettleException with this message plus the id_step, indicating the step configuration could not be saved. The original cause is chained.

Solutions

  1. Check repository DB connectivity, permissions, and free space, then re-save the transformation.
  2. Run as a user with write privileges on the repository tables.
  3. Verify the secret key length fits the repository attribute column; shorten or use a variable reference instead.
  4. Save to file (.ktr) as a fallback while repository issues are resolved.

Example fix

// before
rep.save(transMeta, "MyTrans", null, true); // fails on read-only DB
// after
try {
  rep.save(transMeta, "MyTrans", null, true);
} catch (KettleException e) {
  transMeta.setFilename("/tmp/MyTrans.ktr"); // file fallback
  transMeta.exportResources();
}
Defensive patterns

Strategy: try-catch

Validate before calling

// Pre-check write access before saveRep runs
if (!rep.testConnection() || rep.isReadOnly()) {
  throw new IllegalStateException("Repository not writable");
}

Try / catch

try {
  rep.save(transMeta, "MyTrans", null, true);
} catch (KettleException e) {
  logError("Failed saving step info for id_step: " + e.getCause(), e);
  // fallback: save to file
  transMeta.setFilename("/tmp/MyTrans.ktr");
}

Prevention

When it happens

Trigger: Saving a transformation to a repository when the connection is down, the database is read-only or out of space, a transaction fails, or attribute values exceed column limits.

Common situations: Repository database read-only mode or quota exceeded; network drop during save; long secret key overflowing the attribute column; concurrent save conflicts; permission revoked mid-session.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/symmetriccrypto/symmetriccryptotrans/SymmetricCryptoTransMeta.java:372

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "operation_type", getOperationTypeCode( operationType ) );
      rep.saveStepAttribute( id_transformation, id_step, "algorithm", algorithm );
      rep.saveStepAttribute( id_transformation, id_step, "schema", schema );

      rep.saveStepAttribute( id_transformation, id_step, "secretKeyField", secretKeyField );
      rep.saveStepAttribute( id_transformation, id_step, "messageField", messageField );
      rep.saveStepAttribute( id_transformation, id_step, "resultfieldname", resultfieldname );

      rep.saveStepAttribute( id_transformation, id_step, "secretKey", Encr
        .encryptPasswordIfNotUsingVariables( secretKey ) );
      rep.saveStepAttribute( id_transformation, id_step, "secretKeyInField", secretKeyInField );
      rep.saveStepAttribute( id_transformation, id_step, "readKeyAsBinary", readKeyAsBinary );
      rep.saveStepAttribute( id_transformation, id_step, "outputResultAsBinary", outputResultAsBinary );

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

  public void check( List<CheckResultInterface> remarks, TransMeta transMeta, StepMeta stepinfo,
    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(
          CheckResult.TYPE_RESULT_OK, BaseMessages.getString(
            PKG, "SymmetricCryptoTransMeta.CheckResult.ConnectedStepOK", String.valueOf( prev.size() ) ),
          stepinfo );
    } else {

View on GitHub (pinned to f3058517a1)