From 40d2849aa6f68ccf8d7096d504e73af5dde91212 Mon Sep 17 00:00:00 2001 From: Gani Georgiev Date: Sun, 31 May 2026 10:34:27 +0300 Subject: [PATCH] added default panic-recover handling for the cron jobs --- CHANGELOG.md | 2 ++ tools/cron/cron.go | 4 +++- tools/routine/routine.go | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 13cf4edb..46725db1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ - Return the hidden record data fields for superusers realtime subscribers ([#7721](https://github.com/pocketbase/pocketbase/issues/7721)). +- Added default panic-recover handling for the cron jobs to avoid terminating the application on panic. + ## v0.39.0 diff --git a/tools/cron/cron.go b/tools/cron/cron.go index 66dd07c5..595f5814 100644 --- a/tools/cron/cron.go +++ b/tools/cron/cron.go @@ -14,6 +14,8 @@ import ( "slices" "sync" "time" + + "github.com/pocketbase/pocketbase/tools/routine" ) // Cron is a crontab-like struct for tasks/jobs scheduling. @@ -222,7 +224,7 @@ func (c *Cron) runDue(t time.Time) { for _, j := range c.jobs { if j.schedule.IsDue(moment) { - go j.Run() + routine.FireAndForget(j.Run) } } } diff --git a/tools/routine/routine.go b/tools/routine/routine.go index 87913885..3398654a 100644 --- a/tools/routine/routine.go +++ b/tools/routine/routine.go @@ -22,7 +22,7 @@ func FireAndForget(f func(), wg ...*sync.WaitGroup) { defer func() { if err := recover(); err != nil { - log.Println("RECOVERED FROM PANIC (safe to ignore):", err) + log.Println("[FireAndForget] RECOVERED FROM PANIC:", err) stack := make([]byte, 2<<10) // 2 KB length := runtime.Stack(stack, false)