cayleygraph / cayleygraph/cayley

quad subject nil after transaction

Open
#885 0 comments 0 reactions 1 assignee Claimed by @dennwc View on GitHub
bug
Dominant language
Go
Stars
15.1k
Forks
1.2k
PR merge metrics
No merged PRs in 30d

Description

**Description**

quad subject nil after removing 2 quads with same subject and adding a new one the same transaction.

starting with empty store:
```
2019/11/06 09:18:12 after first transaction:
2019/11/06 09:18:12 (quad.Quad) "a" -- "to" -> "b"
2019/11/06 09:18:12 (quad.Quad) "a" -- "updated" -> "2019-11-06T11:45:26Z"^^
2019/11/06 09:18:12 after second transaction:
2019/11/06 09:18:12 (quad.Quad) -- "updated" -> "2019-11-06T11:46:26Z"^^
2019/11/06 09:18:12 expected:
2019/11/06 09:18:12 (quad.Quad) "a" -- "updated" -> "2019-11-06T11:46:26Z"^^
```

**Steps to reproduce the issue:**

```go
package main

import (
"log"
"os"
"time"

"github.com/cayleygraph/cayley"
"github.com/cayleygraph/cayley/graph"
_ "github.com/cayleygraph/cayley/graph/kv/all"
"github.com/cayleygraph/quad"

"github.com/davecgh/go-spew/spew"
)

const (
dbpath = ".db/leveldb"
dbtype = "leveldb"
// dbpath = ".db/bolt"
// dbtype = "bolt"
)

func main() {
dbExists, err := exists(dbpath)
if err != nil {
log.Fatal(err)
}

if !dbExists {
// initialize the database
err := graph.InitQuadStore(dbtype, dbpath, nil)
if err != nil {
if err != graph.ErrDatabaseExists {
log.Fatal(err)
}
}
}

store, err := cayley.NewGraph(dbtype, dbpath, nil)
if err != nil {
log.Fatal(err)
}

t0, err := time.Parse(time.RFC3339, "2019-11-06T11:45:26.371Z")
t1, err := time.Parse(time.RFC3339, "2019-11-06T11:46:26.371Z")

addQuads := []quad.Quad{
quad.Make("a", "to", "b", nil),
quad.Make("a", "updated", t0, nil),
}

t := cayley.NewTransaction()
for _, q := range addQuads {
t.AddQuad(q)
}
err = store.ApplyTransaction(t)
if err != nil {
log.Fatal(err)
}

log.Printf("after first transaction:")
it := store.QuadsAllIterator()
for it.Next(nil) {
qu := store.Quad(it.Result())
log.Printf(spew.Sdump(qu))
}

rmQuads := []quad.Quad{
quad.Make("a", "to", "b", nil),
quad.Make("a", "updated", t0, nil),
}

addQuads = []quad.Quad{
quad.Make("a", "updated", t1, nil),
}

t = cayley.NewTransaction()
for _, q := range rmQuads {
t.RemoveQuad(q)
}
for _, q := range addQuads {
t.AddQuad(q)
}
err = store.ApplyTransaction(t)
if err != nil {
log.Fatal(err)
}

log.Printf("after second transaction:")
it = store.QuadsAllIterator()
for it.Next(nil) {
qu := store.Quad(it.Result())
log.Printf(spew.Sdump(qu))
}

log.Printf("expected:")
for _, q := range addQuads {
log.Printf(spew.Sdump(q))
}
}

// exists returns whether the given file or directory exists
func exists(path string) (bool, error) {
_, err := os.Stat(path)
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return true, err
}
```

**Received results:**

2019/11/06 09:18:12 after first transaction:
2019/11/06 09:18:12 (quad.Quad) "a" -- "to" -> "b"
2019/11/06 09:18:12 (quad.Quad) "a" -- "updated" -> "2019-11-06T11:45:26Z"^^
2019/11/06 09:18:12 after second transaction:
2019/11/06 09:18:12 (quad.Quad) -- "updated" -> "2019-11-06T11:46:26Z"^^

also dump panics/NPE:
➜ txTest cayley dump -o - -d leveldb -a .db/leveldb
I1106 09:12:15.961568 9765 command.go:805] Cayley version: v0.8.x-dev (dev snapshot)
I1106 09:12:15.961795 9765 database.go:146] using backend "leveldb" (.db/leveldb)
I1106 09:12:16.029981 9765 dump.go:73] writing quads to stdout
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x43dbce6]

goroutine 1 [running]:
github.com/cayleygraph/quad/nquads.(*Writer).writeValue(0xc000448120, 0x0, 0x0, 0x5231378, 0x1)
/Users/mike/zo/pkg/mod/github.com/cayleygraph/quad@v1.1.0/nquads/nquads.go:303 +0x36
github.com/cayleygraph/quad/nquads.(*Writer).WriteQuad(0xc000448120, 0x0, 0x0, 0x54e7c80, 0xc0004500e0, 0x54e7cc0, 0xc0001463a0, 0x0, 0x0, 0x1, ...)
/Users/mike/zo/pkg/mod/github.com/cayleygraph/quad@v1.1.0/nquads/nquads.go:316 +0x58
github.com/cayleygraph/quad/nquads.(*Writer).WriteQuads(0xc000448120, 0xc0057e4000, 0x1, 0x2710, 0x1, 0x54d24a0, 0xc0000da050)
/Users/mike/zo/pkg/mod/github.com/cayleygraph/quad@v1.1.0/nquads/nquads.go:329 +0x10d
...

**Expected results:**

2019/11/06 09:18:12 after first transaction:
2019/11/06 09:18:12 (quad.Quad) "a" -- "to" -> "b"
2019/11/06 09:18:12 (quad.Quad) "a" -- "updated" -> "2019-11-06T11:45:26Z"^^
2019/11/06 09:18:12 after second transaction:
2019/11/06 09:18:12 (quad.Quad) "a" -- "updated" -> "2019-11-06T11:46:26Z"^^

**Output of `cayley version` or commit hash:**
v0.7.7

**Environment details:**
go1.13.3 darwin/amd64
bolt and leveldb both affected

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.