Browse Source
notify: Send all sd_notify signals from main caddy process (#4060 )
Initial sd_notify support was added in #3963 , but that sent signals from
both cmdRun and cmdReload. This approach has two drawbacks:
- Reloads initiated via the API do not send signals.
- The signals are sent from different processes, which requires the
`NotifyAccess=exec` directive in the unit file.
This change moves the NotifyReloading and NotifyReadiness invocations to
Load, which address both of those drawbacks. It also adds a
complimentary NotifyStopping method which is invoked from handleStop.
All the notify methods are defined in a notify package to avoid an
import loop.
master
Carl George
4 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with
43 additions and
18 deletions
admin.go
caddy.go
cmd/commandfuncs.go
notify/notify.go
notify/notify_linux.go
notify/notify_other.go
@ -39,6 +39,7 @@ import (
"sync"
"time"
"github.com/caddyserver/caddy/v2/notify"
"github.com/caddyserver/certmagic"
"github.com/prometheus/client_golang/prometheus"
"go.uber.org/zap"
@ -905,6 +906,11 @@ func handleStop(w http.ResponseWriter, r *http.Request) error {
Err : fmt . Errorf ( "method not allowed" ) ,
}
}
if err := notify . NotifyStopping ( ) ; err != nil {
Log ( ) . Error ( "unable to notify stopping to service manager" , zap . Error ( err ) )
}
exitProcess ( Log ( ) . Named ( "admin.api" ) )
return nil
}
@ -32,6 +32,7 @@ import (
"sync"
"time"
"github.com/caddyserver/caddy/v2/notify"
"github.com/caddyserver/certmagic"
"github.com/google/uuid"
"go.uber.org/zap"
@ -100,6 +101,16 @@ func Run(cfg *Config) error {
// if it is different from the current config or
// forceReload is true.
func Load ( cfgJSON [ ] byte , forceReload bool ) error {
if err := notify . NotifyReloading ( ) ; err != nil {
Log ( ) . Error ( "unable to notify reloading to service manager" , zap . Error ( err ) )
}
defer func ( ) {
if err := notify . NotifyReadiness ( ) ; err != nil {
Log ( ) . Error ( "unable to notify readiness to service manager" , zap . Error ( err ) )
}
} ( )
return changeConfig ( http . MethodPost , "/" + rawConfigKey , cfgJSON , forceReload )
}
@ -269,10 +269,6 @@ func cmdRun(fl Flags) (int, error) {
}
}
if err := NotifyReadiness ( ) ; err != nil {
caddy . Log ( ) . Error ( "unable to notify readiness to service manager" , zap . Error ( err ) )
}
select { }
}
@ -294,15 +290,6 @@ func cmdReload(fl Flags) (int, error) {
reloadCmdAddrFlag := fl . String ( "address" )
reloadCmdForceFlag := fl . Bool ( "force" )
if err := NotifyReloading ( ) ; err != nil {
caddy . Log ( ) . Error ( "unable to notify reloading to service manager" , zap . Error ( err ) )
}
defer func ( ) {
if err := NotifyReadiness ( ) ; err != nil {
caddy . Log ( ) . Error ( "unable to notify readiness to service manager" , zap . Error ( err ) )
}
} ( )
// get the config in caddy's native format
config , configFile , err := loadConfig ( reloadCmdConfigFlag , reloadCmdConfigAdapterFlag )
if err != nil {
@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package caddycmd
package notify
// NotifyReadiness notifies process manager of readiness.
func NotifyReadiness ( ) error {
@ -23,3 +23,8 @@ func NotifyReadiness() error {
func NotifyReloading ( ) error {
return notifyReloading ( )
}
// NotifyStopping notifies process manager of stopping.
func NotifyStopping ( ) error {
return notifyStopping ( )
}
@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
package caddycmd
package notify
import (
"io"
@ -42,7 +42,7 @@ func sdNotify(path, payload string) error {
return nil
}
// notifyReadiness notifies systemd caddy that has finished its
// notifyReadiness notifies systemd that caddy has finished its
// initialization routines.
func notifyReadiness ( ) error {
val , ok := os . LookupEnv ( "NOTIFY_SOCKET" )
@ -55,7 +55,7 @@ func notifyReadiness() error {
return nil
}
// notifyReadiness notifies systemd that caddy is reloading its config.
// notifyReloading notifies systemd that caddy is reloading its config.
func notifyReloading ( ) error {
val , ok := os . LookupEnv ( "NOTIFY_SOCKET" )
if ! ok || val == "" {
@ -66,3 +66,15 @@ func notifyReloading() error {
}
return nil
}
// notifyStopping notifies systemd that caddy is stopping.
func notifyStopping ( ) error {
val , ok := os . LookupEnv ( "NOTIFY_SOCKET" )
if ! ok || val == "" {
return nil
}
if err := sdNotify ( val , "STOPPING=1" ) ; err != nil {
return err
}
return nil
}
@ -14,7 +14,7 @@
// +build !linux
package caddycmd
package notify
func notifyReadiness ( ) error {
return nil
@ -23,3 +23,7 @@ func notifyReadiness() error {
func notifyReloading ( ) error {
return nil
}
func notifyStopping ( ) error {
return nil
}