mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-13 05:11:20 +01:00
[GITEA] Actually recover from a panic in cron task
- Backport #1911 - Currently there's code to recover gracefully from panics that happen within the execution of cron tasks. However this recover code wasn't being run, because `RunWithShutdownContext` also contains code to recover from any panic and then gracefully shutdown Forgejo. Because `RunWithShutdownContext` registers that code as last, that would get run first which in this case is not behavior that we want. - Move the recover code to inside the function, so that is run first before `RunWithShutdownContext`'s recover code (which is now a noop). - Resolves #1910 (cherry picked from commit 761e1c83414407b65e331c2eeb4348c47acf0fbb)
This commit is contained in:
parent
3981e6fdf3
commit
026a4bb02d
1 changed files with 7 additions and 5 deletions
|
@ -84,13 +84,15 @@ func (t *Task) RunWithUser(doer *user_model.User, config Config) {
|
||||||
t.lock.Unlock()
|
t.lock.Unlock()
|
||||||
defer func() {
|
defer func() {
|
||||||
taskStatusTable.Stop(t.Name)
|
taskStatusTable.Stop(t.Name)
|
||||||
if err := recover(); err != nil {
|
|
||||||
// Recover a panic within the
|
|
||||||
combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2))
|
|
||||||
log.Error("PANIC whilst running task: %s Value: %v", t.Name, combinedErr)
|
|
||||||
}
|
|
||||||
}()
|
}()
|
||||||
graceful.GetManager().RunWithShutdownContext(func(baseCtx context.Context) {
|
graceful.GetManager().RunWithShutdownContext(func(baseCtx context.Context) {
|
||||||
|
defer func() {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
// Recover a panic within the execution of the task.
|
||||||
|
combinedErr := fmt.Errorf("%s\n%s", err, log.Stack(2))
|
||||||
|
log.Error("PANIC whilst running task: %s Value: %v", t.Name, combinedErr)
|
||||||
|
}
|
||||||
|
}()
|
||||||
// Store the time of this run, before the function is executed, so it
|
// Store the time of this run, before the function is executed, so it
|
||||||
// matches the behavior of what the cron library does.
|
// matches the behavior of what the cron library does.
|
||||||
t.lock.Lock()
|
t.lock.Lock()
|
||||||
|
|
Loading…
Reference in a new issue