[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