{"record":{"id":"cb6175f60b80e68b","repo":"pentaho/pentaho-kettle","slug":"no-slave-server-specified-trans","errorCode":null,"errorMessage":"No slave server specified","messagePattern":"No slave server specified","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/trans/Trans.java","lineNumber":4332,"sourceCode":"    return result;\n  }\n\n  /**\n   * Send the transformation for execution to a Carte slave server.\n   *\n   * @param transMeta              the transformation meta-data\n   * @param executionConfiguration the transformation execution configuration\n   * @param repository             the repository\n   * @return The Carte object ID on the server.\n   * @throws KettleException if any errors occur during the dispatch to the slave server\n   */\n  public static String sendToSlaveServer( TransMeta transMeta, TransExecutionConfiguration executionConfiguration,\n                                          Repository repository, IMetaStore metaStore ) throws KettleException {\n    String carteObjectId;\n    SlaveServer slaveServer = executionConfiguration.getRemoteServer();\n\n    if ( slaveServer == null ) {\n      throw new KettleException( \"No slave server specified\" );\n    }\n    if ( Utils.isEmpty( transMeta.getName() ) ) {\n      throw new KettleException( \"The transformation needs a name to uniquely identify it by on the remote server.\" );\n    }\n\n    // Inject certain internal variables to make it more intuitive.\n    //\n    Map<String, String> vars = new HashMap<>();\n\n    for ( String var : Const.INTERNAL_TRANS_VARIABLES ) {\n      vars.put( var, transMeta.getVariable( var ) );\n    }\n    for ( String var : Const.INTERNAL_JOB_VARIABLES ) {\n      vars.put( var, transMeta.getVariable( var ) );\n    }\n\n    executionConfiguration.getVariables().putAll( vars );\n    slaveServer.injectVariables( executionConfiguration.getVariables() );","sourceCodeStart":4314,"sourceCodeEnd":4350,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/trans/Trans.java#L4314-L4350","documentation":"Thrown by the static Trans.sendToSlaveServer(...) when sending a transformation for remote/clustered execution but the execution configuration has no remote server set: executionConfiguration.getRemoteServer() returned null, so there is nowhere to send the transformation.","triggerScenarios":"Calling Trans.sendToSlaveServer (directly or via Spoon's 'Run remotely') with a TransExecutionConfiguration whose remoteServer property was never set (setRemoteServer not called or set to null).","commonSituations":"Programmatic remote execution where the developer forgot setRemoteServer(slaveServer); configuration loaded from XML/JSON lacking the remote server entry; UI selection of slave lost before send.","solutions":["Set the target slave before sending: executionConfiguration.setRemoteServer(slaveServer).","Obtain the SlaveServer from the repository metadata or cluster schema instead of constructing ad hoc.","If execution should be local, use the local execution path instead of sendToSlaveServer.","Validate the configuration (remote server non-null) before invoking sendToSlaveServer."],"exampleFix":"// before\nTrans.sendToSlaveServer(transMeta, executionConfiguration, repository, metaStore);\n// after\nif (executionConfiguration.getRemoteServer() == null) {\n  executionConfiguration.setRemoteServer(repository.loadSlaveServer(\"carte-slave-1\", null));\n}\nTrans.sendToSlaveServer(transMeta, executionConfiguration, repository, metaStore);","handlingStrategy":"validation","validationCode":"if (executionConfiguration == null || executionConfiguration.getRemoteServer() == null) {\n  throw new IllegalArgumentException(\"executionConfiguration.remoteServer must be set before remote execution\");\n}\nTrans.sendToSlaveServer(transMeta, executionConfiguration, repository, metaStore);","typeGuard":"boolean hasRemoteServer(TransExecutionConfiguration c) {\n  return c != null && c.getRemoteServer() != null;\n}","tryCatchPattern":"try {\n  Trans.sendToSlaveServer(transMeta, config, repository, metaStore);\n} catch (KettleException e) {\n  if (\"No slave server specified\".equals(e.getMessage())) {\n    log.error(\"Remote server not configured; set executionConfiguration.setRemoteServer(...)\", e);\n  } else throw e;\n}","preventionTips":["Always call setRemoteServer before sendToSlaveServer.","Load SlaveServer objects from the repository, not ad hoc construction.","For local runs, use the local execution path instead of the remote sender.","Centralize remote-exec configuration in one validated helper."],"tags":["kettle","remote-execution","configuration","validation"],"backgroundTag":"missing-required-argument","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"}