{"record":{"id":"821ff19c669cdf50","repo":"pentaho/pentaho-kettle","slug":"no-slave-server-specified","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/job/Job.java","lineNumber":1721,"sourceCode":"   * @param jobMeta\n   *          the job meta\n   * @param executionConfiguration\n   *          the execution configuration\n   * @param repository\n   *          the repository\n   * @param metaStore\n   *          the metaStore\n   * @return the string\n   * @throws KettleException\n   *           the kettle exception\n   */\n  public static String sendToSlaveServer( JobMeta jobMeta, JobExecutionConfiguration 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( BaseMessages.getString( PKG, \"Job.Log.NoSlaveServerSpecified\" ) );\n    }\n    if ( Utils.isEmpty( jobMeta.getName() ) ) {\n      throw new KettleException( BaseMessages.getString( PKG, \"Job.Log.UniqueJobName\" ) );\n    }\n\n    // Align logging levels between execution configuration and remote server\n    slaveServer.getLogChannel().setLogLevel( executionConfiguration.getLogLevel() );\n\n    try {\n      // Inject certain internal variables to make it more intuitive.\n      //\n      for ( String var : Const.INTERNAL_TRANS_VARIABLES ) {\n        executionConfiguration.getVariables().put( var, jobMeta.getVariable( var ) );\n      }\n      for ( String var : Const.INTERNAL_JOB_VARIABLES ) {\n        executionConfiguration.getVariables().put( var, jobMeta.getVariable( var ) );\n      }\n","sourceCodeStart":1703,"sourceCodeEnd":1739,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/Job.java#L1703-L1739","documentation":"sendToSlaveServer() throws this KettleException when executionConfiguration.getRemoteServer() returns null, i.e. the caller requested remote/slated execution but never selected a slave (remote) server. The library cannot dispatch the job anywhere without a target Carte/Slave server.","triggerScenarios":"Calling Job.sendToSlaveServer(jobMeta, executionConfiguration, repository, metaStore) while JobExecutionConfiguration.remoteServer is unset; enabling 'execute remotely' in a caller (e.g. Spoon/Kitchen) without picking a remote host.","commonSituations":"Programmatic execution configurations built by hand that skip setRemoteServer(); UI metadata lost after export/import; cluster/slated setup where the master has no registered slaves.","solutions":["Set the remote server before calling sendToSlaveServer: executionConfiguration.setRemoteServer(slaveServer).","Load the slave server from the repository's cluster/slave schema instead of constructing it ad hoc.","If local execution was intended, do not mark the execution configuration as remote/executing on a server.","Verify slave registration so it appears in the available slave list to select."],"exampleFix":"// before\nJobExecutionConfiguration execCfg = new JobExecutionConfiguration();\nexecCfg.setExecutingRemotely(true); // remoteServer never set\nJob.sendToSlaveServer(jobMeta, execCfg, repo, metaStore);\n// after\nSlaveServer remote = new SlaveServer(\"carte1\", \"carte1.example.com\", \"8080\", \"cluster\", \"cluster\");\nexecCfg.setRemoteServer(remote);\nexecCfg.setExecutingRemotely(true);\nJob.sendToSlaveServer(jobMeta, execCfg, repo, metaStore);","handlingStrategy":"validation","validationCode":"if (execCfg.isExecutingRemotely() && execCfg.getRemoteServer() == null) {\n  throw new IllegalArgumentException(\"Remote server must be set for remote execution\");\n}","typeGuard":null,"tryCatchPattern":"try {\n  Job.sendToSlaveServer(jobMeta, execCfg, repo, metaStore);\n} catch (KettleException e) {\n  if (execCfg.getRemoteServer() == null) {\n    throw new ConfigurationException(\"No slave server configured\", e);\n  }\n  throw e;\n}","preventionTips":["Always pair setExecutingRemotely(true) with setRemoteServer(...).","Load slave definitions from the repository rather than hardcoding.","Validate the execution configuration before submission with a small preflight method.","Keep slave registrations in clusters so selection cannot be forgotten."],"tags":["remote-execution","configuration","job-execution"],"backgroundTag":"missing-required-config-field","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"}