Commit 8fc35edc authored by Matt Holt's avatar Matt Holt

Merge pull request #689 from tpng/restart-inproc

Add -restart=inproc option for in-process restart
parents 27f9b58c 260c023e
...@@ -52,6 +52,11 @@ var ( ...@@ -52,6 +52,11 @@ var (
// GracefulTimeout is the maximum duration of a graceful shutdown. // GracefulTimeout is the maximum duration of a graceful shutdown.
GracefulTimeout time.Duration GracefulTimeout time.Duration
// RestartMode is the mode used for restart,
// "inproc" will restart in process,
// otherwise default behavior is used (inproc on Windows, fork on Linux).
RestartMode = ""
) )
var ( var (
......
...@@ -25,6 +25,10 @@ func init() { ...@@ -25,6 +25,10 @@ func init() {
// downtime if on a POSIX-compatible system, or forcefully if on // downtime if on a POSIX-compatible system, or forcefully if on
// Windows but with imperceptibly-short downtime. // Windows but with imperceptibly-short downtime.
// //
// The behavior can be controlled by the RestartMode variable,
// where "inproc" will restart forcefully in process same as
// Windows on a POSIX-compatible system.
//
// The restarted application will use newCaddyfile as its input // The restarted application will use newCaddyfile as its input
// configuration. If newCaddyfile is nil, the current (existing) // configuration. If newCaddyfile is nil, the current (existing)
// Caddyfile configuration will be used. // Caddyfile configuration will be used.
...@@ -48,6 +52,10 @@ func Restart(newCaddyfile Input) error { ...@@ -48,6 +52,10 @@ func Restart(newCaddyfile Input) error {
return errors.New("TLS preload: " + err.Error()) return errors.New("TLS preload: " + err.Error())
} }
if RestartMode == "inproc" {
return restartInProc(newCaddyfile)
}
if len(os.Args) == 0 { // this should never happen, but... if len(os.Args) == 0 { // this should never happen, but...
os.Args = []string{""} os.Args = []string{""}
} }
...@@ -164,3 +172,22 @@ func getCertsForNewCaddyfile(newCaddyfile Input) error { ...@@ -164,3 +172,22 @@ func getCertsForNewCaddyfile(newCaddyfile Input) error {
return nil return nil
} }
// restartInProc restarts Caddy forcefully in process using newCaddyfile.
func restartInProc(newCaddyfile Input) error {
wg.Add(1) // barrier so Wait() doesn't unblock
err := Stop()
if err != nil {
return err
}
err = Start(newCaddyfile)
if err != nil {
return err
}
wg.Done() // take down our barrier
return nil
}
...@@ -33,6 +33,7 @@ func init() { ...@@ -33,6 +33,7 @@ func init() {
flag.StringVar(&caddy.PidFile, "pidfile", "", "Path to write pid file") flag.StringVar(&caddy.PidFile, "pidfile", "", "Path to write pid file")
flag.StringVar(&caddy.Port, "port", caddy.DefaultPort, "Default port") flag.StringVar(&caddy.Port, "port", caddy.DefaultPort, "Default port")
flag.BoolVar(&caddy.Quiet, "quiet", false, "Quiet mode (no initialization output)") flag.BoolVar(&caddy.Quiet, "quiet", false, "Quiet mode (no initialization output)")
flag.StringVar(&caddy.RestartMode, "restart", "", "Restart mode (inproc for in process restart)")
flag.StringVar(&revoke, "revoke", "", "Hostname for which to revoke the certificate") flag.StringVar(&revoke, "revoke", "", "Hostname for which to revoke the certificate")
flag.StringVar(&caddy.Root, "root", caddy.DefaultRoot, "Root path to default site") flag.StringVar(&caddy.Root, "root", caddy.DefaultRoot, "Root path to default site")
flag.BoolVar(&version, "version", false, "Show version") flag.BoolVar(&version, "version", false, "Show version")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment