pentaho/pentaho-kettle · error · RuntimeException

Unexpected error in calling extension point upon step finish

Error message

Unexpected error in calling extension point upon step finish

What it means

When a step in the transformation finishes, Trans registers a StepListener whose stepFinished() callback fires the StepFinished extension point. If that extension point plugin throws a KettleException, it is wrapped in a RuntimeException with this message. As with 1160, the step/transformation ran; the failure is in a plugin observing the step-finish event.

Solutions

  1. Inspect the cause exception to identify the failing StepFinished extension point plugin
  2. Fix the plugin's handling of the Trans/StepMeta/StepInterface combination passed to it
  3. Update or remove the offending plugin from plugins/
  4. Add internal try/catch + logging in the plugin so step-finish failures do not propagate

Example fix

// before
public void stepFinished(Trans trans, StepMeta stepMeta, StepInterface step) {
  plugin.notify(step);
}
// after
public void stepFinished(Trans trans, StepMeta stepMeta, StepInterface step) {
  try { plugin.notify(step); }
  catch (Exception e) { trans.getLogChannel().logError("StepFinished plugin failed", e); }
}
Defensive patterns

Strategy: try-catch

Validate before calling

// verify step-finish plugins before run
KettleExtensionPoint.StepFinished.getExtensions(); // inspect registered plugin ids and their health

Type guard

boolean isStepFinishPluginError(RuntimeException e) {
  return "Unexpected error in calling extension point upon step finish".equals(e.getMessage());
}

Try / catch

try {
  trans.execute(args); trans.waitUntilFinished();
} catch (RuntimeException e) {
  if ("Unexpected error in calling extension point upon step finish".equals(e.getMessage())) {
    log.warn("StepFinished extension point plugin failed", e.getCause());
  } else throw e;
}

Prevention

When it happens

Trigger: A plugin registered under KettleExtensionPoint.StepFinished throws a KettleException from its callExtensionPoint() while processing the step-finished event for any step in the transformation.

Common situations: Custom step-finish audit/notification plugins failing on network or DB access; plugin code assuming a different object type in the 'combi' (StepMeta/StepInterface) argument; version-mismatched plugin APIs.

Related errors


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

Appendix: source

Thrown at engine/src/main/java/org/pentaho/di/trans/Trans.java:1569

        // Now start all the threads...
        //
        for ( int i = 0; i < steps.size(); i++ ) {
          final StepMetaDataCombi combi = steps.get( i );
          RunThread runThread = new RunThread( combi );
          Thread thread = new Thread( runThread );
          thread.setName( getName() + " - " + combi.stepname );
          ExtensionPointHandler.callExtensionPoint( log, KettleExtensionPoint.StepBeforeStart.id, combi );
          // Call an extension point at the end of the step
          //
          combi.step.addStepListener( new StepAdapter() {

            @Override
            public void stepFinished( Trans trans, StepMeta stepMeta, StepInterface step ) {
              try {
                ExtensionPointHandler.callExtensionPoint( log, KettleExtensionPoint.StepFinished.id, combi );
              } catch ( KettleException e ) {
                throw new RuntimeException( "Unexpected error in calling extension point upon step finish", e );
              }
            }

          } );

          thread.start();
        }
        break;

      case SerialSingleThreaded:
        new Thread( new Runnable() {
          @Override
          public void run() {
            try {
              // Always disable thread priority management, it will always slow us
              // down...
              //
              for ( StepMetaDataCombi combi : steps ) {

View on GitHub (pinned to f3058517a1)