pentaho/pentaho-kettle · error · KettleException

SalesforceDeleteMeta.Exception.ErrorSavingToRepository

Error message

SalesforceDeleteMeta.Exception.ErrorSavingToRepository

What it means

SalesforceDeleteMeta.saveRep persists the step's settings (batchSize, DeleteField, rollbackAllChangesOnError) to the repository and wraps any exception in a KettleException with this message, including the step's ObjectId. It means saving the step attributes to the repository database failed.

Solutions

  1. Verify the repository database is writable and the user has INSERT/UPDATE permissions on the step attribute tables
  2. Retry saving the transformation after confirming the database connection is stable
  3. Check for repository locks (other sessions holding the transformation) and resolve them
  4. Inspect the chained cause for the specific JDBC error (constraint, disk full, timeout)

Example fix

null
Defensive patterns

Strategy: try-catch

Validate before calling

// verify the repository is writable before saving
if (repository.isReadOnly()) { throw new IllegalStateException("Repository is read-only; cannot save step attributes"); }

Try / catch

try {
  meta.saveRep(repository, metaStore, transId, stepId);
} catch (KettleException e) {
  if (e.getMessage().contains("ErrorSavingToRepository")) {
    logError("Repository save failed for step " + stepId + "; cause: " + e.getCause());
  }
  throw e;
}

Prevention

When it happens

Trigger: saveRep catching an exception from rep.saveStepAttribute calls: repository connection lost, transaction failure, constraint violation, or read-only repository.

Common situations: Repository database read-only or out of space; network interruption mid-save; repository lock held by another user/session; permission denied on the repository tables.

Related errors


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

Appendix: source

Thrown at plugins/salesforce/core/src/main/java/org/pentaho/di/trans/steps/salesforcedelete/SalesforceDeleteMeta.java:181

    super.readRep( rep, metaStore, id_step, databases );
    try {
      setDeleteField( rep.getStepAttributeString( id_step, "DeleteField" ) );
      setBatchSize( rep.getStepAttributeString( id_step, "batchSize" ) );
      setRollbackAllChangesOnError( rep.getStepAttributeBoolean( id_step, "rollbackAllChangesOnError" ) );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "SalesforceDeleteMeta.Exception.ErrorReadingRepository" ), e );
    }
  }

  public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
    super.saveRep( rep, metaStore, id_transformation, id_step );
    try {
      rep.saveStepAttribute( id_transformation, id_step, "batchSize", getBatchSize() );
      rep.saveStepAttribute( id_transformation, id_step, "DeleteField", getDeleteField() );
      rep.saveStepAttribute( id_transformation, id_step, "rollbackAllChangesOnError", isRollbackAllChangesOnError() );
    } catch ( Exception e ) {
      throw new KettleException( BaseMessages.getString(
        PKG, "SalesforceDeleteMeta.Exception.ErrorSavingToRepository", "" + 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 ) {
    super.check( remarks, transMeta, stepMeta, prev, input, output, info, space, repository, metaStore );
    CheckResult cr;

    // See if we get input...
    if ( input != null && input.length > 0 ) {
      cr =
        new CheckResult( CheckResult.TYPE_RESULT_ERROR, BaseMessages.getString(
          PKG, "SalesforceDeleteMeta.CheckResult.NoInputExpected" ), stepMeta );
    } else {
      cr =
        new CheckResult( CheckResult.TYPE_RESULT_OK, BaseMessages.getString(

View on GitHub (pinned to f3058517a1)