pentaho/pentaho-kettle · error · KettleXMLException

LucidDBStreamingLoaderMeta.Exception.UnableToReadStepInfoFromXML

LucidDBStreamingLoaderMeta.Exception.UnableToReadStepInfoFromXML

Error message

LucidDBStreamingLoaderMeta.Exception.UnableToReadStepInfoFromXML

What it means

readData() in LucidDBStreamingLoaderMeta parses the step's XML definition (stepnode) when a transformation is loaded, and wraps any exception (malformed XML, missing nodes like 'fields' or 'tab_is_enable_mapping', wrong tag values) into a KettleXMLException with this localized message. It signals that the LucidDB Streaming Loader step's metadata could not be read from the .ktr file.

Solutions

  1. Open the .ktr in a text editor and verify the LucidDBStreamingLoader <step> XML block contains the expected tags ('fields', 'field_name', 'field_table', 'tab_is_enable_mapping', 'tab_is_enable').
  2. Ensure the pentaho-lucid-db-streaming-loader plugin version loading the file is >= the version that saved it; upgrade the plugin or re-save the transformation in the newer tool.
  3. Restore the transformation from backup/source control and re-configure the step.
  4. If hand-editing, fix the malformed/missing node in the XML and reload.

Example fix

// before (hand-edited XML missing mapping nodes)
<tab_is_enable_mapping/>
// after (each mapping entry present with both tags)
<tab_is_enable_mapping><tab_name>MYTABLE</tab_name><tab_is_enable>Y</tab_is_enable></tab_is_enable_mapping>
Defensive patterns

Strategy: try-catch

Validate before calling

Node steps = XMLHandler.getSubNode(stepnode, "fields");
if (steps == null || XMLHandler.countNodes(steps, "field") == 0) {
  throw new IllegalArgumentException("LucidDBStreamingLoader step XML has no fields block");
}

Type guard

if (stepnode == null || XMLHandler.getSubNode(stepnode, "fields") == null) return false;

Try / catch

try {
  meta.loadXML(stepnode, databases, metaStore);
} catch (KettleXMLException e) {
  logError("Failed to read LucidDB Streaming Loader step metadata", e);
  throw e; // or fall back to setDefault()
}

Prevention

When it happens

Trigger: loadXML() calls readData(stepnode); readData throws when XMLHandler calls fail or return unexpected values inside its try block — e.g. a .ktr saved by a newer/different plugin version missing the 'fields' entries or 'tab_is_enable_mapping' sub-nodes this reader expects.

Common situations: Opening a transformation whose LucidDB Streaming Loader step XML was hand-edited or corrupted; loading a .ktr produced by a newer Pentaho version into an older one; plugin jar version mismatch between save and load.

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/187e5cac46cecdfe. Report an issue: GitHub.

Appendix: source

Thrown at plugins/lucid-db-streaming-loader/core/src/main/java/org/pentaho/di/trans/steps/luciddbstreamingloader/LucidDBStreamingLoaderMeta.java:249

        fieldStreamForFields[i] = XMLHandler.getTagValue( vnode, "field_stream_name" );
        if ( fieldStreamForFields[i] == null ) {
          fieldStreamForFields[i] = fieldTableForFields[i]; // default:
        }
        // the
        // same
        // name!
        insOrUptFlag[i] = "Y".equalsIgnoreCase( XMLHandler.getTagValue( vnode, "insert_or_update_flag" ) );

      }

      for ( int i = 0; i < nrTabIsEnable; i++ ) {
        Node vnode = XMLHandler.getSubNodeByNr( stepnode, "tab_is_enable_mapping", i );
        tabIsEnable[i] = "Y".equalsIgnoreCase( XMLHandler.getTagValue( vnode, "tab_is_enable" ) );

      }

    } catch ( Exception e ) {
      throw new KettleXMLException( BaseMessages.getString(
        PKG, "LucidDBStreamingLoaderMeta.Exception.UnableToReadStepInfoFromXML" ), e );
    }
  }

  public void setDefault() {
    databaseMeta = null;
    schemaName = "";
    tableName = BaseMessages.getString( PKG, "LucidDBStreamingLoaderMeta.DefaultTableName" );
    host = "localhost";
    port = "9034";
    operation = "MERGE";
    allocate( 0, 0, 0 );
  }

  public String getXML() {
    StringBuffer retval = new StringBuffer( 300 );

    retval

View on GitHub (pinned to f3058517a1)