Mongo log works (and bug fixed)
This commit is contained in:
parent
3770190db5
commit
48711af1d9
3 changed files with 45 additions and 5 deletions
|
|
@ -140,9 +140,9 @@ func (it *Iterator) Clone() graph.Iterator {
|
||||||
|
|
||||||
func (it *Iterator) Next() bool {
|
func (it *Iterator) Next() bool {
|
||||||
var result struct {
|
var result struct {
|
||||||
Id string "_id"
|
Id string "_id"
|
||||||
Added []int64
|
Added []int64 "Added"
|
||||||
Deleted []int64
|
Deleted []int64 "Deleted"
|
||||||
}
|
}
|
||||||
found := it.iter.Next(&result)
|
found := it.iter.Next(&result)
|
||||||
if !found {
|
if !found {
|
||||||
|
|
|
||||||
|
|
@ -170,6 +170,25 @@ func (qs *TripleStore) updateTriple(t quad.Quad, id int64, proc graph.Procedure)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (qs *TripleStore) checkValid(key string) bool {
|
||||||
|
var indexEntry struct {
|
||||||
|
Added []int64 "Added"
|
||||||
|
Deleted []int64 "Deleted"
|
||||||
|
}
|
||||||
|
err := qs.db.C("quads").FindId(key).One(&indexEntry)
|
||||||
|
if err == mgo.ErrNotFound {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
glog.Errorln("Other error checking valid quad: %s %v.", key, err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if len(indexEntry.Added) <= len(indexEntry.Deleted) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
func (qs *TripleStore) updateLog(d *graph.Delta) error {
|
func (qs *TripleStore) updateLog(d *graph.Delta) error {
|
||||||
var action string
|
var action string
|
||||||
if d.Action == graph.Add {
|
if d.Action == graph.Add {
|
||||||
|
|
@ -193,6 +212,23 @@ func (qs *TripleStore) updateLog(d *graph.Delta) error {
|
||||||
func (qs *TripleStore) ApplyDeltas(in []*graph.Delta) error {
|
func (qs *TripleStore) ApplyDeltas(in []*graph.Delta) error {
|
||||||
qs.session.SetSafe(nil)
|
qs.session.SetSafe(nil)
|
||||||
ids := make(map[string]int)
|
ids := make(map[string]int)
|
||||||
|
// Pre-check the existence condition.
|
||||||
|
for _, d := range in {
|
||||||
|
key := qs.getIdForTriple(d.Quad)
|
||||||
|
switch d.Action {
|
||||||
|
case graph.Add:
|
||||||
|
if qs.checkValid(key) {
|
||||||
|
return graph.ErrQuadExists
|
||||||
|
}
|
||||||
|
case graph.Delete:
|
||||||
|
if !qs.checkValid(key) {
|
||||||
|
return graph.ErrQuadNotExist
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if glog.V(2) {
|
||||||
|
glog.Infoln("Existence verified. Proceeding.")
|
||||||
|
}
|
||||||
for _, d := range in {
|
for _, d := range in {
|
||||||
err := qs.updateLog(d)
|
err := qs.updateLog(d)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -285,6 +321,9 @@ func (qs *TripleStore) Horizon() int64 {
|
||||||
var log MongoLogEntry
|
var log MongoLogEntry
|
||||||
err := qs.db.C("log").Find(nil).Sort("-LogID").One(&log)
|
err := qs.db.C("log").Find(nil).Sort("-LogID").One(&log)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
if err == mgo.ErrNotFound {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
glog.Errorf("Could not get Horizon from Mongo: %v", err)
|
glog.Errorf("Could not get Horizon from Mongo: %v", err)
|
||||||
}
|
}
|
||||||
return log.LogID
|
return log.LogID
|
||||||
|
|
|
||||||
|
|
@ -33,8 +33,9 @@ type Single struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSingleReplication(ts graph.TripleStore, opts graph.Options) (graph.QuadWriter, error) {
|
func NewSingleReplication(ts graph.TripleStore, opts graph.Options) (graph.QuadWriter, error) {
|
||||||
rep := &Single{nextID: ts.Horizon(), ts: ts}
|
horizon := ts.Horizon()
|
||||||
if rep.nextID <= 0 {
|
rep := &Single{nextID: horizon + 1, ts: ts}
|
||||||
|
if horizon <= 0 {
|
||||||
rep.nextID = 1
|
rep.nextID = 1
|
||||||
}
|
}
|
||||||
return rep, nil
|
return rep, nil
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue