diff --git a/amoro-ams/src/main/java/org/apache/amoro/server/process/ProcessService.java b/amoro-ams/src/main/java/org/apache/amoro/server/process/ProcessService.java index e10d81845d..f07e16f399 100644 --- a/amoro-ams/src/main/java/org/apache/amoro/server/process/ProcessService.java +++ b/amoro-ams/src/main/java/org/apache/amoro/server/process/ProcessService.java @@ -356,6 +356,25 @@ private void executeOrTraceProcess(TableProcessStore store, TableProcess process store.getExecutionEngine(), store.getAction(), process.getTableIdentifier()); + // Leaving the PENDING process tracked blocks this action forever (hasAliveTableProcess + // gates every later tick, and a restart repeats the same failure). Mark it FAILED so the + // record is visible, then untrack so the table can be scheduled again. + try { + store.tryTransitState( + ProcessStatus.FAILED, + ProcessEvent.COMPLETE_FAILED, + store.getExternalProcessIdentifier(), + String.format( + "Execution engine not found: %s (action=%s)", + store.getExecutionEngine(), store.getAction()), + store.getProcessParameters(), + store.getSummary()); + } catch (Throwable t) { + LOG.error( + "Failed to mark process {} as FAILED for missing engine", store.getProcessId(), t); + } + untrackTableProcessInstance( + process.getTableRuntime().getTableIdentifier(), store.getProcessId()); return; }