Commit 92fe0aa7 authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 10ca3c4e
...@@ -516,6 +516,7 @@ func (δBtail *ΔBtail) δZConnectTracked(δZv *zodb.EventCommit) (δZTC SetOid, ...@@ -516,6 +516,7 @@ func (δBtail *ΔBtail) δZConnectTracked(δZv *zodb.EventCommit) (δZTC SetOid,
type nodeInRange struct { type nodeInRange struct {
lo, hi_ Key // [lo, hi_] NOTE _not_ hi) not to overflow at ∞ lo, hi_ Key // [lo, hi_] NOTE _not_ hi) not to overflow at ∞
node Node node Node
done bool // whether this node was already taken into account while computing diff
} }
// rangeSplit represents set of nodes covering a range. // rangeSplit represents set of nodes covering a range.
...@@ -583,7 +584,11 @@ func (prs *rangeSplit) Expand(rnode *nodeInRange) (children rangeSplit) { ...@@ -583,7 +584,11 @@ func (prs *rangeSplit) Expand(rnode *nodeInRange) (children rangeSplit) {
hi_ = treev[i+1].Key()-1 // NOTE -1 hi_ = treev[i+1].Key()-1 // NOTE -1
} }
children = append(children, &nodeInRange{lo, hi_, treev[i].Child()}) children = append(children, &nodeInRange{
lo: lo,
hi_: hi_,
node: treev[i].Child(),
})
} }
// fmt.Printf("E children: %s\n", children) // fmt.Printf("E children: %s\n", children)
...@@ -793,6 +798,7 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid] ...@@ -793,6 +798,7 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid]
Bqueue.Add(k) Bqueue.Add(k)
} }
arn.done = true
continue continue
} }
...@@ -837,6 +843,8 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid] ...@@ -837,6 +843,8 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid]
Adone.Add(k) Adone.Add(k)
Bqueue.Add(k) Bqueue.Add(k)
} }
rchild.done = true
} }
} }
} }
...@@ -865,12 +873,17 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid] ...@@ -865,12 +873,17 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid]
for k := range Bqueue { for k := range Bqueue {
Bdone.Add(k) Bdone.Add(k)
bbucket, ok, err := bv.GetToBucket(ctx, k) bbucket, ok, err := bv.GetToBucket(ctx, k)
if err != nil {
return nil, err
}
if !ok { if !ok {
// FIXME -> key must be included into some node.hole
continue // key not covered continue // key not covered
} }
// XXX check bucket for already "done" (i.e. taken into account) // + bucket if not already done
// XXX update track.hole if k not in bbucket
if !bbucket.done {
δB, err := diffB(ctx, nil, bbucket.node.(*Bucket)) δB, err := diffB(ctx, nil, bbucket.node.(*Bucket))
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -889,6 +902,9 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid] ...@@ -889,6 +902,9 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid]
} }
} }
bbucket.done = true
}
} }
// A queue // A queue
...@@ -896,12 +912,17 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid] ...@@ -896,12 +912,17 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid]
for k := range Aqueue { for k := range Aqueue {
Adone.Add(k) Adone.Add(k)
abucket, ok, err := av.GetToBucket(ctx, k) abucket, ok, err := av.GetToBucket(ctx, k)
if err != nil {
return nil, err
}
if !ok { if !ok {
// FIXME -> key must be included into some node.hole
continue // key not covered continue // key not covered
} }
// XXX check bucket for already "done" // - bucket if not already done
// XXX also extract holes
if !abucket.done {
δA, err := diffB(ctx, abucket.node.(*Bucket), nil) δA, err := diffB(ctx, abucket.node.(*Bucket), nil)
if err != nil { if err != nil {
return nil, err return nil, err
...@@ -919,11 +940,11 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid] ...@@ -919,11 +940,11 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid]
Bqueue.Add(k) Bqueue.Add(k)
} }
} }
}
abucket.done = true
}
}
} }
return δ, nil return δ, nil
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment