pentaho/pentaho-kettle · error · KettleException
JoinRowsMeta.Exception.UnexpectedErrorInReadStepInfoFromRepository
JoinRowsMeta.Exception.UnexpectedErrorInReadStepInfoFromRepository
Error message
JoinRowsMeta.Exception.UnexpectedErrorInReadStepInfoFromRepository
What it means
JoinRowsMeta.readRep() throws this KettleException when loading Join Rows step attributes from a repository fails unexpectedly. Attributes such as prefix, main step name, and the saved condition are read via rep.loadStepAttribute/loadConditionFromStepAttribute; any repository-side exception during these calls is wrapped in this error. It means the step definition could not be read from the repository, not that the data is necessarily wrong.
Solutions
- Verify repository connectivity and re-open the repository connection, then retry loading the transformation.
- Check the repository tables (r_step_attribute, r_condition) for missing rows for this id_step; re-save the step from Spoon.
- Run the repository upgrade (Tools > Explore/Repair) if PDI and repository versions differ.
- Load the transformation from a .ktr file export instead of the repository to isolate repository-side issues.
Example fix
// before
repository.connect( "prod_rep" );
TransMeta tm = new TransMeta( repository, "ETL/Join Transform" ); // readRep throws
// after ( validate connection + fall back to file )
repository.connect( "prod_rep" );
if ( !repository.isConnected() || !repository.exists( "ETL/Join Transform", RepositoryObjectType.TRANSFORMATION ) ) {
throw new IllegalStateException( "Transformation missing in repository" );
}
TransMeta tm;
try {
tm = new TransMeta( repository, "ETL/Join Transform" );
} catch ( KettleException e ) {
tm = new TransMeta( "backup/Join Transform.ktr" ); // file fallback
} Defensive patterns
Strategy: retry
Validate before calling
if ( repository == null || !repository.isConnected() ) {
throw new IllegalStateException( "Repository not connected before loading transformation" );
} Try / catch
for ( int attempt = 1; attempt <= 3; attempt++ ) {
try { return new TransMeta( repository, transName, null, null, null ); }
catch ( KettleException e ) {
if ( attempt == 3 || e.getMessage() == null
|| !e.getMessage().contains( "UnexpectedErrorInReadStepInfoFromRepository" ) ) throw e;
repository.disconnect(); Thread.sleep( 2000 ); repository.connect( user, pass );
}
} Prevention
- Verify repository connectivity (and VPN/DB health) before programmatic loads.
- Keep PDI client and repository schema versions aligned; run repository upgrades when upgrading.
- Periodically re-save legacy transformations from Spoon so repository rows for steps are complete.
- Export critical transformations to .ktr as an accessible fallback.
When it happens
Trigger: readRep invoked by loadXML when the transformation is loaded from a repository; fails if the repository connection is broken, the step row (r) or id_step is invalid, or loadConditionFromStepAttribute throws while fetching "id_condition".
Common situations: Repository database temporarily unavailable or connection dropped mid-load; orphaned step rows after a partial save or repository upgrade; repository schema version mismatch between PDI client and repository tables.
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
- ElasticSearchBulkMeta.Exception.ErrorReadingRepository
- ElasticSearchBulkMeta.Exception.ErrorSavingToRepository
- GetTableNamesMeta.Exception.UnableToSaveStepInfo
- GetTableNamesMeta.Exception.UnexpectedErrorReadingStepInfo
- GPBulkLoaderMeta.Exception.UnexpectedErrorReadingStepInfoFro…
AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13).
Data as JSON: /api/errors/1e16b633a0e645e2.
Report an issue: GitHub.
Appendix: source
Thrown at engine/src/main/java/org/pentaho/di/trans/steps/joinrows/JoinRowsMeta.java:255
return retval.toString();
}
@Override
public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases ) throws KettleException {
try {
directory = rep.getStepAttributeString( id_step, "directory" );
prefix = rep.getStepAttributeString( id_step, "prefix" );
cacheSize = (int) rep.getStepAttributeInteger( id_step, "cache_size" );
mainStepname = rep.getStepAttributeString( id_step, "main" );
condition = rep.loadConditionFromStepAttribute( id_step, "id_condition" );
if ( condition == null ) {
condition = new Condition();
}
} catch ( Exception e ) {
throw new KettleException( BaseMessages.getString(
PKG, "JoinRowsMeta.Exception.UnexpectedErrorInReadStepInfoFromRepository" ), e );
}
}
@Override
public void saveRep( Repository rep, IMetaStore metaStore, ObjectId id_transformation, ObjectId id_step ) throws KettleException {
try {
rep.saveStepAttribute( id_transformation, id_step, "directory", directory );
rep.saveStepAttribute( id_transformation, id_step, "prefix", prefix );
rep.saveStepAttribute( id_transformation, id_step, "cache_size", cacheSize );
if ( mainStepname == null ) {
mainStepname = getLookupStepname();
}
rep.saveStepAttribute( id_transformation, id_step, "main", mainStepname );
rep.saveConditionStepAttribute( id_transformation, id_step, "id_condition", condition );
} catch ( Exception e ) {View on GitHub (pinned to f3058517a1)