pentaho/pentaho-kettle · error · RuntimeException

Unexpected error encountered, probably encoding/decoding…

Error message

Unexpected error encountered, probably encoding/decoding base64 data

What it means

Thrown by RemoteStep.getXML during serialization when RowMeta.getMetaXML() throws an IOException while base64-encoding the row metadata for the XML representation. This indicates an internal failure in the base64 encode/decode machinery, not a user problem.

Solutions

  1. Inspect the wrapped IOException cause for the actual encoding failure.
  2. Verify the JVM's default charset and available charsets are intact (Charset.availableCharsets()).
  3. Retry serialization in a clean JVM; if reproducible, report as a Kettle bug with the cause stack.
  4. As a workaround, null out or rebuild the rowMeta before calling getXML().
Defensive patterns

Strategy: try-catch

Try / catch

try { String xml = remoteStep.getXML(); } catch (RuntimeException e) { if (e.getMessage().contains("encoding/decoding base64")) { log.error("Base64 serialization failed", e.getCause()); } else { throw e; } }

Prevention

When it happens

Trigger: Calling getXML() on a RemoteStep whose rowMeta is non-null and whose internal serialization to base64 fails with an IOException from the underlying encoder.

Common situations: Rare environment-level issues such as corrupted JVM charset providers or a broken/patched encoder; practically an internal-invariant situation during clustering serialization.

Understand the failure class

Background: json.Marshal / "failed to marshal" errors in Go: why "unsupported type" happens and how to fix it — this error's family across 22 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/step/RemoteStep.java:188

    xml.append( XMLHandler.addTagValue( "hostname", hostname, false ) );
    xml.append( XMLHandler.addTagValue( "remote_hostname", remoteHostname, false ) );
    xml.append( XMLHandler.addTagValue( "port", port, false ) );
    xml.append( XMLHandler.addTagValue( "buffer_size", bufferSize, false ) );
    xml.append( XMLHandler.addTagValue( "compressed_streams", compressingStreams, false ) );

    xml.append( XMLHandler.addTagValue( "source_step_name", sourceStep, false ) );
    xml.append( XMLHandler.addTagValue( "source_step_copy", sourceStepCopyNr, false ) );
    xml.append( XMLHandler.addTagValue( "target_step_name", targetStep, false ) );
    xml.append( XMLHandler.addTagValue( "target_step_copy", targetStepCopyNr, false ) );

    xml.append( XMLHandler.addTagValue( "source_slave_server_name", sourceSlaveServerName, false ) );
    xml.append( XMLHandler.addTagValue( "target_slave_server_name", targetSlaveServerName, false ) );

    if ( rowMeta != null ) {
      try {
        xml.append( rowMeta.getMetaXML() );
      } catch ( IOException e ) {
        throw new RuntimeException( "Unexpected error encountered, probably encoding/decoding base64 data", e );
      }
    }
    xml.append( XMLHandler.addTagValue( "encrypted_streams", encryptingStreams, false ) );
    try {
      xml.append( XMLHandler.addTagValue( "key", key ) );
    } catch ( Exception ex ) {
      baseStep.logError( "Unable to parse key", ex );
    }
    xml.append( XMLHandler.closeTag( XML_TAG ) );
    return xml.toString();
  }

  public RemoteStep( Node node ) throws KettleException {

    hostname = XMLHandler.getTagValue( node, "hostname" );
    remoteHostname = XMLHandler.getTagValue( node, "remote_hostname" );
    port = XMLHandler.getTagValue( node, "port" );
    bufferSize = Integer.parseInt( XMLHandler.getTagValue( node, "buffer_size" ) );

View on GitHub (pinned to f3058517a1)