pentaho/pentaho-kettle · error · KettleException
Unexpected error reading step information from the…
Error message
Unexpected error reading step information from the repository
What it means
MetaInjectMeta.readRep() rebuilds the target/source mapping from repository step attributes and then runs MetaInjectMigration. Any exception while reading attributes or migrating the mapping is wrapped in a KettleException with this message. It fails loading the transformation from the repository.
Solutions
- Inspect the wrapped cause to find whether attribute reads or MetaInjectMigration failed.
- Reopen and re-save the step in Spoon to rewrite its repository attributes.
- Verify repository database connectivity and integrity.
- Ensure the PDI client version matches the repository content version so migration runs correctly.
Defensive patterns
Strategy: try-catch
Validate before calling
// Before loading, confirm the step's attributes exist
ObjectId id_step = rep.getStepID(stepname, id_transformation);
int count = rep.countNrStepAttributes(id_step, MetaInjectMeta.MAPPING_TARGET_STEP);
if (count == 0) log.Warn("MetaInject step has no stored mappings"); Try / catch
try {
meta.readRep(rep, metaStore, id_step, databases);
} catch (KettleException e) {
logError("Repository read failed for step " + id_step + ": " + e.getCause(), e);
} Prevention
- Complete repository migrations fully after PDI upgrades
- Monitor repository DB health
- Re-save legacy steps once through Spoon to rewrite attributes
When it happens
Trigger: readRep(rep, metaStore, id_step, databases) encountering repository I/O errors, missing step attributes for the Meta Inject step, or MetaInjectMigration throwing on legacy mapping rows.
Common situations: Corrupt or partially migrated repository rows after a PDI upgrade; database connectivity drops mid-load; repository records created by an incompatible older plugin version.
Understand the failure class
Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.
Related errors
- Unable to save step information to the repository for…
- AddSequenceMeta.Exception.UnableToSaveStepInfo
- ColumnExistsMeta.Exception.UnableToSaveStepInfo
- ColumnExistsMeta.Exception.UnexpectedErrorReadingStepInfo
- CreditCardValidatorMeta.Exception.UnableToSaveStepInfo
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/329ff4ee08051638.
Report an issue: GitHub.
Appendix: source
Thrown at plugins/meta-inject/impl/src/main/java/org/pentaho/di/trans/steps/metainject/MetaInjectMeta.java:323
targetFile = rep.getStepAttributeString( id_step, TARGET_FILE );
noExecution = rep.getStepAttributeBoolean( id_step, NO_EXECUTION );
int nrMappings = rep.countNrStepAttributes( id_step, MAPPING_TARGET_STEP_NAME );
for ( int i = 0; i < nrMappings; i++ ) {
String targetStepname = rep.getStepAttributeString( id_step, i, MAPPING_TARGET_STEP_NAME );
String targetAttributeKey = rep.getStepAttributeString( id_step, i, MAPPING_TARGET_ATTRIBUTE_KEY );
boolean targetDetail = rep.getStepAttributeBoolean( id_step, i, MAPPING_TARGET_DETAIL );
String sourceStepname = rep.getStepAttributeString( id_step, i, MAPPING_SOURCE_STEP );
String sourceField = rep.getStepAttributeString( id_step, i, MAPPING_SOURCE_FIELD );
TargetStepAttribute target = new TargetStepAttribute( targetStepname, targetAttributeKey, targetDetail );
SourceStepField source = new SourceStepField( sourceStepname, sourceField );
targetSourceMapping.put( target, source );
}
MetaInjectMigration.migrate( targetSourceMapping );
} catch ( Exception e ) {
throw new KettleException( "Unexpected error reading step information from the repository", e );
}
}
@Override
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step )
throws KettleException {
try {
rep.saveStepAttribute( id_transformation, id_step, SPECIFICATION_METHOD, specificationMethod == null ? null
: specificationMethod.getCode() );
rep.saveStepAttribute( id_transformation, id_step, TRANS_OBJECT_ID, transObjectId == null ? null : transObjectId
.toString() );
rep.saveStepAttribute( id_transformation, id_step, FILENAME, fileName );
rep.saveStepAttribute( id_transformation, id_step, TRANS_NAME, transName );
rep.saveStepAttribute( id_transformation, id_step, DIRECTORY_PATH, directoryPath );
rep.saveStepAttribute( id_transformation, id_step, SOURCE_STEP, sourceStepName );
rep.saveStepAttribute( id_transformation, id_step, STREAM_SOURCE_STEP, streamSourceStepname );
rep.saveStepAttribute( id_transformation, id_step, STREAM_TARGET_STEP, streamTargetStepname );View on GitHub (pinned to f3058517a1)