[lxc-devel] [lxd/master] lxd/db: Don't hang after bad request
stgraber on Github
lxc-bot at linuxcontainers.org
Wed Jun 27 16:53:09 UTC 2018
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 370 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180627/c92a993c/attachment.bin>
-------------- next part --------------
From 2e942e632fa23e2eab2668e9ec58f7200c6b7d7e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Wed, 27 Jun 2018 12:52:21 -0400
Subject: [PATCH] lxd/db: Don't hang after bad request
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Closes #4692
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/api_internal.go | 29 ++++++++++++++++++++++-------
1 file changed, 22 insertions(+), 7 deletions(-)
diff --git a/lxd/api_internal.go b/lxd/api_internal.go
index ce9529800..b92e976ab 100644
--- a/lxd/api_internal.go
+++ b/lxd/api_internal.go
@@ -189,24 +189,30 @@ func internalSQLPost(d *Daemon, r *http.Request) Response {
}
result := internalSQLResult{}
+
tx, err := db.Begin()
if err != nil {
return SmartError(err)
}
+
if strings.HasPrefix(strings.ToUpper(query), "SELECT") {
err = internalSQLSelect(tx, query, &result)
tx.Rollback()
} else {
err = internalSQLExec(tx, query, &result)
- if err == nil {
+ if err != nil {
+ tx.Rollback()
+ } else {
err = tx.Commit()
}
}
if err != nil {
return SmartError(err)
}
+
batch.Results = append(batch.Results, result)
}
+
return SyncResponse(true, batch)
}
@@ -214,23 +220,27 @@ func internalSQLSelect(tx *sql.Tx, query string, result *internalSQLResult) erro
result.Type = "select"
rows, err := tx.Query(query)
if err != nil {
- return errors.Wrap(err, "failed to execute query")
+ return errors.Wrap(err, "Failed to execute query")
}
+
defer rows.Close()
result.Columns, err = rows.Columns()
if err != nil {
- return errors.Wrap(err, "failed to fetch colume names")
+ return errors.Wrap(err, "Failed to fetch colume names")
}
+
for rows.Next() {
row := make([]interface{}, len(result.Columns))
rowPointers := make([]interface{}, len(result.Columns))
for i := range row {
rowPointers[i] = &row[i]
}
+
err := rows.Scan(rowPointers...)
if err != nil {
- return errors.Wrap(err, "failed to scan row")
+ return errors.Wrap(err, "Failed to scan row")
}
+
for i, column := range row {
// Convert bytes to string. This is safe as
// long as we don't have any BLOB column type.
@@ -239,12 +249,15 @@ func internalSQLSelect(tx *sql.Tx, query string, result *internalSQLResult) erro
row[i] = string(data)
}
}
+
result.Rows = append(result.Rows, row)
}
+
err = rows.Err()
if err != nil {
- return errors.Wrap(err, "rows error")
+ return errors.Wrap(err, "Got a row error")
}
+
return nil
}
@@ -252,12 +265,14 @@ func internalSQLExec(tx *sql.Tx, query string, result *internalSQLResult) error
result.Type = "exec"
r, err := tx.Exec(query)
if err != nil {
- return errors.Wrapf(err, "failed to exec query")
+ return errors.Wrapf(err, "Failed to exec query")
}
+
result.RowsAffected, err = r.RowsAffected()
if err != nil {
- return errors.Wrap(err, "failed to fetch affected rows")
+ return errors.Wrap(err, "Failed to fetch affected rows")
}
+
return nil
}
More information about the lxc-devel
mailing list