pentaho/pentaho-kettle · error · KettleException

There was an error posting the transformation on the remote…

Error message

There was an error posting the transformation on the remote server: 

What it means

Thrown by Trans.sendToSlaveServer(...) on the non-export path: the transformation configuration XML is POSTed to RegisterTransServlet via SlaveServer.sendXML(...), and the returned WebResult is not 'OK', meaning the remote server failed to register the transformation for later execution.

Solutions

  1. Read the appended webResult.getMessage() and the slave's carte.log to see why registration failed.
  2. Install the same plugins/steps on the slave as the submitting client.
  3. Check for proxies/limits that truncate or block large XML POST bodies.
  4. Verify Carte credentials/authorization for the register-trans servlet.
  5. Escape/normalize variable values (control characters) before building the configuration, or switch to the export path.

Example fix

// before: slave missing a custom step
String reply = slaveServer.sendXML(xml, RegisterTransServlet.CONTEXT_PATH + "/?xml=Y");
// after: verify plugin availability remotely first, then send
if (slaveServer.getServerInfo() == null) throw new KettleException("Slave unreachable");
// deploy matching plugins to the slave, then:
String reply = slaveServer.sendXML(xml, RegisterTransServlet.CONTEXT_PATH + "/?xml=Y");
Defensive patterns

Strategy: try-catch

Validate before calling

// verify slave reachable and info available before registering the transformation
if (slaveServer.getServerInfo() == null) {
  throw new KettleException("Slave " + slaveServer.getName() + " not reachable for registration");
}

Try / catch

try {
  Trans.sendToSlaveServer(transMeta, config, repository, metaStore);
} catch (KettleException e) {
  if (e.getMessage() != null && e.getMessage().contains("posting the transformation")) {
    log.error("Slave failed to register transformation: " + e.getMessage(), e);
    // install missing plugins / check carte.log, then retry
  } else throw e;
}

Prevention

When it happens

Trigger: Remote execution without resource exporting: slaveServer.sendXML(TransConfiguration XML, RegisterTransServlet) returns an error WebResult because the slave could not parse/store the submitted transformation configuration.

Common situations: Missing steps/plugins on the remote server causing TransMeta load failure; XML truncated by proxy or size limit; authentication rejection returned as non-OK result; character-encoding issues in variable values embedded in the XML.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/Trans.java:4393

            topLevelResource.getArchiveName(),
            RegisterPackageServlet.TYPE_TRANS,
            topLevelResource.getBaseResourceName() );
          WebResult webResult = WebResult.fromXMLString( result );
          if ( !webResult.getResult().equalsIgnoreCase( WebResult.STRING_OK ) ) {
            throw new KettleException( "There was an error passing the exported transformation to the remote server: "
              + Const.CR + webResult.getMessage() );
          }
          carteObjectId = webResult.getId();
        }
      } else {

        // Now send it off to the remote server...
        //
        String xml = new TransConfiguration( transMeta, executionConfiguration ).getXML();
        String reply = slaveServer.sendXML( xml, RegisterTransServlet.CONTEXT_PATH + "/?xml=Y" );
        WebResult webResult = WebResult.fromXMLString( reply );
        if ( !webResult.getResult().equalsIgnoreCase( WebResult.STRING_OK ) ) {
          throw new KettleException( "There was an error posting the transformation on the remote server: " + Const.CR
            + webResult.getMessage() );
        }
        carteObjectId = webResult.getId();
      }

      // Prepare the transformation
      //
      String reply =
        slaveServer.execService( PrepareExecutionTransServlet.CONTEXT_PATH + "/?name=" + URLEncoder.encode( transMeta
          .getName(), "UTF-8" ) + "&xml=Y&id=" + carteObjectId );
      WebResult webResult = WebResult.fromXMLString( reply );
      if ( !webResult.getResult().equalsIgnoreCase( WebResult.STRING_OK ) ) {
        throw new KettleException( "There was an error preparing the transformation for excution on the remote server: "
          + Const.CR + webResult.getMessage() );
      }

      // Start the transformation
      //

View on GitHub (pinned to f3058517a1)