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