pentaho/pentaho-kettle · error · KettleException

PGPEncryptStreamMeta.Exception.UnableToSaveStepInfo

Error message

PGPEncryptStreamMeta.Exception.UnableToSaveStepInfo

What it means

KettleException thrown by PGPEncryptStreamMeta.saveRep when persisting the step's attributes to the repository fails. Each rep.saveStepAttribute call writes the PGP step settings; any exception is wrapped with this message plus the step id. It means the step's configuration could not be saved.

Solutions

  1. Check repository connection and retry saving the transformation.
  2. Verify the repository user has write permission on the transformation.
  3. Check database disk space and constraint errors in the underlying repository DB logs.

Example fix

// before: saving with read-only repository user
rep.save(transMeta, "path", null, true); // throws
// after: save with a user granted INSERT/UPDATE on repository tables
rep = KettleDatabaseRepository ... connect("admin", password); // writable account
Defensive patterns

Strategy: try-catch

Validate before calling

// Pre-save check: writable repository and connectivity
if (!rep.isConnected()) throw new KettleException("Repository not connected");
// e.g. attempt a trivial write or check user privileges beforehand

Try / catch

try { rep.save(transMeta, path, null, true); } catch (KettleException e) { log.error("Save failed for step " + idStep + ": " + e.getCause(), e); throw e; }

Prevention

When it happens

Trigger: saveRep is invoked when saving a transformation and a rep.saveStepAttribute call throws (write failure, read-only connection, constraint violation, connection loss).

Common situations: Repository DB read-only or out of space; network failure during save; repository user lacks write privileges.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/pgpencryptstream/PGPEncryptStreamMeta.java:260

      streamfield = rep.getStepAttributeString( id_step, "streamfield" );
      resultfieldname = rep.getStepAttributeString( id_step, "resultfieldname" );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "PGPEncryptStreamMeta.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, "keyname", keyname );
      rep.saveStepAttribute( id_transformation, id_step, "keynameInField", keynameInField );
      rep.saveStepAttribute( id_transformation, id_step, "keynameFieldName", keynameFieldName );
      rep.saveStepAttribute( id_transformation, id_step, "streamfield", streamfield );
      rep.saveStepAttribute( id_transformation, id_step, "resultfieldname", resultfieldname );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "PGPEncryptStreamMeta.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, "PGPEncryptStreamMeta.CheckResult.GPGLocationMissing" );
      cr = new CheckResult( CheckResult.TYPE_RESULT_ERROR, error_message, stepMeta );
      remarks.add( cr );
    } else {
      error_message = BaseMessages.getString( PKG, "PGPEncryptStreamMeta.CheckResult.GPGLocationOK" );

View on GitHub (pinned to f3058517a1)