mirror of https://github.com/halo-dev/halo
Merge pull request #7429 from JohnNiang/refactor/improve-failure-message-of-plugin
Show stack trace while failing to start pluginpull/7441/head
commit
3148fc3e31
|
@ -14,6 +14,8 @@ import static run.halo.app.plugin.PluginUtils.isDevelopmentMode;
|
||||||
|
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.io.StringWriter;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URISyntaxException;
|
import java.net.URISyntaxException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
|
@ -302,25 +304,34 @@ public class PluginReconciler implements Reconciler<Request> {
|
||||||
return Result.requeue(Duration.ofSeconds(1));
|
return Result.requeue(Duration.ofSeconds(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PluginState pluginState;
|
||||||
try {
|
try {
|
||||||
var pluginState = pluginManager.startPlugin(pluginName);
|
pluginState = pluginManager.startPlugin(pluginName);
|
||||||
if (!PluginState.STARTED.equals(pluginState)) {
|
|
||||||
throw new IllegalStateException("""
|
|
||||||
Failed to start plugin %s(%s).\
|
|
||||||
""".formatted(pluginName, pluginState));
|
|
||||||
}
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
log.debug("Error occurred when starting plugin {}", pluginName, e);
|
log.debug("Error occurred when starting plugin {}", pluginName, e);
|
||||||
|
var writer = new StringWriter();
|
||||||
|
e.printStackTrace(new PrintWriter(writer));
|
||||||
conditions.addAndEvictFIFO(Condition.builder()
|
conditions.addAndEvictFIFO(Condition.builder()
|
||||||
.type(ConditionType.READY)
|
.type(ConditionType.READY)
|
||||||
.status(ConditionStatus.FALSE)
|
.status(ConditionStatus.FALSE)
|
||||||
.reason(ConditionReason.START_ERROR)
|
.reason(ConditionReason.START_ERROR)
|
||||||
.message(e.getMessage())
|
.message(writer.toString())
|
||||||
.lastTransitionTime(clock.instant())
|
.lastTransitionTime(clock.instant())
|
||||||
.build());
|
.build());
|
||||||
status.setPhase(Plugin.Phase.FAILED);
|
status.setPhase(Plugin.Phase.FAILED);
|
||||||
return Result.doNotRetry();
|
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);
|
removeConditionBy(conditions, ConditionType.PROGRESSING);
|
||||||
status.setLastStartTime(clock.instant());
|
status.setLastStartTime(clock.instant());
|
||||||
|
|
|
@ -72,7 +72,7 @@ const modal = ref();
|
||||||
{{ condition.reason || "-" }}
|
{{ condition.reason || "-" }}
|
||||||
</td>
|
</td>
|
||||||
<td class="whitespace-nowrap px-4 py-3 text-sm text-gray-500">
|
<td class="whitespace-nowrap px-4 py-3 text-sm text-gray-500">
|
||||||
{{ condition.message || "-" }}
|
<pre>{{ condition.message || "-" }}</pre>
|
||||||
</td>
|
</td>
|
||||||
<td
|
<td
|
||||||
v-tooltip="formatDatetime(condition.lastTransitionTime)"
|
v-tooltip="formatDatetime(condition.lastTransitionTime)"
|
||||||
|
|
|
@ -117,12 +117,12 @@ const lastCondition = computed(() => {
|
||||||
v-if="errorAlertVisible && lastCondition"
|
v-if="errorAlertVisible && lastCondition"
|
||||||
class="w-full px-4 pb-2 sm:px-6"
|
class="w-full px-4 pb-2 sm:px-6"
|
||||||
>
|
>
|
||||||
<VAlert
|
<VAlert type="error" :title="lastCondition.reason" :closable="false">
|
||||||
type="error"
|
<template #description>
|
||||||
:title="lastCondition.reason"
|
<div class="overflow-x-auto">
|
||||||
:description="lastCondition.message"
|
<pre>{{ lastCondition.message }}</pre>
|
||||||
:closable="false"
|
</div>
|
||||||
>
|
</template>
|
||||||
<template #actions>
|
<template #actions>
|
||||||
<VButton size="sm" @click="conditionsModalVisible = true">
|
<VButton size="sm" @click="conditionsModalVisible = true">
|
||||||
{{ $t("core.plugin.detail.operations.view_conditions.button") }}
|
{{ $t("core.plugin.detail.operations.view_conditions.button") }}
|
||||||
|
|
Loading…
Reference in New Issue