Browse Source

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

Backport #29629
tags/v1.21.8
wxiaoguang 2 months ago
parent
commit
2f1eb619bc
No account linked to committer's email address
2 changed files with 18 additions and 2 deletions
  1. 9
    1
      modules/graceful/manager_unix.go
  2. 9
    1
      modules/graceful/manager_windows.go

+ 9
- 1
modules/graceful/manager_unix.go View File

@@ -118,7 +118,15 @@ func (g *Manager) start(ctx context.Context) {
defer close(startupDone)
// Wait till we're done getting all of the listeners and then close
// the unused ones
g.createServerWaitGroup.Wait()
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()
}()
// Ignore the error here there's not much we can do with it
// They're logged in the CloseProvidedListeners function
_ = CloseProvidedListeners()

+ 9
- 1
modules/graceful/manager_windows.go View File

@@ -227,7 +227,15 @@ func (g *Manager) awaitServer(limit time.Duration) bool {
c := make(chan struct{})
go func() {
defer close(c)
g.createServerWaitGroup.Wait()
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()
}()
}()
if limit > 0 {
select {

Loading…
Cancel
Save