pentaho/pentaho-kettle · error · KettleXMLException

AbortMeta.Exception.UnexpectedErrorInReadingStepInfoFromRepo…

Error message

AbortMeta.Exception.UnexpectedErrorInReadingStepInfoFromRepository

What it means

AbortMeta.readData (invoked by loadXML) throws KettleXMLException with this message when any unexpected Exception occurs while reading the Abort step's settings (row_threshold, message, always_log_rows, abort_option) from XML. It signals the transformation step metadata could not be deserialized.

Solutions

  1. Open the .ktr in Spoon and re-create or repair the Abort step whose XML is malformed.
  2. Validate XML well-formedness and confirm required attributes (row_threshold, abort_option) exist.
  3. Check version compatibility of the transformation file with the Pentaho/PDI runtime.

Example fix

// before
abortOption = "Y".equalsIgnoreCase( awe ) ? AbortOption.ABORT_WITH_ERROR : AbortOption.ABORT;
// after
abortOption = "Y".equalsIgnoreCase( Const.NVL( awe, "Y" ) ) ? AbortOption.ABORT_WITH_ERROR : AbortOption.ABORT;
Defensive patterns

Strategy: validation

Validate before calling

// validate transformation XML before loading metadata
Document doc = XMLHandler.loadXMLFile( new File( ktrPath ) );
if ( doc == null ) throw new IllegalStateException( "unreadable ktr file" );

Try / catch

try { stepMeta.getStepMetaInterface().loadXML( stepnode, databases, metaStore ); } catch ( KettleXMLException e ) { logError( "Abort step metadata unreadable: " + e.getMessage(), e ); }

Prevention

When it happens

Trigger: loadXML on a <step> node where attributes like <abort_option> are missing/corrupt or attribute parsing throws; readData is the shared parser both loadXML paths go through.

Common situations: Hand-edited .ktr files, transformations produced by newer plugin versions read by older ones, XML truncated by bad merges or incomplete file transfer.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/5cc6131b9a395c2c. Report an issue: GitHub.

Appendix: source

Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/abort/AbortMeta.java:143

  private void readData( Node stepnode ) throws KettleXMLException {
    try {
      rowThreshold = XMLHandler.getTagValue( stepnode, "row_threshold" );
      message = XMLHandler.getTagValue( stepnode, "message" );
      alwaysLogRows = "Y".equalsIgnoreCase( XMLHandler.getTagValue( stepnode, "always_log_rows" ) );
      String abortOptionString = XMLHandler.getTagValue( stepnode, "abort_option" );
      if ( !isEmpty( abortOptionString ) ) {
        abortOption = AbortOption.valueOf( abortOptionString );
      } else {
        // Backwards compatibility
        String awe = XMLHandler.getTagValue( stepnode, "abort_with_error" );
        if ( awe == null ) {
          awe = "Y"; // existing transformations will have to maintain backward compatibility with yes
        }
        abortOption = "Y".equalsIgnoreCase( awe ) ? AbortOption.ABORT_WITH_ERROR : AbortOption.ABORT;
      }
    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "AbortMeta.Exception.UnexpectedErrorInReadingStepInfoFromRepository" ), e );
    }
  }

  public void readRep( Repository rep, IMetaStore metaStore, ObjectId id_step, List<DatabaseMeta> databases ) throws KettleException {
    try {
      rowThreshold = rep.getStepAttributeString( id_step, "row_threshold" );
      message = rep.getStepAttributeString( id_step, "message" );
      alwaysLogRows = rep.getStepAttributeBoolean( id_step, "always_log_rows" );

      String abortOptionString = rep.getStepAttributeString( id_step, 0, "abort_option" );
      if ( !isEmpty( abortOptionString ) ) {
        abortOption = AbortOption.valueOf( abortOptionString );
      } else {
        // Backward compatibility
        // existing transformations will have to maintain backward compatibility with yes
        boolean abortWithError = rep.getStepAttributeBoolean( id_step, 0, "abort_with_error", true );
        abortOption = abortWithError ? AbortOption.ABORT_WITH_ERROR : AbortOption.ABORT;

View on GitHub (pinned to f3058517a1)