[lxc-devel] [lxd/master] Improve container shutdown and cleanup networks on shutdown

stgraber on Github lxc-bot at linuxcontainers.org
Fri Aug 4 20:02:25 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170804/64208b7e/attachment.bin>
-------------- next part --------------
From 437d5460866d35460aecbb5ad48c144776c36b10 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 4 Aug 2017 15:47:20 -0400
Subject: [PATCH 1/2] daemon: Use select and save goroutines
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/main_daemon.go | 53 ++++++++++++++++-------------------------------------
 1 file changed, 16 insertions(+), 37 deletions(-)

diff --git a/lxd/main_daemon.go b/lxd/main_daemon.go
index e78db8ff9..5b720967d 100644
--- a/lxd/main_daemon.go
+++ b/lxd/main_daemon.go
@@ -6,7 +6,6 @@ import (
 	"os/exec"
 	"os/signal"
 	"runtime/pprof"
-	"sync"
 	"syscall"
 	"time"
 
@@ -62,46 +61,26 @@ func cmdDaemon() error {
 		return err
 	}
 
-	var ret error
-	var wg sync.WaitGroup
-	wg.Add(1)
+	ch := make(chan os.Signal)
+	signal.Notify(ch, syscall.SIGPWR)
+	signal.Notify(ch, syscall.SIGINT)
+	signal.Notify(ch, syscall.SIGQUIT)
+	signal.Notify(ch, syscall.SIGTERM)
 
-	go func() {
-		ch := make(chan os.Signal)
-		signal.Notify(ch, syscall.SIGPWR)
-		sig := <-ch
+	select {
+	case sig := <-ch:
 
-		logger.Infof("Received '%s signal', shutting down containers.", sig)
-
-		containersShutdown(d)
-
-		ret = d.Stop()
-		wg.Done()
-	}()
-
-	go func() {
-		<-d.shutdownChan
+		if sig == syscall.SIGPWR {
+			logger.Infof("Received '%s signal', shutting down containers.", sig)
+			containersShutdown(d)
+		} else {
+			logger.Infof("Received '%s signal', exiting.", sig)
+		}
 
+	case <-d.shutdownChan:
 		logger.Infof("Asked to shutdown by API, shutting down containers.")
-
 		containersShutdown(d)
+	}
 
-		ret = d.Stop()
-		wg.Done()
-	}()
-
-	go func() {
-		ch := make(chan os.Signal)
-		signal.Notify(ch, syscall.SIGINT)
-		signal.Notify(ch, syscall.SIGQUIT)
-		signal.Notify(ch, syscall.SIGTERM)
-		sig := <-ch
-
-		logger.Infof("Received '%s signal', exiting.", sig)
-		ret = d.Stop()
-		wg.Done()
-	}()
-
-	wg.Wait()
-	return ret
+	return d.Stop()
 }

From 253ae7534d36d2601221623b14951e8aaa9bf2a3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 4 Aug 2017 16:01:14 -0400
Subject: [PATCH 2/2] networks: Stop networks on clean shutdown
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/main_daemon.go |  2 ++
 lxd/networks.go    | 27 +++++++++++++++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/lxd/main_daemon.go b/lxd/main_daemon.go
index 5b720967d..7195e3551 100644
--- a/lxd/main_daemon.go
+++ b/lxd/main_daemon.go
@@ -73,6 +73,7 @@ func cmdDaemon() error {
 		if sig == syscall.SIGPWR {
 			logger.Infof("Received '%s signal', shutting down containers.", sig)
 			containersShutdown(d)
+			networkShutdown(d)
 		} else {
 			logger.Infof("Received '%s signal', exiting.", sig)
 		}
@@ -80,6 +81,7 @@ func cmdDaemon() error {
 	case <-d.shutdownChan:
 		logger.Infof("Asked to shutdown by API, shutting down containers.")
 		containersShutdown(d)
+		networkShutdown(d)
 	}
 
 	return d.Stop()
diff --git a/lxd/networks.go b/lxd/networks.go
index 6f4464409..608a91bf3 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -420,6 +420,33 @@ func networkStartup(d *Daemon) error {
 	return nil
 }
 
+func networkShutdown(d *Daemon) error {
+	// Get a list of managed networks
+	networks, err := dbNetworks(d.db)
+	if err != nil {
+		return err
+	}
+
+	// Bring them all up
+	for _, name := range networks {
+		n, err := networkLoadByName(d, name)
+		if err != nil {
+			return err
+		}
+
+		if !n.IsRunning() {
+			continue
+		}
+
+		err = n.Stop()
+		if err != nil {
+			logger.Error("Failed to bring down network", log.Ctx{"err": err, "name": name})
+		}
+	}
+
+	return nil
+}
+
 type network struct {
 	// Properties
 	daemon      *Daemon


More information about the lxc-devel mailing list