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

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) ===

From e7e50897e285921da7559d85e72d83b1e4719bab Mon Sep 17 00:00:00 2001
From: Free Ekanayaka <free.ekanay...@canonical.com>
Date: Tue, 26 May 2020 15:44:45 +0100
Subject: [PATCH 1/2] lxd: Reduce number of transactions in
 containerPostClusteringMigrate

Signed-off-by: Free Ekanayaka <free.ekanay...@canonical.com>
---
 lxd/db/instances.go  | 24 +++++++++++++++++-------
 lxd/instance_post.go | 39 ++++++++++++++++++++++-----------------
 2 files changed, 39 insertions(+), 24 deletions(-)

diff --git a/lxd/db/instances.go b/lxd/db/instances.go
index 9da263677c..15c0ebd977 100644
--- a/lxd/db/instances.go
+++ b/lxd/db/instances.go
@@ -680,9 +680,9 @@ func CreateInstanceConfig(tx *sql.Tx, id int, config 
map[string]string) error {
 func (c *Cluster) GetInstanceConfig(id int, key string) (string, error) {
        q := "SELECT value FROM instances_config WHERE instance_id=? AND key=?"
        value := ""
-       arg1 := []interface{}{id, key}
-       arg2 := []interface{}{&value}
-       err := dbQueryRowScan(c, q, arg1, arg2)
+       err := c.Transaction(func(tx *ClusterTx) error {
+               return tx.tx.QueryRow(q, id, key).Scan(&value)
+       })
        if err == sql.ErrNoRows {
                return "", ErrNoSuchObject
        }
@@ -693,7 +693,16 @@ func (c *Cluster) GetInstanceConfig(id int, key string) 
(string, error) {
 // DeleteInstanceConfigKey removes the given key from the config of the 
instance
 // with the given ID.
 func (c *Cluster) DeleteInstanceConfigKey(id int, key string) error {
-       err := exec(c, "DELETE FROM instances_config WHERE key=? AND 
instance_id=?", key, id)
+       return c.Transaction(func(tx *ClusterTx) error {
+               return tx.DeleteInstanceConfigKey(int64(id), key)
+       })
+}
+
+// DeleteInstanceConfigKey removes the given key from the config of the 
instance
+// with the given ID.
+func (c *ClusterTx) DeleteInstanceConfigKey(id int64, key string) error {
+       q := "DELETE FROM instances_config WHERE key=? AND instance_id=?"
+       _, err := c.tx.Exec(q, key, id)
        return err
 }
 
@@ -704,9 +713,10 @@ func (c *Cluster) UpdateInstanceStatefulFlag(id int, 
stateful bool) error {
        if stateful {
                statefulInt = 1
        }
-
-       err := exec(c, "UPDATE instances SET stateful=? WHERE id=?", 
statefulInt, id)
-       return err
+       return c.Transaction(func(tx *ClusterTx) error {
+               _, err := tx.tx.Exec("UPDATE instances SET stateful=? WHERE 
id=?", statefulInt, id)
+               return err
+       })
 }
 
 // AddProfilesToInstance associates the instance with the given ID with the
diff --git a/lxd/instance_post.go b/lxd/instance_post.go
index 448ece18fb..88872df4a2 100644
--- a/lxd/instance_post.go
+++ b/lxd/instance_post.go
@@ -373,26 +373,31 @@ func containerPostClusteringMigrate(d *Daemon, c 
instance.Instance, oldName, new
                }
 
                // Restore the original value of "volatile.apply_template"
-               id, err := d.cluster.GetInstanceID(c.Project(), destName)
-               if err != nil {
-                       return errors.Wrap(err, "Failed to get ID of moved 
instance")
-               }
-
-               err = d.cluster.DeleteInstanceConfigKey(id, 
"volatile.apply_template")
-               if err != nil {
-                       return errors.Wrap(err, "Failed to remove 
volatile.apply_template config key")
-               }
-
-               if origVolatileApplyTemplate != "" {
-                       config := map[string]string{
-                               "volatile.apply_template": 
origVolatileApplyTemplate,
+               project := c.Project()
+               err = d.cluster.Transaction(func(tx *db.ClusterTx) error {
+                       id, err := tx.GetInstanceID(project, destName)
+                       if err != nil {
+                               return errors.Wrap(err, "Failed to get ID of 
moved instance")
                        }
-                       err := d.cluster.Transaction(func(tx *db.ClusterTx) 
error {
-                               return tx.CreateInstanceConfig(id, config)
-                       })
+                       err = tx.DeleteInstanceConfigKey(id, 
"volatile.apply_template")
                        if err != nil {
-                               return errors.Wrap(err, "Failed to set 
volatile.apply_template config key")
+                               return errors.Wrap(err, "Failed to remove 
volatile.apply_template config key")
+                       }
+
+                       if origVolatileApplyTemplate != "" {
+                               config := map[string]string{
+                                       "volatile.apply_template": 
origVolatileApplyTemplate,
+                               }
+                               err = tx.CreateInstanceConfig(int(id), config)
+                               if err != nil {
+                                       return errors.Wrap(err, "Failed to set 
volatile.apply_template config key")
+                               }
                        }
+
+                       return nil
+               })
+               if err != nil {
+                       return err
                }
 
                return nil

From 1968db8fe5528d5c06ced1ba3d3d29d1ec289768 Mon Sep 17 00:00:00 2001
From: Free Ekanayaka <free.ekanay...@canonical.com>
Date: Tue, 26 May 2020 15:52:38 +0100
Subject: [PATCH 2/2] lxd/db: Use query.SelectStrings helper in
 LegacyContainersList

Signed-off-by: Free Ekanayaka <free.ekanay...@canonical.com>
---
 lxd/db/instances.go | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/lxd/db/instances.go b/lxd/db/instances.go
index 15c0ebd977..ca48f00f06 100644
--- a/lxd/db/instances.go
+++ b/lxd/db/instances.go
@@ -766,17 +766,16 @@ INSERT INTO instances_profiles (instance_id, profile_id, 
apply_order)
 // use it for new code.
 func (c *Cluster) LegacyContainersList() ([]string, error) {
        q := fmt.Sprintf("SELECT name FROM instances WHERE type=? ORDER BY 
name")
-       inargs := []interface{}{instancetype.Container}
-       var container string
-       outfmt := []interface{}{container}
-       result, err := queryScan(c, q, inargs, outfmt)
-       if err != nil {
-               return nil, err
-       }
 
        var ret []string
-       for _, container := range result {
-               ret = append(ret, container[0].(string))
+
+       err := c.Transaction(func(tx *ClusterTx) error {
+               var err error
+               ret, err = query.SelectStrings(tx.tx, q, instancetype.Container)
+               return err
+       })
+       if err != nil {
+               return nil, err
        }
 
        return ret, nil
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to