pentaho/pentaho-kettle · error · KettleException

PanTransformationDelegate.Error.NoExecutionTypeSpecified

Error message

PanTransformationDelegate.Error.NoExecutionTypeSpecified

What it means

executeBasedOnConfiguration throws KettleException when the TransExecutionConfiguration requests neither local, remote, nor clustered execution — none of the executor branches match. Every pan run must set an execution type.

Solutions

  1. Set an execution mode, e.g. executionConfiguration.setExecutingLocally(true) (or setLocal(true) depending on version)
  2. For remote runs, call setRemoteServer(new SlaveServer(...)) which also sets the remote flag
  3. Use TransExecutionConfigurationFactory / delegate's createDefaultConfiguration for a sane default
  4. Inspect the flags with getRemoteServer()/isExecutingClustered() before calling execute

Example fix

// before
TransExecutionConfiguration cfg = new TransExecutionConfiguration();
delegate.executeTransformation(trans, cfg, args);
// after
TransExecutionConfiguration cfg = new TransExecutionConfiguration();
cfg.setExecutingLocally(true);
delegate.executeTransformation(trans, cfg, args);
Defensive patterns

Strategy: validation

Validate before calling

TransExecutionConfiguration cfg = ...;
if (!cfg.isExecutingLocally() && !cfg.isExecutingRemoted() && !cfg.isExecutingClustered()) {
  cfg.setExecutingLocally(true); // or fail fast
  // or: throw new IllegalStateException("No execution type set on configuration");
}

Type guard

static boolean hasExecutionType(TransExecutionConfiguration c) {
  return c != null && (c.isExecutingLocally() || c.isExecutingRemoted() || c.isExecutingClustered());
}

Try / catch

try {
  delegate.executeTransformation(trans, cfg, args);
} catch (KettleException e) {
  if (e.getMessage() != null && e.getMessage().endsWith("NoExecutionTypeSpecified")) {
    cfg.setExecutingLocally(true);
    // retry or report misconfiguration
  } else throw e;
}

Prevention

When it happens

Trigger: Passing a TransExecutionConfiguration where isExecutingLocally(), isExecutingRemoted(), and isExecutingClustered() all return false, then invoking the delegate's executeTransformation.

Common situations: Programmatic pan usage building a custom configuration without calling setExecutingClustered/setRemoteServer/setLocal; a config deserialized from XML that lost its execution flags.

Understand the failure class

Background: "Must pass :limit option" / "Missing required option" — required option errors explained — this error's family across 41 libraries.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/pan/delegates/PanTransformationDelegate.java:149

  /**
   * Execute transformation based on the execution configuration type.
   */
  private Result executeBasedOnConfiguration( TransMeta transMeta,
                                              TransExecutionConfiguration executionConfiguration,
                                              String[] arguments ) throws KettleException {

    if ( executionConfiguration.isExecutingLocally() ) {
      return transformationExecutorServiceMap.get( LOCAL )
        .execute( log, transMeta, repository, executionConfiguration, arguments );
    } else if ( executionConfiguration.isExecutingRemotely() ) {
      return transformationExecutorServiceMap.get( REMOTE )
        .execute( log, transMeta, repository, executionConfiguration, arguments );
    } else if ( executionConfiguration.isExecutingClustered() ) {
      return transformationExecutorServiceMap.get( CLUSTERED )
        .execute( log, transMeta, repository, executionConfiguration, arguments );

    } else {
      throw new KettleException( BaseMessages.getString( pkg, "PanTransformationDelegate.Error.NoExecutionTypeSpecified" ) );
    }
  }

  /**
   * Create a default execution configuration for command-line execution.
   */
  public TransExecutionConfiguration createDefaultExecutionConfiguration() {
    TransExecutionConfiguration config = new TransExecutionConfiguration();

    // Set defaults for command-line execution
    config.setExecutingLocally( true );
    config.setExecutingRemotely( false );
    config.setExecutingClustered( false );
    config.setClearingLog( true );
    config.setSafeModeEnabled( false );
    config.setGatheringMetrics( false );
    config.setLogLevel( LogLevel.BASIC );

View on GitHub (pinned to f3058517a1)