From e87681d43336273f93786f140a362c39a9b36ab4 Mon Sep 17 00:00:00 2001 From: kim Date: Wed, 11 Jun 2025 11:38:10 +0200 Subject: [bugfix] process account delete synchronously to prevent OOM (#4260) # Description - updates account delete processing to handle side-effects synchronously to prevent OOM - updates account delete processing to check more often if account.IsLocal() for certain deletes / side-effects - ensures that mutes get removed from database on delete ## Checklist - [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md). - [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat. - [x] I/we have not leveraged AI to create the proposed changes. - [x] I/we have performed a self-review of added code. - [x] I/we have written code that is legible and maintainable by others. - [x] I/we have commented the added code, particularly in hard-to-understand areas. - [ ] I/we have made any necessary changes to documentation. - [ ] I/we have added tests that cover new code. - [ ] I/we have run tests and they pass locally with the changes. - [x] I/we have run `go fmt ./...` and `golangci-lint run`. Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4260 Co-authored-by: kim Co-committed-by: kim --- internal/util/fns.go | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) (limited to 'internal/util/fns.go') diff --git a/internal/util/fns.go b/internal/util/fns.go index 53f5ebeed..c82377030 100644 --- a/internal/util/fns.go +++ b/internal/util/fns.go @@ -32,18 +32,7 @@ func Must(fn func()) { panic("nil func") } for !func() (done bool) { - defer func() { - if r := recover(); r != nil { - // Gather calling func frames. - pcs := make([]uintptr, 10) - n := runtime.Callers(3, pcs) - i := runtime.CallersFrames(pcs[:n]) - c := gatherFrames(i, n) - - const msg = "recovered panic: %v\n\n%s\n" - fmt.Fprintf(os.Stderr, msg, r, c.String()) - } - }() + defer Recover() fn() done = true return @@ -51,6 +40,21 @@ func Must(fn func()) { } } +// Recover wraps runtime.recover() to dump the current +// stack to stderr on panic and return the panic value. +func Recover() any { + if r := recover(); r != nil { + // Gather calling func frames. + pcs := make([]uintptr, 10) + n := runtime.Callers(3, pcs) + i := runtime.CallersFrames(pcs[:n]) + c := gatherFrames(i, n) + fmt.Fprintf(os.Stderr, "recovered panic: %v\n\n%s\n", r, c.String()) + return r + } + return nil +} + // gatherFrames collates runtime frames from a frame iterator. func gatherFrames(iter *runtime.Frames, n int) errors.Callers { if iter == nil { -- cgit v1.2.3