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 <r...@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
        }

Reply via email to