From b2848a683a0d3c3b2d67c677d6de39c2a7dfe8e3 Mon Sep 17 00:00:00 2001 From: John Niang Date: Wed, 14 May 2025 14:26:43 +0800 Subject: [PATCH] Show stack trace while failing to start plugin --- .../app/core/reconciler/PluginReconciler.java | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/application/src/main/java/run/halo/app/core/reconciler/PluginReconciler.java b/application/src/main/java/run/halo/app/core/reconciler/PluginReconciler.java index a3cd0c1ae..a8c554331 100644 --- a/application/src/main/java/run/halo/app/core/reconciler/PluginReconciler.java +++ b/application/src/main/java/run/halo/app/core/reconciler/PluginReconciler.java @@ -14,6 +14,8 @@ import static run.halo.app.plugin.PluginUtils.isDevelopmentMode; import java.io.FileNotFoundException; import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; import java.net.MalformedURLException; import java.net.URISyntaxException; import java.net.URL; @@ -302,25 +304,34 @@ public class PluginReconciler implements Reconciler { return Result.requeue(Duration.ofSeconds(1)); } + PluginState pluginState; try { - var pluginState = pluginManager.startPlugin(pluginName); - if (!PluginState.STARTED.equals(pluginState)) { - throw new IllegalStateException(""" - Failed to start plugin %s(%s).\ - """.formatted(pluginName, pluginState)); - } + pluginState = pluginManager.startPlugin(pluginName); } catch (Throwable e) { log.debug("Error occurred when starting plugin {}", pluginName, e); + var writer = new StringWriter(); + e.printStackTrace(new PrintWriter(writer)); conditions.addAndEvictFIFO(Condition.builder() .type(ConditionType.READY) .status(ConditionStatus.FALSE) .reason(ConditionReason.START_ERROR) - .message(e.getMessage()) + .message(writer.toString()) .lastTransitionTime(clock.instant()) .build()); status.setPhase(Plugin.Phase.FAILED); return Result.doNotRetry(); } + if (!PluginState.STARTED.equals(pluginState)) { + conditions.addAndEvictFIFO(Condition.builder() + .type(ConditionType.READY) + .status(ConditionStatus.FALSE) + .reason(ConditionReason.START_ERROR) + .message("Failed to start plugin " + pluginName + "(" + pluginState + ").") + .lastTransitionTime(clock.instant()) + .build()); + status.setPhase(Plugin.Phase.FAILED); + return Result.doNotRetry(); + } removeConditionBy(conditions, ConditionType.PROGRESSING); status.setLastStartTime(clock.instant());