You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by mi...@apache.org on 2018/07/13 02:30:55 UTC
[trafficcontrol] branch master updated: Fix TO db leak of prepared
statements not closed
This is an automated email from the ASF dual-hosted git repository.
mitchell852 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git
The following commit(s) were added to refs/heads/master by this push:
new 7030ac2 Fix TO db leak of prepared statements not closed
7030ac2 is described below
commit 7030ac28c3073fe0c734d82536013428cd5c7b4b
Author: Robert Butts <ro...@apache.org>
AuthorDate: Thu Jul 12 11:30:29 2018 -0600
Fix TO db leak of prepared statements not closed
Prepared statements were unnecessary, so this changes them to direct
queries.
Also fixes panics if the error log is null.
---
.../server/servers_assignment.go | 70 +++++++---------------
1 file changed, 21 insertions(+), 49 deletions(-)
diff --git a/traffic_ops/traffic_ops_golang/server/servers_assignment.go b/traffic_ops/traffic_ops_golang/server/servers_assignment.go
index cbb084f..7817a82 100644
--- a/traffic_ops/traffic_ops_golang/server/servers_assignment.go
+++ b/traffic_ops/traffic_ops_golang/server/servers_assignment.go
@@ -118,14 +118,8 @@ func assignDeliveryServicesToServer(server int, dses []int, replace bool, db *sq
if replace {
//delete currently assigned dses from server
- deleteCurrent, err := tx.Prepare("DELETE FROM deliveryservice_server WHERE server = $1")
- if err != nil {
- log.Error.Printf("could not prepare deliveryservice_server delete statement: %s\n", err)
- return nil, tc.DBError
- }
- _, err = deleteCurrent.Exec(server)
- if err != nil {
- log.Error.Printf("could not delete old deliveryservice_server associations for server: %s\n", err)
+ if _, err = tx.Exec(`DELETE FROM deliveryservice_server WHERE server = $1`, server); err != nil {
+ log.Errorf("could not delete old deliveryservice_server associations for server: %s\n", err)
return nil, tc.DBError
}
}
@@ -142,18 +136,15 @@ func assignDeliveryServicesToServer(server int, dses []int, replace bool, db *sq
// UNNEST is used to turn the array of ds values into, essentially, * FROM ( VALUES (1),(2),(3) )
// this allows for a single insert query instead of a loop over the dses.
// This pattern is used for the other bulk inserts as well.
- bulkInsert, err := tx.Prepare(`INSERT INTO deliveryservice_server (deliveryservice, server)
+ q := `
+INSERT INTO deliveryservice_server (deliveryservice, server)
WITH
q1 AS (SELECT UNNEST($1::bigint[])),
q2 AS ( SELECT * FROM (VALUES ($2::bigint)) AS server )
- SELECT * FROM q1,q2 ON CONFLICT DO NOTHING`)
- if err != nil {
- log.Error.Printf("could not prepare deliveryservice_server bulk insert: %s\n", err)
- return nil, tc.DBError
- }
- _, err = bulkInsert.Exec(dsPqArray, server)
- if err != nil {
- log.Error.Printf("could not execute deliveryservice_server bulk insert: %s\n", err)
+ SELECT * FROM q1,q2 ON CONFLICT DO NOTHING
+`
+ if _, err = tx.Exec(q, dsPqArray, server); err != nil {
+ log.Errorf("could not execute deliveryservice_server bulk insert: %s\n", err)
return nil, tc.DBError
}
@@ -166,12 +157,7 @@ func assignDeliveryServicesToServer(server int, dses []int, replace bool, db *sq
}
//we need dses: xmlids and edge_header_rewrite, regex_remap, and cache_url
- selectDsFieldsQuery, err := tx.Prepare("SELECT xml_id, edge_header_rewrite, regex_remap, cacheurl FROM deliveryservice WHERE id = ANY($1::bigint[])")
- if err != nil {
- log.Error.Printf("could not prepare ds fields query: %s\n", err)
- return nil, tc.DBError
- }
- rows, err := selectDsFieldsQuery.Query(dsPqArray)
+ rows, err := tx.Query(`SELECT xml_id, edge_header_rewrite, regex_remap, cacheurl FROM deliveryservice WHERE id = ANY($1::bigint[])`, dsPqArray)
if err != nil {
log.Error.Printf("could not execute ds fields select query: %s\n", err)
return nil, tc.DBError
@@ -221,29 +207,22 @@ func assignDeliveryServicesToServer(server int, dses []int, replace bool, db *sq
}
//insert the parameters we selected above:
- insertParams, err := tx.Prepare(`INSERT INTO parameter (config_file, name, value)
+ q = `
+INSERT INTO parameter (config_file, name, value)
WITH
q1 AS (SELECT UNNEST($1::text[]) AS config_file),
q2 AS (SELECT * FROM (VALUES ($2) ) AS name),
q3 AS (SELECT * FROM (VALUES ($3) ) AS value)
- SELECT * FROM q1,q2,q3 ON CONFLICT DO NOTHING`)
- if err != nil {
- log.Error.Printf("could not prepare parameter bulk insert query: %s\n", err)
- return nil, tc.DBError
- }
+ SELECT * FROM q1,q2,q3 ON CONFLICT DO NOTHING
+`
fileNamePqArray := pq.Array(insert)
- if _, err = insertParams.Exec(fileNamePqArray, "location", atsConfigLocation); err != nil {
+ if _, err = tx.Exec(q, fileNamePqArray, "location", atsConfigLocation); err != nil {
log.Error.Printf("could not execute parameter bulk insert: %s\n", err)
return nil, tc.DBError
}
//select the ids associated with the parameters we created above (may be able to get them from insert above to optimize)
- selectParameterIds, err := tx.Prepare("SELECT id FROM parameter WHERE name = 'location' AND config_file IN ($1)")
- if err != nil {
- log.Error.Printf("could not prepare parameter id select query: %s\n", err)
- return nil, tc.DBError
- }
- rows, err = selectParameterIds.Query(fileNamePqArray)
+ rows, err = tx.Query(`SELECT id FROM parameter WHERE name = 'location' AND config_file IN ($1)`, fileNamePqArray)
if err != nil {
log.Error.Printf("could not execute parameter id select query: %s\n", err)
return nil, tc.DBError
@@ -261,28 +240,21 @@ func assignDeliveryServicesToServer(server int, dses []int, replace bool, db *sq
}
//associate all parameter ids with the profiles associated with all servers associated with assigned dses.
- insertProfileParams, err := tx.Prepare(`INSERT INTO profile_parameter (profile, parameter)
+ q = `
+INSERT INTO profile_parameter (profile, parameter)
WITH
q1 AS ( SELECT DISTINCT profile FROM server LEFT JOIN deliveryservice_server ON server.id = deliveryservice_server.server WHERE deliveryservice_server.deliveryservice = ANY($1::bigint[]) ),
q2 AS (SELECT UNNEST($2::bigint[]) AS parameter)
SELECT * FROM q1,q2
- ON CONFLICT DO NOTHING`)
- if err != nil {
- log.Error.Printf("could not prepare profile_parameter bulk insert: %s\n", err)
- return nil, tc.DBError
- }
- if _, err = insertProfileParams.Exec(dsPqArray, pq.Array(parameterIds)); err != nil {
+ ON CONFLICT DO NOTHING
+`
+ if _, err = tx.Exec(q, dsPqArray, pq.Array(parameterIds)); err != nil {
log.Error.Printf("could not execute profile_parameter bulk insert: %s\n", err)
return nil, tc.DBError
}
//process delete list
- deleteTx, err := tx.Prepare(`DELETE FROM parameter WHERE name = 'location' AND config_file = ANY($1)`)
- if err != nil {
- log.Error.Printf("could not prepare parameter delete query: %s\n", err)
- return nil, tc.DBError
- }
- if _, err = deleteTx.Exec(pq.Array(delete)); err != nil {
+ if _, err = tx.Exec(`DELETE FROM parameter WHERE name = 'location' AND config_file = ANY($1)`, pq.Array(delete)); err != nil {
log.Error.Printf("could not execute parameter delete query: %s\n", err)
return nil, tc.DBError
}