{"record":{"id":"0c9486f7a69147c0","repo":"pentaho/pentaho-kettle","slug":"an-error-occurred-sending-a-slave-transformation","errorCode":null,"errorMessage":"An error occurred sending a slave transformation: ","messagePattern":"An error occurred sending a slave transformation: ","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/Trans.java","lineNumber":3862,"sourceCode":"                variables.put( Const.INTERNAL_VARIABLE_CLUSTER_SIZE, Integer.toString( slaves.length ) );\n                variables.put( Const.INTERNAL_VARIABLE_CLUSTER_MASTER, \"N\" );\n\n                // Parameters override the variables but they need to pass over the configuration too...\n                //\n                Map<String, String> params = slaveTransExecutionConfiguration.getParams();\n                TransMeta ot = transSplitter.getOriginalTransformation();\n                for ( String param : ot.listParameters() ) {\n                  String value =\n                    Const.NVL( ot.getParameterValue( param ), Const.NVL( ot.getParameterDefault( param ), ot\n                      .getVariable( param ) ) );\n                  params.put( param, value );\n                }\n\n                String slaveReply =\n                  slaves[ index ].sendXML( transConfiguration.getXML(), RegisterTransServlet.CONTEXT_PATH + \"/?xml=Y\" );\n                WebResult webResult = WebResult.fromXMLString( slaveReply );\n                if ( !webResult.getResult().equalsIgnoreCase( WebResult.STRING_OK ) ) {\n                  throw new KettleException( \"An error occurred sending a slave transformation: \" + webResult\n                    .getMessage() );\n                }\n                carteObjectMap.put( slaveTrans, webResult.getId() );\n              } catch ( Throwable t ) {\n                errors[ index ] = t;\n              }\n            }\n          };\n          threads[ i ] = new Thread( runnable );\n        }\n      }\n\n      // Start the slaves\n      for ( int i = 0; i < threads.length; i++ ) {\n        if ( threads[ i ] != null ) {\n          threads[ i ].start();\n        }\n      }","sourceCodeStart":3844,"sourceCodeEnd":3880,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/Trans.java#L3844-L3880","documentation":"In executeClustered, each slave transformation's XML is registered on its Carte slave server; a non-OK WebResult causes this KettleException (per slave thread, captured into the errors array). The Carte-side message is appended to the message.","triggerScenarios":"executeClustered sends slaveTrans.getXML() to each slave via sendXML(..., RegisterTransServlet.CONTEXT_PATH + \"/?xml=Y\") and the slave responds with a failed WebResult.","commonSituations":"One or more Carte slaves are down, overloaded, or unreachable; slave rejects registration because of a name/ID conflict; version mismatch between client and slave PDI; network/firewall blocking the slave port.","solutions":["Check webResult.getMessage() (appended) and the errors[index] Throwable for the exact slave failure","Confirm every slave in the cluster schema is running (curl the slave's status URL) and reachable on its port","Look for duplicate registered transformations on the slave and clean up stale Carte registrations","Match PDI/kettle versions across client, master, and slaves"],"exampleFix":"// before: slave 2 of 3 is down\nslaves[2] = new SlaveServer(\"slave2\", \"dead-host\", 8082, ...);\n// after\nslaves[2] = new SlaveServer(\"slave2\", \"live-host\", 8082, \"cluster\", \"cluster\");","handlingStrategy":"validation","validationCode":"// health-check all slaves before executeClustered\nfor (SlaveServer slave : clusterSchema.getSlaves()) {\n  if (!slave.getSlaveServerMonitor().getStatusSummary().isRunning()) {\n    throw new IllegalStateException(\"Slave down: \" + slave.getName());\n  }\n}","typeGuard":null,"tryCatchPattern":"try {\n  TransSplitter splitter = Trans.executeClustered(transMeta, config);\n} catch (KettleException e) {\n  if (e.getMessage().startsWith(\"An error occurred sending a slave transformation:\")) {\n    logError(\"Slave registration failed: \" + e.getMessage());\n  } else { throw e; }\n}","preventionTips":["Health-check every slave Carte before launching clustered runs","Clean up stale transformation registrations on slaves (Carte status page)","Verify firewall rules allow client-to-slave ports","Match kettle/PDI versions across client, master and all slaves"],"tags":["cluster","carte","network"],"backgroundTag":"api-error-response","analyzedSha":"f3058517a153da500bf4551f46d79b91bf8ec552","analyzedAt":"2026-09-13T14:04:16.340Z","contentChangedAt":"2026-09-13T14:04:16.340Z","schemaVersion":2},"datasetVersion":"2026-09-20T23:17:15.980Z"}