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,28 +873,36 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid] ...@@ -865,28 +873,36 @@ 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
δB, err := diffB(ctx, nil, bbucket.node.(*Bucket)) if !bbucket.done {
if err != nil { δB, err := diffB(ctx, nil, bbucket.node.(*Bucket))
return nil, err if err != nil {
} return nil, err
}
// δ <- δB // δ <- δB
err = δMerge(δ, δB) err = δMerge(δ, δB)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// Aqueue <- δB // Aqueue <- δB
for k := range δB { for k := range δB {
if !Adone.Has(k) { if !Adone.Has(k) {
Aqueue.Add(k) Aqueue.Add(k)
}
} }
bbucket.done = true
} }
} }
...@@ -896,35 +912,40 @@ func diffT(ctx context.Context, a, b *Tree, δZTC SetOid, trackIdx map[zodb.Oid] ...@@ -896,35 +912,40 @@ 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
δA, err := diffB(ctx, abucket.node.(*Bucket), nil) if !abucket.done {
if err != nil { δA, err := diffB(ctx, abucket.node.(*Bucket), nil)
return nil, err if err != nil {
} return nil, err
}
// δ <- δA // δ <- δA
err = δMerge(δ, δA) err = δMerge(δ, δA)
if err != nil { if err != nil {
return nil, err return nil, err
} }
// Bqueue <- δA // Bqueue <- δA
for k := range δA { for k := range δA {
if !Bdone.Has(k) { if !Bdone.Has(k) {
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