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

  1. Verify repository connectivity and re-open the repository connection, then retry loading the transformation.
  2. Check the repository tables (r_step_attribute, r_condition) for missing rows for this id_step; re-save the step from Spoon.
  3. Run the repository upgrade (Tools > Explore/Repair) if PDI and repository versions differ.
  4. 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

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


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)