mirror of
https://github.com/caddyserver/caddy.git
synced 2024-12-23 22:27:38 -05:00
Fix restart on USR1 not loading new Caddyfile
This commit is contained in:
parent
6492592b4a
commit
ff82057131
2 changed files with 16 additions and 30 deletions
35
caddy.go
35
caddy.go
|
@ -65,7 +65,7 @@ type Instance struct {
|
||||||
caddyfileInput Input
|
caddyfileInput Input
|
||||||
|
|
||||||
// wg is used to wait for all servers to shut down
|
// wg is used to wait for all servers to shut down
|
||||||
wg sync.WaitGroup
|
wg *sync.WaitGroup
|
||||||
|
|
||||||
// servers is the list of servers with their listeners...
|
// servers is the list of servers with their listeners...
|
||||||
servers []serverListener
|
servers []serverListener
|
||||||
|
@ -89,12 +89,14 @@ func (i *Instance) Stop() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// splice instance list to delete this one
|
// splice instance list to delete this one
|
||||||
|
instancesMu.Lock()
|
||||||
for j, other := range instances {
|
for j, other := range instances {
|
||||||
if other == i {
|
if other == i {
|
||||||
instances = append(instances[:j], instances[j+1:]...)
|
instances = append(instances[:j], instances[j+1:]...)
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
instancesMu.Unlock()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -119,6 +121,9 @@ func (i *Instance) shutdownCallbacks() []error {
|
||||||
func (i *Instance) Restart(newCaddyfile Input) (*Instance, error) {
|
func (i *Instance) Restart(newCaddyfile Input) (*Instance, error) {
|
||||||
log.Println("[INFO] Reloading")
|
log.Println("[INFO] Reloading")
|
||||||
|
|
||||||
|
i.wg.Add(1)
|
||||||
|
defer i.wg.Done()
|
||||||
|
|
||||||
// run restart callbacks
|
// run restart callbacks
|
||||||
for _, fn := range i.onRestart {
|
for _, fn := range i.onRestart {
|
||||||
err := fn()
|
err := fn()
|
||||||
|
@ -142,7 +147,7 @@ func (i *Instance) Restart(newCaddyfile Input) (*Instance, error) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// create new instance; if the restart fails, it is simply discarded
|
// create new instance; if the restart fails, it is simply discarded
|
||||||
newInst := &Instance{serverType: newCaddyfile.ServerType()}
|
newInst := &Instance{serverType: newCaddyfile.ServerType(), wg: i.wg}
|
||||||
|
|
||||||
// attempt to start new instance
|
// attempt to start new instance
|
||||||
err := startWithListenerFds(newCaddyfile, newInst, restartFds)
|
err := startWithListenerFds(newCaddyfile, newInst, restartFds)
|
||||||
|
@ -150,15 +155,8 @@ func (i *Instance) Restart(newCaddyfile Input) (*Instance, error) {
|
||||||
return i, err
|
return i, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// success! bump the old instance out so it will be garbage-collected
|
// success! stop the old instance
|
||||||
instancesMu.Lock()
|
i.Stop()
|
||||||
for j, other := range instances {
|
|
||||||
if other == i {
|
|
||||||
instances = append(instances[:j], instances[j+1:]...)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
instancesMu.Unlock()
|
|
||||||
|
|
||||||
log.Println("[INFO] Reloading complete")
|
log.Println("[INFO] Reloading complete")
|
||||||
|
|
||||||
|
@ -365,7 +363,7 @@ func (i *Instance) Caddyfile() Input {
|
||||||
// This function blocks until all the servers are listening.
|
// This function blocks until all the servers are listening.
|
||||||
func Start(cdyfile Input) (*Instance, error) {
|
func Start(cdyfile Input) (*Instance, error) {
|
||||||
writePidFile()
|
writePidFile()
|
||||||
inst := &Instance{serverType: cdyfile.ServerType()}
|
inst := &Instance{serverType: cdyfile.ServerType(), wg: new(sync.WaitGroup)}
|
||||||
return inst, startWithListenerFds(cdyfile, inst, nil)
|
return inst, startWithListenerFds(cdyfile, inst, nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -405,15 +403,12 @@ func startWithListenerFds(cdyfile Input, inst *Instance, restartFds map[string]r
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if restartFds == nil {
|
|
||||||
// run startup callbacks since this is not a restart
|
|
||||||
for _, startupFunc := range inst.onStartup {
|
for _, startupFunc := range inst.onStartup {
|
||||||
err := startupFunc()
|
err := startupFunc()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
err = startServers(slist, inst, restartFds)
|
err = startServers(slist, inst, restartFds)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -532,7 +527,6 @@ func startServers(serverList []Server, inst *Instance, restartFds map[string]res
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
file.Close()
|
file.Close()
|
||||||
delete(restartFds, addr)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -552,15 +546,6 @@ func startServers(serverList []Server, inst *Instance, restartFds map[string]res
|
||||||
inst.servers = append(inst.servers, serverListener{server: s, listener: ln})
|
inst.servers = append(inst.servers, serverListener{server: s, listener: ln})
|
||||||
}
|
}
|
||||||
|
|
||||||
// Close the remaining (unused) file descriptors to free up resources
|
|
||||||
// and stop old servers that aren't used anymore
|
|
||||||
for key, old := range restartFds {
|
|
||||||
if err := old.server.Stop(); err != nil {
|
|
||||||
log.Printf("[ERROR] Stopping %s: %v", old.server.Address(), err)
|
|
||||||
}
|
|
||||||
delete(restartFds, key)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Log errors that may be returned from Serve() calls,
|
// Log errors that may be returned from Serve() calls,
|
||||||
// these errors should only be occurring in the server loop.
|
// these errors should only be occurring in the server loop.
|
||||||
go func() {
|
go func() {
|
||||||
|
|
|
@ -51,7 +51,8 @@ var contexts []*httpContext
|
||||||
|
|
||||||
func newContext() caddy.Context {
|
func newContext() caddy.Context {
|
||||||
context := &httpContext{keysToSiteConfigs: make(map[string]*SiteConfig)}
|
context := &httpContext{keysToSiteConfigs: make(map[string]*SiteConfig)}
|
||||||
contexts = append(contexts, context)
|
// put the new context at start to allow setup of directives on new instance
|
||||||
|
contexts = append([]*httpContext{context}, contexts...)
|
||||||
return context
|
return context
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue