{"record":{"id":"3df22a9c67708873","repo":"pentaho/pentaho-kettle","slug":"pantransformationdelegate-error-noremoteserverspecified","errorCode":null,"errorMessage":"PanTransformationDelegate.Error.NoRemoteServerSpecified","messagePattern":"PanTransformationDelegate\\.Error\\.NoRemoteServerSpecified","errorType":"exception","errorClass":"KettleException","httpStatus":null,"severity":"error","filePath":"engine/src/main/java/org/pentaho/di/pan/executors/RemoteTransExecutorService.java","lineNumber":51,"sourceCode":"\n  /**\n   * Executes a transformation on a remote server.\n   *\n   * @param log the log channel interface for logging\n   * @param transMeta the transformation metadata\n   * @param repository the repository (can be null)\n   * @param executionConfiguration the execution configuration\n   * @param arguments the command-line arguments\n   * @return the result of the transformation execution\n   * @throws KettleException if an error occurs during execution\n   */\n  @Override\n  public Result execute( LogChannelInterface log, TransMeta transMeta, Repository repository,\n                         TransExecutionConfiguration executionConfiguration, String[] arguments ) throws KettleException {\n    log.logBasic( BaseMessages.getString( pkg, \"PanTransformationDelegate.Log.ExecutingRemotely\" ) );\n\n    if ( executionConfiguration.getRemoteServer() == null ) {\n      throw new KettleException( BaseMessages.getString( pkg, \"PanTransformationDelegate.Error.NoRemoteServerSpecified\" ) );\n    }\n\n    // Send transformation to slave server\n    String carteObjectId = Trans.sendToSlaveServer( transMeta, executionConfiguration, repository, MetaStoreConst.getDefaultMetastore() );\n\n    // Monitor remote transformation\n    monitorRemoteTransformation( log, transMeta, carteObjectId, executionConfiguration.getRemoteServer() );\n\n    // For command-line execution, we typically return a simple success result\n    // In a real implementation, you might want to fetch the actual result from the remote server\n    Result result = new Result();\n    result.setResult( true );\n    return result;\n  }\n\n  /**\n   * Monitors the execution of a remote transformation.\n   *","sourceCodeStart":33,"sourceCodeEnd":69,"githubUrl":"https://github.com/pentaho/pentaho-kettle/blob/f3058517a153da500bf4551f46d79b91bf8ec552/engine/src/main/java/org/pentaho/di/pan/executors/RemoteTransExecutorService.java#L33-L69","documentation":"RemoteTransExecutorService.execute throws KettleException when executing a transformation remotely but executionConfiguration.getRemoteServer() is null — there is no slave server defined to send the transformation to. The log already announced 'Executing remotely' before the check.","triggerScenarios":"Invoking the remote executor with isExecutingRemoted()==true but no SlaveServer set via setRemoteServer().","commonSituations":"Cluster/remote scripts that set the remote flag but forget -host/-port; configuration copied from a local run; slave server object cleared by later config mutation.","solutions":["Set a remote server: executionConfiguration.setRemoteServer(new SlaveServer(\"slave\",\"host\",8080,\"user\",\"pass\"))","When using pan, pass the remote host/port options so the configuration builder populates remoteServer","Verify with executionConfiguration.getRemoteServer() != null before invoking the remote path"],"exampleFix":"// before\ncfg.setExecutingRemoted(true); // remoteServer never set\n// after\nSlaveServer slave = new SlaveServer(\"slave1\", \"192.168.1.10\", 8080, \"cluster\", \"cluster\");\ncfg.setRemoteServer(slave);\ncfg.setExecutingRemoted(true);","handlingStrategy":"validation","validationCode":"if (cfg.isExecutingRemoted() && cfg.getRemoteServer() == null) {\n  throw new IllegalStateException(\"Remote execution requested but remoteServer not set — call setRemoteServer(new SlaveServer(...))\");\n}","typeGuard":"static boolean hasRemoteServer(TransExecutionConfiguration c) {\n  return c != null && c.getRemoteServer() != null;\n}","tryCatchPattern":"try {\n  result = remoteService.execute(log, transMeta, repository, cfg, args);\n} catch (KettleException e) {\n  if (e.getMessage() != null && e.getMessage().endsWith(\"NoRemoteServerSpecified\")) {\n    throw new ConfigurationException(\"Provide -host/-port or setRemoteServer(...) for remote execution\", e);\n  }\n  throw e;\n}","preventionTips":["Always pair setExecutingRemoted(true) with setRemoteServer(...)","Ping the SlaveServer URL before dispatching","Build remote configs from explicit host/port parameters, not copied defaults","Validate config in a shared pre-flight method before any executor runs"],"tags":["pan","remote-execution","slave-server"],"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"}