From d874441431fda80f0730fab2d9853467f7bcf829 Mon Sep 17 00:00:00 2001 From: Quentin Machu Date: Tue, 17 Nov 2015 20:31:40 -0500 Subject: [PATCH] Fix a deadlock behavior with DELETE transactions It appears that preparing an INSERT statement on PostgreSQL actually makes it expecting to receive INSERTs and thus, it create some kind of locks for it. If instead, you only send him DELETE statements, it will indefinitely wait for an INSERT and will hung. --- graph/sql/quadstore.go | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/graph/sql/quadstore.go b/graph/sql/quadstore.go index d03e84e..24ff262 100644 --- a/graph/sql/quadstore.go +++ b/graph/sql/quadstore.go @@ -192,16 +192,10 @@ func (qs *QuadStore) runTxPostgres(tx *sql.Tx, in []graph.Delta, opts graph.Igno return qs.copyFrom(tx, in) } - insert, err := tx.Prepare(`INSERT INTO quads(subject, predicate, object, label, id, ts, subject_hash, predicate_hash, object_hash, label_hash) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`) - defer insert.Close() - if err != nil { - glog.Errorf("Cannot prepare insert statement: %v", err) - return err - } for _, d := range in { switch d.Action { case graph.Add: - _, err := insert.Exec( + _, err := tx.Exec(`INSERT INTO quads(subject, predicate, object, label, id, ts, subject_hash, predicate_hash, object_hash, label_hash) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10);`, d.Quad.Subject, d.Quad.Predicate, d.Quad.Object, @@ -214,7 +208,7 @@ func (qs *QuadStore) runTxPostgres(tx *sql.Tx, in []graph.Delta, opts graph.Igno hashOf(d.Quad.Label), ) if err != nil { - glog.Errorf("couldn't prepare INSERT statement: %v", err) + glog.Errorf("couldn't exec INSERT statement: %v", err) return err } case graph.Delete: