pentaho/pentaho-kettle · error · KettleException
MonetDBBulkLoaderMeta.Exception.UnexpectedErrorReadingStepInfoFromRepository
MonetDBBulkLoaderMeta.Exception.UnexpectedErrorReadingStepInfoFromRepository
Error message
MonetDBBulkLoaderMeta.Exception.UnexpectedErrorReadingStepInfoFromRepository
What it means
MonetDBBulkLoaderMeta.readRep() wraps any Exception thrown while restoring this step's configuration from the repository in a KettleException carrying the 'UnexpectedErrorReadingStepInfoFromRepository' message. It means repository metadata for the step (field mappings, stream/table field names, format flags) could not be read, e.g. a repository I/O problem or corrupt/unexpected step attributes. The original exception is preserved as the cause.
Solutions
- Check the cause chain of the KettleException for the real repository error (usually a KettleDatabaseException) and fix that underlying problem first
- Verify the repository connection is available and the user can read r_step_attribute for this transformation
- Re-open and re-save the transformation in Spoon to rewrite the step attributes
- If caused by a version upgrade, upgrade the plugin or recreate the MonetDBBulkLoader step
Example fix
// before
meta.readRep(rep, metaStore, stepId, databases);
// after
try {
meta.readRep(rep, metaStore, stepId, databases);
} catch (KettleException e) {
logError("Failed to read MonetDBBulkLoader step info from repository", e); // inspect e.getCause()
throw e;
} Defensive patterns
Strategy: try-catch
Validate before calling
// Verify repository access before loading metadata
if (rep == null || !rep.isConnected()) {
throw new KettleException("Repository is not connected");
}
ObjectId stepId = transMeta.getStep(stepname).getStepMetaInterface() != null ? stepObjectId : null;
if (stepId == null) throw new KettleException("Step not persisted in repository"); Type guard
boolean canReadStep(Repository rep, ObjectId idStep) {
try {
return rep != null && idStep != null && rep.getStepAttributeString(idStep, "field_format_ok") != null || true; // attributes may be optional; check connection instead
} catch (Exception e) { return false; }
} Try / catch
try {
meta.readRep(rep, metaStore, idStep, databases);
} catch (KettleException e) {
Throwable cause = e.getCause();
// branch on cause type: KettleDatabaseException => repository I/O, else attribute problem
throw new KettleException("Reading MonetDBBulkLoader metadata failed: " + (cause != null ? cause.getMessage() : "unknown"), e);
} Prevention
- Always ensure the repository connection is alive before loading transformations
- Keep Kettle and the monet-db-bulk-loader plugin versions consistent between save and read
- Back up and validate repository tables; avoid manual edits to r_step_attribute
- After a Kettle upgrade, re-save affected transformations to rewrite step attributes
When it happens
Trigger: Calling readRep() when the underlying Repository throws (connection dropped, missing step attributes for id_step, a null/incompatible attribute value, or repository schema mismatch) — the generic catch around the whole attribute-reading loop converts any such failure into this error.
Common situations: Opening a transformation whose MonetDBBulkLoader step was saved by a different Pentaho/Kettle version; repository database temporarily unreachable; a corrupted repository row for the step; manually edited r_step_attribute rows.
Understand the failure class
Background: "failed to read file", EACCES, ENOENT and "could not read <path>" errors: when a program can't read a file from disk — this error's family across 49 libraries.
Related errors
- Unexpected error reading step with id_step=
- AccessInputMeta.Exception.ErrorSavingToRepository
- CloneRowMeta.Exception.UnableToReadStepInfo
- CloneRowMeta.Exception.UnexpectedErrorReadingStepInfo
- ColumnExistsMeta.Exception.UnableToReadStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/a2cea8b2d8c445b5.
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:442
}
truncate = Boolean.parseBoolean( rep.getStepAttributeString( id_step, "truncate" ) );
// This expression will only return true if a yes value was previously recorded; false otherwise.
fullyQuoteSQL = Boolean.parseBoolean( rep.getStepAttributeString( id_step, "fully_quote_sql" ) );
int nrvalues = rep.countNrStepAttributes( id_step, "stream_name" );
allocate( nrvalues );
for ( int i = 0; i < nrvalues; i++ ) {
fieldTable[i] = rep.getStepAttributeString( id_step, i, "stream_name" );
fieldStream[i] = rep.getStepAttributeString( id_step, i, "field_name" );
if ( fieldStream[i] == null ) {
fieldStream[i] = fieldTable[i];
}
fieldFormatOk[i] = rep.getStepAttributeBoolean( id_step, i, "field_format_ok" );
}
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString(
PKG, "MonetDBBulkLoaderMeta.Exception.UnexpectedErrorReadingStepInfoFromRepository" ), e );
}
}
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
try {
rep.saveDatabaseMetaStepAttribute( id_transformation, id_step, "id_connection", databaseMeta );
// General Settings Tab
rep.saveStepAttribute( id_transformation, id_step, "db_connection_name", dbConnectionName );
rep.saveStepAttribute( id_transformation, id_step, "schema", schemaName );
rep.saveStepAttribute( id_transformation, id_step, "table", tableName );
rep.saveStepAttribute( id_transformation, id_step, "buffer_size", bufferSize );
rep.saveStepAttribute( id_transformation, id_step, "log_file", logFile );
rep.saveStepAttribute( id_transformation, id_step, "truncate", truncate );
rep.saveStepAttribute( id_transformation, id_step, "fully_quote_sql", fullyQuoteSQL );
// MonetDB Settings Tab
rep.saveStepAttribute( id_transformation, id_step, TAG_FIELD_SEPARATOR, fieldSeparator );View on GitHub (pinned to f3058517a1)