database: Fix to a locking issue with PostgreSQL

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 hung.
This commit is contained in:
Quentin Machu 2015-11-17 19:34:06 -05:00
parent 8aacc8bfdc
commit 915903c1c1
2 changed files with 3 additions and 9 deletions

2
Godeps/Godeps.json generated
View File

@ -42,7 +42,7 @@
{ {
"ImportPath": "github.com/google/cayley", "ImportPath": "github.com/google/cayley",
"Comment": "v0.4.1-160-gcdf0154", "Comment": "v0.4.1-160-gcdf0154",
"Rev": "cfbc0b364910ab69bbced5d2f7913ee7e80a0c80" "Rev": "2f5ce909a242795d82529658ceb586863f5dd559"
}, },
{ {
"ImportPath": "github.com/julienschmidt/httprouter", "ImportPath": "github.com/julienschmidt/httprouter",

View File

@ -192,16 +192,10 @@ func (qs *QuadStore) runTxPostgres(tx *sql.Tx, in []graph.Delta, opts graph.Igno
return qs.copyFrom(tx, in) 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 { for _, d := range in {
switch d.Action { switch d.Action {
case graph.Add: 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.Subject,
d.Quad.Predicate, d.Quad.Predicate,
d.Quad.Object, d.Quad.Object,
@ -214,7 +208,7 @@ func (qs *QuadStore) runTxPostgres(tx *sql.Tx, in []graph.Delta, opts graph.Igno
hashOf(d.Quad.Label), hashOf(d.Quad.Label),
) )
if err != nil { if err != nil {
glog.Errorf("couldn't prepare INSERT statement: %v", err) glog.Errorf("couldn't exec INSERT statement: %v", err)
return err return err
} }
case graph.Delete: case graph.Delete: