diff --git a/sundynix-gateway/internal/handler/task_handler.go b/sundynix-gateway/internal/handler/task_handler.go index a295cab..3b09e02 100644 --- a/sundynix-gateway/internal/handler/task_handler.go +++ b/sundynix-gateway/internal/handler/task_handler.go @@ -4,6 +4,7 @@ package handler import ( "context" "encoding/json" + "fmt" "io" "log" "net/http" @@ -71,9 +72,14 @@ func (h *Handler) preflight(c *gin.Context) (string, bool) { // 报告生成此前只 PublishTask,这两样都没有,所以报告既进不了运行历史, // 切个页面回来也彻底找不回——它明明在后端好好地跑完了。 func (h *Handler) launch(c *gin.Context, task *contract.Task) error { - // 持久化任务提交(best-effort:降级模式下静默跳过,不阻断发布)。 + // 持久化任务提交。DB 降级(nil)时 SaveTask 返 nil 静默跳过(开发态本就无库,不阻断); + // 但 DB 活着却写失败 → 真故障,绝不能吞:一旦 PublishTask 发出去,任务就在后端跑了, + // 却不进运行历史、复盘不了、报告类的会彻底"丢"(用户切页面回来找不回)。 + // 宁可这里失败上浮 5xx 让用户重试,也不发一个"看不见的执行"。落库在 Publish 之前, + // 失败时还没发布,中止是干净的。 if err := h.db.SaveTask(c.Request.Context(), userID(c), task.ID, string(task.Graph)); err != nil { log.Printf("[gateway] save task %s failed: %v", task.ID, err) + return fmt.Errorf("任务落库失败,请重试: %w", err) } if err := h.bus.PublishTask(c.Request.Context(), task); err != nil { return err