|
|
|
@ -57,20 +57,27 @@ func (g *Manager) start() { |
|
|
|
|
// Handle clean up of unused provided listeners and delayed start-up
|
|
|
|
|
startupDone := make(chan struct{}) |
|
|
|
|
go func() { |
|
|
|
|
defer close(startupDone) |
|
|
|
|
// Wait till we're done getting all the listeners and then close 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() |
|
|
|
|
defer func() { |
|
|
|
|
close(startupDone) |
|
|
|
|
// Close the unused listeners and ignore the error here there's not much we can do with it, they're logged in the CloseProvidedListeners function
|
|
|
|
|
_ = CloseProvidedListeners() |
|
|
|
|
}() |
|
|
|
|
// Ignore the error here there's not much we can do with it, they're logged in the CloseProvidedListeners function
|
|
|
|
|
_ = CloseProvidedListeners() |
|
|
|
|
g.notify(readyMsg) |
|
|
|
|
// Wait for all servers to be created
|
|
|
|
|
g.createServerCond.L.Lock() |
|
|
|
|
for { |
|
|
|
|
if g.createdServer >= numberOfServersToCreate { |
|
|
|
|
g.createServerCond.L.Unlock() |
|
|
|
|
g.notify(readyMsg) |
|
|
|
|
return |
|
|
|
|
} |
|
|
|
|
select { |
|
|
|
|
case <-g.IsShutdown(): |
|
|
|
|
g.createServerCond.L.Unlock() |
|
|
|
|
return |
|
|
|
|
default: |
|
|
|
|
} |
|
|
|
|
g.createServerCond.Wait() |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
if setting.StartupTimeout > 0 { |
|
|
|
|
go func() { |
|
|
|
@ -78,16 +85,7 @@ func (g *Manager) start() { |
|
|
|
|
case <-startupDone: |
|
|
|
|
return |
|
|
|
|
case <-g.IsShutdown(): |
|
|
|
|
func() { |
|
|
|
|
// When WaitGroup counter goes negative it will panic - we don't care about this so we can just ignore it.
|
|
|
|
|
defer func() { |
|
|
|
|
_ = recover() |
|
|
|
|
}() |
|
|
|
|
// Ensure that the createServerWaitGroup stops waiting
|
|
|
|
|
for { |
|
|
|
|
g.createServerWaitGroup.Done() |
|
|
|
|
} |
|
|
|
|
}() |
|
|
|
|
g.createServerCond.Signal() |
|
|
|
|
return |
|
|
|
|
case <-time.After(setting.StartupTimeout): |
|
|
|
|
log.Error("Startup took too long! Shutting down") |
|
|
|
|