Template
1
0
Fork 0
mirror of https://codeberg.org/forgejo/forgejo synced 2024-11-29 05:06:11 +01:00

Avoid unexpected panic in graceful manager (#29629) (#29630)

Backport #29629

(cherry picked from commit 2f1eb619bc19a9b172062ba17789356bbdaa259d)
This commit is contained in:
wxiaoguang 2024-03-06 19:00:21 +08:00 committed by Earl Warren
parent 9f7a51d3d7
commit 7a32382108
No known key found for this signature in database
GPG key ID: 0579CB2928A78A00
2 changed files with 18 additions and 2 deletions

View file

@ -118,7 +118,15 @@ func (g *Manager) start(ctx context.Context) {
defer close(startupDone) defer close(startupDone)
// Wait till we're done getting all of the listeners and then close // Wait till we're done getting all of the listeners and then close
// the unused ones // the unused ones
func() {
// FIXME: there is a fundamental design problem of the "manager" and the "wait group".
// If nothing has started, the "Wait" just panics: sync: WaitGroup is reused before previous Wait has returned
// There is no clear solution besides a complete rewriting of the "manager"
defer func() {
_ = recover()
}()
g.createServerWaitGroup.Wait() g.createServerWaitGroup.Wait()
}()
// Ignore the error here there's not much we can do with it // Ignore the error here there's not much we can do with it
// They're logged in the CloseProvidedListeners function // They're logged in the CloseProvidedListeners function
_ = CloseProvidedListeners() _ = CloseProvidedListeners()

View file

@ -227,8 +227,16 @@ func (g *Manager) awaitServer(limit time.Duration) bool {
c := make(chan struct{}) c := make(chan struct{})
go func() { go func() {
defer close(c) defer close(c)
func() {
// FIXME: there is a fundamental design problem of the "manager" and the "wait group".
// If nothing has started, the "Wait" just panics: sync: WaitGroup is reused before previous Wait has returned
// There is no clear solution besides a complete rewriting of the "manager"
defer func() {
_ = recover()
}()
g.createServerWaitGroup.Wait() g.createServerWaitGroup.Wait()
}() }()
}()
if limit > 0 { if limit > 0 {
select { select {
case <-c: case <-c: