pentaho/pentaho-kettle · error · KettleException

PanTransformationDelegate.Error.NoRemoteServerSpecified

Error message

PanTransformationDelegate.Error.NoRemoteServerSpecified

What it means

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.

Solutions

  1. Set a remote server: executionConfiguration.setRemoteServer(new SlaveServer("slave","host",8080,"user","pass"))
  2. When using pan, pass the remote host/port options so the configuration builder populates remoteServer
  3. Verify with executionConfiguration.getRemoteServer() != null before invoking the remote path

Example fix

// before
cfg.setExecutingRemoted(true); // remoteServer never set
// after
SlaveServer slave = new SlaveServer("slave1", "192.168.1.10", 8080, "cluster", "cluster");
cfg.setRemoteServer(slave);
cfg.setExecutingRemoted(true);
Defensive patterns

Strategy: validation

Validate before calling

if (cfg.isExecutingRemoted() && cfg.getRemoteServer() == null) {
  throw new IllegalStateException("Remote execution requested but remoteServer not set — call setRemoteServer(new SlaveServer(...))");
}

Type guard

static boolean hasRemoteServer(TransExecutionConfiguration c) {
  return c != null && c.getRemoteServer() != null;
}

Try / catch

try {
  result = remoteService.execute(log, transMeta, repository, cfg, args);
} catch (KettleException e) {
  if (e.getMessage() != null && e.getMessage().endsWith("NoRemoteServerSpecified")) {
    throw new ConfigurationException("Provide -host/-port or setRemoteServer(...) for remote execution", e);
  }
  throw e;
}

Prevention

When it happens

Trigger: Invoking the remote executor with isExecutingRemoted()==true but no SlaveServer set via setRemoteServer().

Common situations: 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.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


AI-assisted analysis of pentaho/pentaho-kettle@f3058517a1 (2026-09-13). Data as JSON: /api/errors/3df22a9c67708873. Report an issue: GitHub.

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/pan/executors/RemoteTransExecutorService.java:51

  /**
   * Executes a transformation on a remote server.
   *
   * @param log the log channel interface for logging
   * @param transMeta the transformation metadata
   * @param repository the repository (can be null)
   * @param executionConfiguration the execution configuration
   * @param arguments the command-line arguments
   * @return the result of the transformation execution
   * @throws KettleException if an error occurs during execution
   */
  @Override
  public Result execute( LogChannelInterface log, TransMeta transMeta, Repository repository,
                         TransExecutionConfiguration executionConfiguration, String[] arguments ) throws KettleException {
    log.logBasic( BaseMessages.getString( pkg, "PanTransformationDelegate.Log.ExecutingRemotely" ) );

    if ( executionConfiguration.getRemoteServer() == null ) {
      throw new KettleException( BaseMessages.getString( pkg, "PanTransformationDelegate.Error.NoRemoteServerSpecified" ) );
    }

    // Send transformation to slave server
    String carteObjectId = Trans.sendToSlaveServer( transMeta, executionConfiguration, repository, MetaStoreConst.getDefaultMetastore() );

    // Monitor remote transformation
    monitorRemoteTransformation( log, transMeta, carteObjectId, executionConfiguration.getRemoteServer() );

    // For command-line execution, we typically return a simple success result
    // In a real implementation, you might want to fetch the actual result from the remote server
    Result result = new Result();
    result.setResult( true );
    return result;
  }

  /**
   * Monitors the execution of a remote transformation.
   *

View on GitHub (pinned to f3058517a1)