pentaho/pentaho-kettle · error · KettleException
MonetDBBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository
MonetDBBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository
Error message
MonetDBBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository
What it means
MonetDBBulkLoaderMeta.saveRep() wraps any Exception thrown while persisting the step's configuration (field mappings, database relation) to the repository in a KettleException carrying the 'UnableToSaveStepInfoToRepository' message. It means the step metadata could not be written; the message string is concatenated with id_step to identify which step failed. The original exception is preserved as the cause.
Solutions
- Check the cause chain for the underlying KettleDatabaseException and fix the repository connectivity/permission problem
- Verify the referenced databaseMeta still exists in the repository (re-select the connection in the step dialog)
- Ensure the transformation itself has been saved first so id_step is valid
- Retry the save after restoring the repository connection
Example fix
// before
rep.insertStepDatabase(id_transformation, id_step, databaseMeta.getObjectId());
// after
if (databaseMeta != null && databaseMeta.getObjectId() != null) {
rep.insertStepDatabase(id_transformation, id_step, databaseMeta.getObjectId());
} Defensive patterns
Strategy: try-catch
Validate before calling
// Verify repository writability before saving
if (rep == null || !rep.isConnected()) throw new KettleException("Repository is not connected");
if (id_step == null) throw new KettleException("Step must be persisted before saving step metadata");
if (meta.getDatabaseMeta() != null && meta.getDatabaseMeta().getObjectId() == null) {
throw new KettleException("Referenced database connection is not saved in the repository");
} Try / catch
try {
meta.saveRep(rep, metaStore, idTransformation, idStep);
} catch (KettleException e) {
logError("Save failed for step " + idStep + ": " + e.getCause(), e);
throw e; // retry after fixing repository connectivity/permissions
} Prevention
- Save the database connection and the transformation before saving step metadata
- Run PDI with a repository user that has INSERT/UPDATE rights
- Monitor repository DB disk space and connectivity in scheduled environments
- Keep the referenced databaseMeta objects in sync (re-select after renaming connections)
When it happens
Trigger: Calling saveRep() when the Repository throws on any of the save operations, notably rep.insertStepDatabase(id_transformation, id_step, databaseMeta.getObjectId()) or attribute writes — e.g. repository connection lost, insufficient permissions, or id_step not yet persisted.
Common situations: Saving a transformation when the repository database is down or read-only; the step's databaseMeta points to a deleted database object; repository user lacks INSERT permissions on r_step_attribute/r_step_database; disk full on the repository DB server.
Understand the failure class
Background: "failed to write file", "Could not save figure", "Error saving remote file" — file write failed: causes and fixes across languages and libraries — this error's family across 38 libraries.
Related errors
- JobCopyFiles.Error.Exception.UnableSaveRep
- JobEntryCopyMoveResultFilenames.CanNotSaveToRep
- Unable to save job entry of type 'create file' to the…
- Unable to save job entry of type 'xsdvalidator' to the…
- Unable to save job entry of type 'xslt' to the repository…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/8c7eaa779870b599.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/monet-db-bulk-loader/impl/src/main/java/org/pentaho/di/trans/steps/monetdbbulkloader/MonetDBBulkLoaderMeta.java:477
// MonetDB Settings Tab
rep.saveStepAttribute( id_transformation, id_step, TAG_FIELD_SEPARATOR, fieldSeparator );
rep.saveStepAttribute( id_transformation, id_step, "field_enclosure", fieldEnclosure );
rep.saveStepAttribute( id_transformation, id_step, "null_representation", NULLrepresentation );
rep.saveStepAttribute( id_transformation, id_step, "encoding", encoding );
// Output Fields Tab
for ( int i = 0; i < fieldTable.length; i++ ) {
rep.saveStepAttribute( id_transformation, id_step, i, "stream_name", fieldTable[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "field_name", fieldStream[i] );
rep.saveStepAttribute( id_transformation, id_step, i, "field_format_ok", fieldFormatOk[i] );
}
// Also, save the step-database relationship!
if ( databaseMeta != null ) {
rep.insertStepDatabase( id_transformation, id_step, databaseMeta.getObjectId() );
}
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString(
PKG, "MonetDBBulkLoaderMeta.Exception.UnableToSaveStepInfoToRepository" )
+ id_step, e );
}
}
@Override
public void getFields( Bowl bowl, RowMetaInterface rowMeta, String origin, RowMetaInterface[] info, StepMeta nextStep,
VariableSpace space, Repository repository, IMetaStore metaStore ) throws KettleStepException {
// Default: nothing changes to rowMeta
}
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 ( databaseMeta != null ) {View on GitHub (pinned to f3058517a1)