pentaho/pentaho-kettle · error · KettleException

ZipFileMeta.Exception.UnableToSaveStepInfo

Error message

ZipFileMeta.Exception.UnableToSaveStepInfo

What it means

ZipFileMeta.saveRep wraps any Exception thrown while persisting the step's settings into the repository into this KettleException, with the id_step appended to the message. It means the transformation could not be saved to the repository because this step's attributes failed to write.

Solutions

  1. Check the chained cause 'e' for the underlying JDBC/DB error.
  2. Verify the repository connection is alive and retry the save (Ctrl+S).
  3. Confirm the repository user has INSERT/UPDATE permissions on the step attribute tables.
  4. Check DB disk space and that the repository isn't in read-only mode.
  5. As a fallback, export the transformation to XML and work locally.

Example fix

// before: saving with a read-only repository user
rep = KettleDatabaseRepository.connect(..."readonly_user"...);
rep.save(transMeta, "myTrans", null, true);
// after: use a user with write privileges
rep = KettleDatabaseRepository.connect(..."admin"...);
rep.save(transMeta, "myTrans", null, true);
Defensive patterns

Strategy: retry

Validate before calling

if (!rep.isConnected()) throw new IllegalStateException("Repository not connected");
// verify write access before saving
rep.getDatabaseMeta().testConnectionSuccess();

Try / catch

try {
    rep.save(transMeta, "myTrans", null, true);
} catch (KettleException e) {
    if (e.getMessage().contains("UnableToSaveStepInfo")) {
        rep.disconnect(); rep.connect(user, pass);
        rep.save(transMeta, "myTrans", null, true); // retry once
    } else { throw e; }
}

Prevention

When it happens

Trigger: saveRep throws when rep.saveStepAttribute fails — repository DB connection lost, table locked/read-only, insufficient permissions on r_step_attribute, or transaction rollback during save.

Common situations: Repository database down or network blip while saving; user lacking write permissions on repository tables; read-only replica used as repository; DB disk full causing write failure.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/steps/zipfile/ZipFileMeta.java:274

      throw new KettleException( BaseMessages.getString(
        PKG, "ZipFileMeta.Exception.UnexpectedErrorReadingStepInfo" ), e );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    try {
      rep.saveStepAttribute( id_transformation, id_step, "sourcefilenamefield", sourcefilenamefield );
      rep.saveStepAttribute( id_transformation, id_step, "targetfilenamefield", targetfilenamefield );
      rep.saveStepAttribute( id_transformation, id_step, "baseFolderField", baseFolderField );
      rep.saveStepAttribute( id_transformation, id_step, "operation_type", getOperationTypeCode( operationType ) );
      rep.saveStepAttribute( id_transformation, id_step, "addresultfilenames", addresultfilenames );
      rep.saveStepAttribute( id_transformation, id_step, "overwritezipentry", overwritezipentry );
      rep.saveStepAttribute( id_transformation, id_step, "createparentfolder", createparentfolder );
      rep.saveStepAttribute( id_transformation, id_step, "keepsourcefolder", keepsourcefolder );
      rep.saveStepAttribute( id_transformation, id_step, "movetofolderfield", movetofolderfield );

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

  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 = "";

    // source filename
    if ( Utils.isEmpty( sourcefilenamefield ) ) {
      error_message = BaseMessages.getString( PKG, "ZipFileMeta.CheckResult.SourceFileFieldMissing" );
      cr = new CheckResult( CheckResult.TYPE_RESULT_ERROR, error_message, stepMeta );
      remarks.add( cr );
    } else {
      error_message = BaseMessages.getString( PKG, "ZipFileMeta.CheckResult.TargetFileFieldOK" );
      cr = new CheckResult( CheckResult.TYPE_RESULT_OK, error_message, stepMeta );

View on GitHub (pinned to f3058517a1)