pentaho/pentaho-kettle · error · KettleException

PGPDecryptStreamMeta.Exception.UnableToSaveStepInfo

Error message

PGPDecryptStreamMeta.Exception.UnableToSaveStepInfo

What it means

PGPDecryptStreamMeta.saveRep throws KettleException when saving the step's attributes (passphrase, stream field, result field, etc.) to the Pentaho Repository fails. The step id is appended to the message for identification.

Solutions

  1. Check repository connectivity and retry the save
  2. Verify the user has write permission on the repository
  3. Inspect the wrapped cause for the underlying repository error
  4. If password encryption is the issue, confirm Encr encryption is configured (kettle.encryption.password)
Defensive patterns

Strategy: try-catch

Validate before calling

// Ensure repository is writable before saving
if (!rep.isConnected()) { throw new IllegalStateException("Repository not connected"); }
// optionally: test write on a scratch attribute via rep.saveStepAttribute on a test step

Try / catch

try { meta.saveRep(rep, metaStore, idTrans, idStep); }
catch (KettleException e) {
  if (e.getMessage().contains("UnableToSaveStepInfo")) {
    log.error("Repository save failed for step " + idStep + ": " + e.getCause(), e);
  } else { throw e; }
}

Prevention

When it happens

Trigger: Calling saveRep when rep.saveStepAttribute throws — repository write failure, connection loss, constraint violation, or read-only repository.

Common situations: Repository database locked or down, insufficient write permissions, passphrase containing characters the repository layer rejects, disk full on the repository DB server.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/pgpdecryptstream/PGPDecryptStreamMeta.java:265

      passphraseFieldName = rep.getStepAttributeString( id_step, "passphraseFieldName" );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "PGPDecryptStreamMeta.Exception.UnexpectedErrorReadingStepInfo" ), e );
    }
  }

  @Override
  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "gpglocation", gpglocation );
      rep.saveStepAttribute( id_transformation, id_step, "passhrase", Encr
        .encryptPasswordIfNotUsingVariables( passhrase ) );
      rep.saveStepAttribute( id_transformation, id_step, "streamfield", streamfield );
      rep.saveStepAttribute( id_transformation, id_step, "resultfieldname", resultfieldname );
      rep.saveStepAttribute( id_transformation, id_step, "passphraseFromField", passphraseFromField );
      rep.saveStepAttribute( id_transformation, id_step, "passphraseFieldName", passphraseFieldName );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "PGPDecryptStreamMeta.Exception.UnableToSaveStepInfo" )
        + 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;
    String error_message = "";

    if ( Utils.isEmpty( gpglocation ) ) {
      error_message = BaseMessages.getString( PKG, "PGPDecryptStreamMeta.CheckResult.GPGLocationMissing" );
      cr = new CheckResult( CheckResult.TYPE_RESULT_ERROR, error_message, stepMeta );
      remarks.add( cr );
    } else {
      error_message = BaseMessages.getString( PKG, "PGPDecryptStreamMeta.CheckResult.GPGLocationOK" );

View on GitHub (pinned to f3058517a1)