The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6707
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 7068b83834e6db10c01acd560b276c514aae4c5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 14 Jan 2020 10:21:43 -0500 Subject: [PATCH 1/2] lxd/db: Silence normal sql errors 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/db/db.go | 10 ---------- lxd/db/query/retry.go | 15 ++++++++++++--- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/lxd/db/db.go b/lxd/db/db.go index c0f5d1f5b5..1ca81e60dd 100644 --- a/lxd/db/db.go +++ b/lxd/db/db.go @@ -420,16 +420,6 @@ func (c *Cluster) Begin() (*sql.Tx, error) { return begin(c.db) } -func isNoMatchError(err error) bool { - if err == nil { - return false - } - if err.Error() == "sql: no rows in result set" { - return true - } - return false -} - func begin(db *sql.DB) (*sql.Tx, error) { for i := 0; i < 1000; i++ { tx, err := db.Begin() diff --git a/lxd/db/query/retry.go b/lxd/db/query/retry.go index 240f75e1ac..a67f3dc5ac 100644 --- a/lxd/db/query/retry.go +++ b/lxd/db/query/retry.go @@ -1,12 +1,14 @@ package query import ( + "database/sql" "strings" "time" - "github.com/lxc/lxd/shared/logger" "github.com/mattn/go-sqlite3" "github.com/pkg/errors" + + "github.com/lxc/lxd/shared/logger" ) // Retry wraps a function that interacts with the database, and retries it in @@ -19,8 +21,13 @@ func Retry(f func() error) error { for i := 0; i < 5; i++ { err = f() if err != nil { - logger.Debugf("Database error: %#v", err) + // No point in re-trying or logging a no-row error. + if err == sql.ErrNoRows { + break + } + // Process actual errors. + logger.Debugf("Database error: %#v", err) if IsRetriableError(err) { logger.Debugf("Retry failed db interaction (%v)", err) time.Sleep(250 * time.Millisecond) @@ -29,6 +36,7 @@ func Retry(f func() error) error { } break } + return err } @@ -36,10 +44,10 @@ func Retry(f func() error) error { // interaction can be safely retried. func IsRetriableError(err error) bool { err = errors.Cause(err) - if err == nil { return false } + if err == sqlite3.ErrLocked || err == sqlite3.ErrBusy { return true } @@ -47,6 +55,7 @@ func IsRetriableError(err error) bool { if strings.Contains(err.Error(), "database is locked") { return true } + if strings.Contains(err.Error(), "bad connection") { return true } From 364900bfb7cc9bbd1a168715d865c4b834b0f0b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgra...@ubuntu.com> Date: Tue, 14 Jan 2020 10:50:26 -0500 Subject: [PATCH 2/2] lxd/db: Fix image profile copying logic 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/db/images.go | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/lxd/db/images.go b/lxd/db/images.go index 4a2f9c00dc..4fd1fbfc26 100644 --- a/lxd/db/images.go +++ b/lxd/db/images.go @@ -794,10 +794,26 @@ func (c *Cluster) ImageAliasUpdate(id int, imageID int, desc string) error { // ImageCopyDefaultProfiles copies default profiles from id to new_id. func (c *Cluster) ImageCopyDefaultProfiles(id int, newID int) error { - stmt := `INSERT INTO images_profiles (image_id, profile_id) - SELECT ?, profile_id FROM images_profiles WHERE image_id=?` - err := exec(c.db, stmt, newID, id) - return err + err := c.Transaction(func(tx *ClusterTx) error { + // Delete all current associations. + _, err := tx.tx.Exec("DELETE FROM images_profiles WHERE image_id=?", newID) + if err != nil { + return err + } + + // Copy the entries over. + _, err = tx.tx.Exec("INSERT INTO images_profiles (image_id, profile_id) SELECT ?, profile_id FROM images_profiles WHERE image_id=?", newID, id) + if err != nil { + return err + } + + return nil + }) + if err != nil { + return err + } + + return nil } // ImageLastAccessUpdate updates the last_use_date field of the image with the @@ -808,7 +824,7 @@ func (c *Cluster) ImageLastAccessUpdate(fingerprint string, date time.Time) erro return err } -//ImageLastAccessInit inits the last_use_date field of the image with the given fingerprint. +// ImageLastAccessInit inits the last_use_date field of the image with the given fingerprint. func (c *Cluster) ImageLastAccessInit(fingerprint string) error { stmt := `UPDATE images SET cached=1, last_use_date=strftime("%s") WHERE fingerprint=?` err := exec(c.db, stmt, fingerprint)
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel