From 9b90a938f576955e561cd5a9dfedad87bdcb5048 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 28 Jan 2016 18:26:34 +0000 Subject: [PATCH 1/2] Remove Unix domain sockets on shutdown --- prog/plugin/main.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/prog/plugin/main.go b/prog/plugin/main.go index 01bad7f6..b0da942f 100644 --- a/prog/plugin/main.go +++ b/prog/plugin/main.go @@ -93,17 +93,23 @@ func main() { sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, os.Interrupt, os.Kill, syscall.SIGTERM) + cleanup := func() { + globalListener.Close() + meshListener.Close() + _ = os.Remove(address) + _ = os.Remove(meshAddress) + } select { case sig := <-sigChan: Log.Debugf("Caught signal %s; shutting down", sig) if err := dockerClient.Client.RemoveNetwork(meshNetworkName); err != nil { Log.Fatal(err) } + cleanup() case err := <-endChan: + cleanup() if err != nil { Log.Errorf("Error from listener: %s", err) - globalListener.Close() - meshListener.Close() os.Exit(1) } } From 3320a9e7d45ce86fedbf9db569c158db823bccc9 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 29 Jan 2016 11:41:24 +0000 Subject: [PATCH 2/2] Re-organise code so we can clean up using defer and return error codes to top level --- prog/plugin/main.go | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/prog/plugin/main.go b/prog/plugin/main.go index b0da942f..98e5fe42 100644 --- a/prog/plugin/main.go +++ b/prog/plugin/main.go @@ -69,49 +69,49 @@ func main() { Log.Println("Weave plugin", version, "Command line options:", os.Args[1:]) Log.Info(dockerClient.Info()) - var globalListener, meshListener net.Listener + err = run(dockerClient, address, meshAddress, meshNetworkName, nameserver, noMulticastRoute) + if err != nil { + Log.Fatal(err) + } +} + +func run(dockerClient *docker.Client, address, meshAddress, meshNetworkName, nameserver string, noMulticastRoute bool) error { endChan := make(chan error, 1) if address != "" { globalListener, err := listenAndServe(dockerClient, address, nameserver, noMulticastRoute, endChan, "global", false) if err != nil { - Log.Fatalf("unable to create driver: %s", err) + return err } + defer os.Remove(address) defer globalListener.Close() } if meshAddress != "" { meshListener, err := listenAndServe(dockerClient, meshAddress, nameserver, noMulticastRoute, endChan, "local", true) if err != nil { - Log.Fatalf("unable to create driver: %s", err) + return err } + defer os.Remove(meshAddress) defer meshListener.Close() } if meshNetworkName != "" { - createNetwork(dockerClient, meshNetworkName, meshAddress) + if err := createNetwork(dockerClient, meshNetworkName, meshAddress); err != nil { + return err + } } sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, os.Interrupt, os.Kill, syscall.SIGTERM) - cleanup := func() { - globalListener.Close() - meshListener.Close() - _ = os.Remove(address) - _ = os.Remove(meshAddress) - } select { case sig := <-sigChan: Log.Debugf("Caught signal %s; shutting down", sig) - if err := dockerClient.Client.RemoveNetwork(meshNetworkName); err != nil { - Log.Fatal(err) + if meshNetworkName != "" { + return dockerClient.Client.RemoveNetwork(meshNetworkName) } - cleanup() + return nil case err := <-endChan: - cleanup() - if err != nil { - Log.Errorf("Error from listener: %s", err) - os.Exit(1) - } + return err } } @@ -147,7 +147,7 @@ func listenAndServe(dockerClient *docker.Client, address, nameserver string, noM return listener, nil } -func createNetwork(dockerClient *docker.Client, networkName, address string) { +func createNetwork(dockerClient *docker.Client, networkName, address string) error { if _, err := dockerClient.Client.NetworkInfo(networkName); err == nil { Log.Printf("Docker network '%s' already exists", networkName) } else if _, ok := err.(*go_docker.NoSuchNetwork); ok { @@ -163,7 +163,8 @@ func createNetwork(dockerClient *docker.Client, networkName, address string) { } _, err := dockerClient.Client.CreateNetwork(options) if err != nil { - Log.Fatalf("Error creating network: %s", err) + return fmt.Errorf("Error creating network: %s", err) } } + return nil }