The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/4881

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
This should improve performance on systems with a lot of containers and a lot of network interfaces.
From ac0092d3efe0104c611431f50c45abe89fe5a092 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Mon, 6 Aug 2018 17:27:48 -0400
Subject: [PATCH 1/4] lxd/containers: Use internal struct values
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/container_lxc.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 05d19220dc..1ae39c1034 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -3035,7 +3035,7 @@ func (c *containerLXC) Render() (interface{}, 
interface{}, error) {
                        Location:        c.node,
                }
 
-               ct.Description = c.Description()
+               ct.Description = c.description
                ct.Architecture = architectureName
                ct.Config = c.localConfig
                ct.CreatedAt = c.creationDate

From e42b054dd289e6c279f21001fb1b26132f678ec6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Mon, 6 Aug 2018 17:56:53 -0400
Subject: [PATCH 2/4] networks: Ignore veth devices
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This should significantly shorten the number of interfaces we deal with
when iterating through networks.

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/networks.go       |  5 +++++
 lxd/networks_utils.go | 11 +++++++++++
 2 files changed, 16 insertions(+)

diff --git a/lxd/networks.go b/lxd/networks.go
index f4406d05eb..7b8e0a710c 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -373,6 +373,11 @@ func networkGet(d *Daemon, r *http.Request) Response {
 }
 
 func doNetworkGet(d *Daemon, name string) (api.Network, error) {
+       // Ignore veth pairs (for performance reasons)
+       if strings.HasPrefix(name, "veth") {
+               return api.Network{}, os.ErrNotExist
+       }
+
        // Get some information
        osInfo, _ := net.InterfaceByName(name)
        _, dbInfo, _ := d.cluster.NetworkGet(name)
diff --git a/lxd/networks_utils.go b/lxd/networks_utils.go
index 7ee6cfd835..f2ac915651 100644
--- a/lxd/networks_utils.go
+++ b/lxd/networks_utils.go
@@ -90,6 +90,12 @@ func networkGetInterfaces(cluster *db.Cluster) ([]string, 
error) {
        }
 
        for _, iface := range ifaces {
+               // Ignore veth pairs (for performance reasons)
+               if strings.HasPrefix(iface.Name, "veth") {
+                       continue
+               }
+
+               // Append to the list
                if !shared.StringInSlice(iface.Name, networks) {
                        networks = append(networks, iface.Name)
                }
@@ -463,6 +469,11 @@ func networkDefaultGatewaySubnetV4() (*net.IPNet, string, 
error) {
 }
 
 func networkValidName(value string) error {
+       // Not a veth-liked name
+       if strings.HasPrefix(value, "veth") {
+               return fmt.Errorf("Interface name cannot be prefix with veth")
+       }
+
        // Validate the length
        if len(value) < 2 {
                return fmt.Errorf("Interface name is too short (minimum 2 
characters)")

From 97be1fd8cb980d85dfd3e33b0efcbeffad3a356e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Mon, 6 Aug 2018 17:57:41 -0400
Subject: [PATCH 3/4] networks: Don't try listing containers for lo
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/networks.go | 36 +++++++++++++++++++-----------------
 1 file changed, 19 insertions(+), 17 deletions(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index 7b8e0a710c..66b21a4c56 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -393,23 +393,6 @@ func doNetworkGet(d *Daemon, name string) (api.Network, 
error) {
        n.UsedBy = []string{}
        n.Config = map[string]string{}
 
-       // Look for containers using the interface
-       cts, err := d.cluster.ContainersList(db.CTypeRegular)
-       if err != nil {
-               return api.Network{}, err
-       }
-
-       for _, ct := range cts {
-               c, err := containerLoadByName(d.State(), ct)
-               if err != nil {
-                       return api.Network{}, err
-               }
-
-               if networkIsInUse(c, n.Name) {
-                       n.UsedBy = append(n.UsedBy, 
fmt.Sprintf("/%s/containers/%s", version.APIVersion, ct))
-               }
-       }
-
        // Set the device type as needed
        if osInfo != nil && shared.IsLoopback(osInfo) {
                n.Type = "loopback"
@@ -436,6 +419,25 @@ func doNetworkGet(d *Daemon, name string) (api.Network, 
error) {
                }
        }
 
+       // Look for containers using the interface
+       if n.Type != "loopback" {
+               cts, err := d.cluster.ContainersList(db.CTypeRegular)
+               if err != nil {
+                       return api.Network{}, err
+               }
+
+               for _, ct := range cts {
+                       c, err := containerLoadByName(d.State(), ct)
+                       if err != nil {
+                               return api.Network{}, err
+                       }
+
+                       if networkIsInUse(c, n.Name) {
+                               n.UsedBy = append(n.UsedBy, 
fmt.Sprintf("/%s/containers/%s", version.APIVersion, ct))
+                       }
+               }
+       }
+
        if dbInfo != nil {
                n.Status = dbInfo.Status
                n.Locations = dbInfo.Locations

From 9776cbd7d3c77ed188ca195957bd90c3281c4f78 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com>
Date: Mon, 6 Aug 2018 18:18:36 -0400
Subject: [PATCH 4/4] lxd/cluster: Only query the containers we need
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgra...@ubuntu.com>
---
 lxd/containers.go            |  2 +-
 lxd/daemon.go                |  2 +-
 lxd/devices.go               | 13 +++++++------
 lxd/devlxd.go                |  2 +-
 lxd/logging.go               |  2 +-
 lxd/main_activateifneeded.go |  2 +-
 lxd/networks_utils.go        |  2 +-
 lxd/patches.go               | 14 +++++++-------
 lxd/storage_lvm_utils.go     |  2 +-
 9 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/lxd/containers.go b/lxd/containers.go
index aa0da82a8d..b7a171c441 100644
--- a/lxd/containers.go
+++ b/lxd/containers.go
@@ -200,7 +200,7 @@ func containersShutdown(s *state.State) error {
        dbAvailable := true
 
        // Get all the containers
-       results, err := s.Cluster.ContainersList(db.CTypeRegular)
+       results, err := s.Cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                // Mark database as offline
                dbAvailable = false
diff --git a/lxd/daemon.go b/lxd/daemon.go
index 9eb6479216..354c493033 100644
--- a/lxd/daemon.go
+++ b/lxd/daemon.go
@@ -696,7 +696,7 @@ func (d *Daemon) Ready() error {
 }
 
 func (d *Daemon) numRunningContainers() (int, error) {
-       results, err := d.cluster.ContainersList(db.CTypeRegular)
+       results, err := d.cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                return 0, err
        }
diff --git a/lxd/devices.go b/lxd/devices.go
index ed573980d1..fde7f1f174 100644
--- a/lxd/devices.go
+++ b/lxd/devices.go
@@ -652,11 +652,12 @@ func deviceTaskBalance(s *state.State) {
        }
 
        // Iterate through the containers
-       containers, err := s.Cluster.ContainersList(db.CTypeRegular)
+       containers, err := s.Cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                logger.Error("Problem loading containers list", log.Ctx{"err": 
err})
                return
        }
+
        fixedContainers := map[int][]container{}
        balancedContainers := map[container]int{}
        for _, name := range containers {
@@ -778,7 +779,7 @@ func deviceNetworkPriority(s *state.State, netif string) {
                return
        }
 
-       containers, err := s.Cluster.ContainersList(db.CTypeRegular)
+       containers, err := s.Cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                return
        }
@@ -809,7 +810,7 @@ func deviceNetworkPriority(s *state.State, netif string) {
 }
 
 func deviceUSBEvent(s *state.State, usb usbDevice) {
-       containers, err := s.Cluster.ContainersList(db.CTypeRegular)
+       containers, err := s.Cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                logger.Error("Problem loading containers list", log.Ctx{"err": 
err})
                return
@@ -1857,7 +1858,7 @@ func deviceInotifyDirDeleteEvent(s *state.State, target 
*sys.InotifyTargetInfo)
 }
 
 func deviceInotifyDirRescan(s *state.State) {
-       containers, err := s.Cluster.ContainersList(db.CTypeRegular)
+       containers, err := s.Cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                logger.Errorf("Failed to load containers: %s", err)
                return
@@ -1922,7 +1923,7 @@ func deviceInotifyDirCreateEvent(s *state.State, target 
*sys.InotifyTargetInfo)
                return
        }
 
-       containers, err := s.Cluster.ContainersList(db.CTypeRegular)
+       containers, err := s.Cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                logger.Errorf("Failed to load containers: %s", err)
                return
@@ -2025,7 +2026,7 @@ func deviceInotifyFileEvent(s *state.State, target 
*sys.InotifyTargetInfo) {
                return
        }
 
-       containers, err := s.Cluster.ContainersList(db.CTypeRegular)
+       containers, err := s.Cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                logger.Errorf("Failed to load containers: %s", err)
                return
diff --git a/lxd/devlxd.go b/lxd/devlxd.go
index 2a05bdaa14..cac19791e1 100644
--- a/lxd/devlxd.go
+++ b/lxd/devlxd.go
@@ -467,7 +467,7 @@ func findContainerForPid(pid int32, d *Daemon) (container, 
error) {
                return nil, err
        }
 
-       containers, err := d.cluster.ContainersList(db.CTypeRegular)
+       containers, err := d.cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                return nil, err
        }
diff --git a/lxd/logging.go b/lxd/logging.go
index 3408cd6837..5f3d1be6c7 100644
--- a/lxd/logging.go
+++ b/lxd/logging.go
@@ -41,7 +41,7 @@ func expireLogs(ctx context.Context, state *state.State) 
error {
        var containers []string
        ch := make(chan struct{})
        go func() {
-               containers, err = state.Cluster.ContainersList(db.CTypeRegular)
+               containers, err = 
state.Cluster.ContainersNodeList(db.CTypeRegular)
                ch <- struct{}{}
        }()
        select {
diff --git a/lxd/main_activateifneeded.go b/lxd/main_activateifneeded.go
index b7a8927418..2f4989645a 100644
--- a/lxd/main_activateifneeded.go
+++ b/lxd/main_activateifneeded.go
@@ -105,7 +105,7 @@ func (c *cmdActivateifneeded) Run(cmd *cobra.Command, args 
[]string) error {
        }
 
        d.cluster = db.ForLocalInspection(sqldb)
-       result, err := d.cluster.ContainersList(db.CTypeRegular)
+       result, err := d.cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                return err
        }
diff --git a/lxd/networks_utils.go b/lxd/networks_utils.go
index f2ac915651..4c63e29dd1 100644
--- a/lxd/networks_utils.go
+++ b/lxd/networks_utils.go
@@ -759,7 +759,7 @@ func networkUpdateStatic(s *state.State, networkName 
string) error {
        defer networkStaticLock.Unlock()
 
        // Get all the containers
-       containers, err := s.Cluster.ContainersList(db.CTypeRegular)
+       containers, err := s.Cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                return err
        }
diff --git a/lxd/patches.go b/lxd/patches.go
index bba4d9894c..2e5d740ecf 100644
--- a/lxd/patches.go
+++ b/lxd/patches.go
@@ -213,13 +213,13 @@ func patchStorageApi(name string, d *Daemon) error {
        // Check if this LXD instace currently has any containers, snapshots, or
        // images configured. If so, we create a default storage pool in the
        // database. Otherwise, the user will have to run LXD init.
-       cRegular, err := d.cluster.ContainersList(db.CTypeRegular)
+       cRegular, err := d.cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                return err
        }
 
        // Get list of existing snapshots.
-       cSnapshots, err := d.cluster.ContainersList(db.CTypeSnapshot)
+       cSnapshots, err := d.cluster.ContainersNodeList(db.CTypeSnapshot)
        if err != nil {
                return err
        }
@@ -1881,13 +1881,13 @@ func patchStorageApiV1(name string, d *Daemon) error {
                return nil
        }
 
-       cRegular, err := d.cluster.ContainersList(db.CTypeRegular)
+       cRegular, err := d.cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                return err
        }
 
        // Get list of existing snapshots.
-       cSnapshots, err := d.cluster.ContainersList(db.CTypeSnapshot)
+       cSnapshots, err := d.cluster.ContainersNodeList(db.CTypeSnapshot)
        if err != nil {
                return err
        }
@@ -2651,7 +2651,7 @@ func patchStorageApiCephSizeRemove(name string, d 
*Daemon) error {
 }
 
 func patchDevicesNewNamingScheme(name string, d *Daemon) error {
-       cts, err := d.cluster.ContainersList(db.CTypeRegular)
+       cts, err := d.cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                logger.Errorf("Failed to retrieve containers from database")
                return err
@@ -2978,7 +2978,7 @@ func patchUpdateFromV10(d *Daemon) error {
 }
 
 func patchUpdateFromV11(d *Daemon) error {
-       cNames, err := d.cluster.ContainersList(db.CTypeSnapshot)
+       cNames, err := d.cluster.ContainersNodeList(db.CTypeSnapshot)
        if err != nil {
                return err
        }
@@ -3049,7 +3049,7 @@ func patchUpdateFromV15(d *Daemon) error {
        // munge all LVM-backed containers' LV names to match what is
        // required for snapshot support
 
-       cNames, err := d.cluster.ContainersList(db.CTypeRegular)
+       cNames, err := d.cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                return err
        }
diff --git a/lxd/storage_lvm_utils.go b/lxd/storage_lvm_utils.go
index 3231d365aa..825fb5eab6 100644
--- a/lxd/storage_lvm_utils.go
+++ b/lxd/storage_lvm_utils.go
@@ -732,7 +732,7 @@ func storageLVMThinpoolExists(vgName string, poolName 
string) (bool, error) {
 func storageLVMGetThinPoolUsers(s *state.State) ([]string, error) {
        results := []string{}
 
-       cNames, err := s.Cluster.ContainersList(db.CTypeRegular)
+       cNames, err := s.Cluster.ContainersNodeList(db.CTypeRegular)
        if err != nil {
                return results, err
        }
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to