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
- Verify the repository database is writable and the user has INSERT/UPDATE permissions on the step attribute tables
- Retry saving the transformation after confirming the database connection is stable
- Check for repository locks (other sessions holding the transformation) and resolve them
- 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
- Ensure the repository DB user has INSERT/UPDATE privileges on step attribute tables
- Check for other sessions holding locks on the transformation before saving
- Monitor database disk space and transaction log growth
- Save frequently and commit small changes to limit transaction scope
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
- SalesforceDeleteMeta.Exception.ErrorReadingRepository
- FuzzyMatchMeta.Exception.UnexpecteErrorReadingStepInfoFromRe…
- GetTableNamesMeta.Exception.UnableToSaveStepInfo
- GPBulkLoaderMeta.Exception.UnexpectedErrorReadingStepInfoFro…
- GPBulkLoaderMeta.Exception.UnexpectedErrorReadingStepInfoFromRepository
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)