{"record":{"id":"eb0d30809cd8a0fd","repo":"pentaho/pentaho-kettle","slug":"multimergejoinmeta-exception-unexpectederrorreadingstepinfo","errorCode":"MultiMergeJoinMeta.Exception.UnexpectedErrorReadingStepInfo","errorMessage":"MultiMergeJoinMeta.Exception.UnexpectedErrorReadingStepInfo","messagePattern":"MultiMergeJoinMeta\\.Exception\\.UnexpectedErrorReadingStepInfo","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/steps/multimerge/MultiMergeJoinMeta.java","lineNumber":227,"sourceCode":"\n      allocateInputSteps( (int) nInputStreams );\n\n      for ( int i = 0; i < nInputStreams; i++ ) {\n        inputSteps[i] = rep.getStepAttributeString( id_step, \"step\" + i );\n      }\n      // This next bit is completely unnecessary if you just pass the step name into\n      // the constructor above. That sets the subject to the step name in one pass\n      // instead of a second one.\n      // MB - 5/2016\n      //\n      // List<StreamInterface> infoStreams = getStepIOMeta().getInfoStreams();\n      // for ( int i = 0; i < infoStreams.size(); i++ ) {\n      //   infoStreams.get( i ).setSubject( rep.getStepAttributeString( id_step, \"step\" + i ) );\n      // }\n\n      joinType = rep.getStepAttributeString( id_step, \"join_type\" );\n    } catch ( Exception e ) {\n      throw new KettleException( BaseMessages.getString( PKG,\n          \"MultiMergeJoinMeta.Exception.UnexpectedErrorReadingStepInfo\" ), e );\n    }\n  }\n\n  @Override\n  public void searchInfoAndTargetSteps( List<StepMeta> steps ) {\n    StepIOMetaInterface ioMeta = getStepIOMeta();\n    ioMeta.getInfoStreams().clear();\n    for ( int i = 0; i < inputSteps.length; i++ ) {\n      String inputStepName = inputSteps[i];\n      if ( i >= ioMeta.getInfoStreams().size() ) {\n        ioMeta.addStream(\n          new Stream( StreamType.INFO, StepMeta.findStep( steps, inputStepName ),\n              BaseMessages.getString( PKG, \"MultiMergeJoin.InfoStream.Description\" ), StreamIcon.INFO, inputStepName ) );\n      }\n    }\n  }\n","sourceCodeStart":209,"sourceCodeEnd":245,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/steps/multimerge/MultiMergeJoinMeta.java#L209-L245","documentation":"Thrown by MultiMergeJoinMeta.readRep when an unexpected exception occurs while reading the step's configuration from the repository, notably fetching the \"join_type\" attribute via rep.getStepAttributeString. It wraps the cause in a generic KettleException with this message, indicating step metadata could not be read from the transformation repository tables.","triggerScenarios":"readRep is called when loading a transformation from a repository; it throws when the repository access layer raises (connection dropped, missing/invalid id_step row, corrupted r_step_attribute entries, repository schema mismatch).","commonSituations":"Repository database was restored partially so step attributes are missing; stale repository cache after a server-side change; network interruption mid-load; repository schema version differs from the client PDI version.","solutions":["Inspect the wrapped cause to identify the repository error (connection vs missing attribute).","Verify repository connectivity and that the transformation and its step rows exist (r_step, r_step_attribute) for the given id_step.","Clear the PDI repository metadata cache (delete the local cache directory) and reload.","Re-save the step from Spoon to rewrite its repository attributes, or recreate the step if attributes are unrecoverable.","Confirm client and repository schema versions are compatible."],"exampleFix":"// before: loading from a repository whose attributes row is gone\nTransMeta tm = new TransMeta(repository, \"My Trans\"); // throws\n\n// after: verify/repair repository state first\nif ( repository.getStepAttributeString( idStep, \"join_type\" ) == null ) {\n  // recreate the step or restore r_step_attribute rows, then retry load\n}","handlingStrategy":"try-catch","validationCode":"// Verify the step's attributes exist in the repository before loading the transformation\nString joinType = repository.getStepAttributeString( idStep, \"join_type\" );\nif ( joinType == null ) {\n  throw new IllegalStateException( \"MultiMergeJoin step \" + idStep + \" has no join_type attribute; repository data incomplete\" );\n}","typeGuard":null,"tryCatchPattern":"try {\n  TransMeta tm = new TransMeta( repository, transName );\n} catch ( KettleException e ) {\n  if ( e.getMessage().contains( \"UnexpectedErrorReadingStepInfo\" ) ) {\n    // check repository connectivity / id_step rows, clear cache, retry\n  } else { throw e; }\n}","preventionTips":["Monitor repository database health and run loads on stable connections.","Back up r_step_attribute data before repository maintenance or restores.","Keep PDI client version compatible with the repository schema.","Clear the local repository cache after server-side changes."],"tags":["kettle","repository","metadata","step-meta","persistence"],"backgroundTag":"database-query-failed","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}