pentaho/pentaho-kettle · error · KettleXMLException

CombinationLookupMeta.Exception.UnableToLoadStepInfo

Error message

CombinationLookupMeta.Exception.UnableToLoadStepInfo

What it means

KettleXMLException thrown by CombinationLookupMeta.readData when parsing the <step> XML node for a CombinationLookup fails for any reason. It wraps the original exception with the localized message 'Unable to load step info from XML layer', indicating the saved step definition in the .ktr file could not be deserialized.

Solutions

  1. Open the .ktr file and inspect the <combination_lookup> XML block for malformed/missing tags; fix or remove the broken step.
  2. Re-add the CombinationLookup step in Spoon and reconfigure it, then save a fresh copy.
  3. Open the transformation in the PDI version it was created with (check version mismatch).
  4. Keep a backup of the .ktr before manual edits.

Example fix

// before (broken ktr fragment):
// <returnvalue><name>customer_tk</name></returnvalue>   <!-- missing use_autoinc attr etc. -->
// after:
// <returnvalue><name>customer_tk</name><use_autoinc>Y</use_autoinc></returnvalue>
// plus all expected tags (last_update_field, creation_method, ...).
Defensive patterns

Strategy: try-catch

Validate before calling

// validate ktr XML before load: check required tags exist
// if (XMLHandler.getTagValue(stepnode, "connection") == null)
//   throw new KettleXMLException("Step XML missing required tags");

Try / catch

try {
  transMeta.loadXML(file, null, null, null, null, true, observer);
} catch (KettleXMLException e) {
  log.error("Failed to parse CombinationLookup step XML: " + e.getCause(), e);
}

Prevention

When it happens

Trigger: loadXML -> readData encounters malformed or missing XML tags (e.g. corrupted retkey node, missing 'name'/'use_autoinc' attributes) or any exception while reading tags like last_update_field or creation_method.

Common situations: Hand-edited or truncated .ktr files; transformations from newer PDI versions opened in older versions; XML encoding corruption; missing required tags after manual merge of step definitions.

Understand the failure class

Background: "failed to unmarshal" / json.Unmarshal errors: why parsing a response into a Go struct fails and how to fix it — this error's family across 23 libraries.

Related errors


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

Appendix: source

Thrown at plugins/core/impl/src/main/java/org/pentaho/di/trans/steps/combinationlookup/CombinationLookupMeta.java:447

      // Read keys to dimension
      for ( int i = 0; i < nrkeys; i++ ) {
        Node knode = XMLHandler.getSubNodeByNr( keys, "key", i );
        keyField[ i ] = XMLHandler.getTagValue( knode, "name" );
        keyLookup[ i ] = XMLHandler.getTagValue( knode, "lookup" );
      }

      // If this is empty: use auto-increment field!
      sequenceFrom = XMLHandler.getTagValue( stepnode, "sequence" );

      Node fields = XMLHandler.getSubNode( stepnode, "fields" );
      Node retkey = XMLHandler.getSubNode( fields, "return" );
      technicalKeyField = XMLHandler.getTagValue( retkey, "name" );
      useAutoinc = !"N".equalsIgnoreCase( XMLHandler.getTagValue( retkey, "use_autoinc" ) );
      lastUpdateField = XMLHandler.getTagValue( stepnode, "last_update_field" );

      setTechKeyCreation( XMLHandler.getTagValue( retkey, "creation_method" ) );
    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "CombinationLookupMeta.Exception.UnableToLoadStepInfo" ), e );
    }
  }

  @Override
  public void setDefault() {
    schemaName = "";
    tablename = BaseMessages.getString( PKG, "CombinationLookupMeta.DimensionTableName.Label" );
    databaseMeta = null;
    commitSize = 100;
    cacheSize = DEFAULT_CACHE_SIZE;
    replaceFields = false;
    preloadCache = false;
    useHash = false;
    hashField = "hashcode";
    int nrkeys = 0;

    allocate( nrkeys );

View on GitHub (pinned to f3058517a1)