From f89a0057407edb0bfb757de8bbb601dd17fb6084 Mon Sep 17 00:00:00 2001 From: Emily Shepherd Date: Tue, 6 Sep 2022 01:24:17 +0100 Subject: [PATCH] Cleanup Socket and Pidfile on exit These were previously left intact, even when exiting gracefully. As the daemon also fails if the socket already exists, it became the caller's responsibilityto check for and cleanup old socket files when performing graceful / deliberate restarts. Signed-off-by: Emily Shepherd --- plugins/ipam/dhcp/daemon.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/plugins/ipam/dhcp/daemon.go b/plugins/ipam/dhcp/daemon.go index b17a64614..a201f019a 100644 --- a/plugins/ipam/dhcp/daemon.go +++ b/plugins/ipam/dhcp/daemon.go @@ -15,6 +15,7 @@ package main import ( + "context" "encoding/json" "errors" "fmt" @@ -23,9 +24,11 @@ import ( "net/http" "net/rpc" "os" + "os/signal" "path/filepath" "runtime" "sync" + "syscall" "time" "github.com/containernetworking/cni/pkg/skel" @@ -195,11 +198,27 @@ func runDaemon( return fmt.Errorf("Error getting listener: %v", err) } + srv := http.Server{} + exit := make(chan os.Signal, 1) + done := make(chan bool, 1) + signal.Notify(exit, os.Interrupt, syscall.SIGTERM) + + go func() { + <-exit + srv.Shutdown(context.TODO()) + os.Remove(hostPrefix + socketPath) + os.Remove(pidfilePath) + + done <- true + }() + dhcp := newDHCP(dhcpClientTimeout, resendMax) dhcp.hostNetnsPrefix = hostPrefix dhcp.broadcast = broadcast rpc.Register(dhcp) rpc.HandleHTTP() - http.Serve(l, nil) + srv.Serve(l) + + <-done return nil }