{"record":{"id":"b24ebc471f456b3d","repo":"pentaho/pentaho-kettle","slug":"jobtrans-exception-unabletofindremoteslaveserver","errorCode":null,"errorMessage":"JobTrans.Exception.UnableToFindRemoteSlaveServer","messagePattern":"JobTrans\\.Exception\\.UnableToFindRemoteSlaveServer","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/job/entries/job/JobEntryJob.java","lineNumber":937,"sourceCode":"            }\n            remoteSlaveServer = executionConfiguration.getRemoteServer();\n            doFallback = false;\n          } catch ( KettleException e ) {\n            log.logError( e.getMessage(), getName() );\n            result.setNrErrors( 1 );\n            result.setResult( false );\n            return result;\n          }\n        }\n\n        if ( doFallback ) {\n          // Figure out the remote slave server...\n          //\n          if ( !Utils.isEmpty( remoteSlaveServerName ) ) {\n            String realRemoteSlaveServerName = environmentSubstitute( remoteSlaveServerName );\n            remoteSlaveServer = parentJob.getJobMeta().findSlaveServer( realRemoteSlaveServerName );\n            if ( remoteSlaveServer == null ) {\n              throw new KettleException( BaseMessages.getString(\n                PKG, \"JobTrans.Exception.UnableToFindRemoteSlaveServer\", realRemoteSlaveServerName ) );\n            }\n          }\n        }\n\n        if ( remoteSlaveServer == null ) {\n          // Local execution...\n          //\n\n          // Create a new job\n          //\n          job = new Job( rep, jobMeta, this );\n          job.setParentJob( parentJob );\n          job.setLogLevel( jobLogLevel );\n          job.shareVariablesWith( this );\n          job.setInternalKettleVariables( this );\n          job.copyParametersFrom( jobMeta );\n          job.setInteractive( parentJob.isInteractive() );","sourceCodeStart":919,"sourceCodeEnd":955,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/job/entries/job/JobEntryJob.java#L919-L955","documentation":"When the Job entry is configured to run the sub-job on a cluster/slave (executing remotely), execute() looks up the slave server by its (variable-substituted) name via parentJob.getJobMeta().findSlaveServer(). If no registered slave server matches, this KettleException with message 'JobTrans.Exception.UnableToFindRemoteSlaveServer' (with the name) is thrown.","triggerScenarios":"Executing remotely with remoteSlaveServerName set (e.g. 'slave1' or '${SLAVE}') where findSlaveServer() returns null — the name doesn't match any slave defined in the job meta / cluster schema, or the variable substitutes to a misspelled/unknown name.","commonSituations":"Typo in slave server name; variable not defined so it substitutes literally; slave server deleted from the cluster schema; moving the job between environments where slave registry differs.","solutions":["Verify the slave server name in the entry dialog exactly matches a slave defined in the job's cluster schema / slave server list","Check that any variable in the remote slave server field resolves correctly at runtime","Re-add or restore the missing slave server definition in Spoon","Log the substituted name (environmentSubstitute(remoteSlaveServerName)) and compare against available slave servers"],"exampleFix":"// before: Slave server name: ${SLAVE_HOST}\n// after: fail fast with a defined default\nsetVariable(\"SLAVE_HOST\", Const.NVL(getVariable(\"SLAVE_HOST\"), \"slave1\"));\n// and in code, validate before execute:\nif (parentJob.getJobMeta().findSlaveServer(environmentSubstitute(remoteSlaveServerName)) == null) {\n  throw new KettleException(\"Configured slave not registered: \" + remoteSlaveServerName);\n}","handlingStrategy":"validation","validationCode":"String realName = jobEntry.environmentSubstitute(jobEntry.getRemoteSlaveServerName());\nif (realName != null && !realName.isEmpty()\n    && parentJob.getJobMeta().findSlaveServer(realName) == null) {\n  throw new IllegalArgumentException(\"Slave server not registered: \" + realName);\n}","typeGuard":null,"tryCatchPattern":"try {\n  jobEntry.execute(result, nr);\n} catch (KettleException e) {\n  if (e.getMessage().contains(\"UnableToFindRemoteSlaveServer\")) {\n    // log available slave servers and abort; do not retry blindly\n  }\n  throw e;\n}","preventionTips":["Copy the slave server name exactly from the cluster schema dialog, don't type it","Define any variables used in the slave server field before the job runs","Keep slave server definitions in sync across environments","Verify the remote/slave server exists before enabling remote execution"],"tags":["pdi","kettle","cluster","slave-server"],"backgroundTag":"entity-not-found","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"}