Commit b8be35ec authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent a8945cbf
...@@ -283,6 +283,9 @@ func (orig *_ΔTtail) Clone() *_ΔTtail { ...@@ -283,6 +283,9 @@ func (orig *_ΔTtail) Clone() *_ΔTtail {
// vδTClone returns deep copy of []ΔTree. // vδTClone returns deep copy of []ΔTree.
func vδTClone(orig []ΔTree) []ΔTree { func vδTClone(orig []ΔTree) []ΔTree {
if orig == nil {
return nil
}
klon := make([]ΔTree, 0, len(orig)) klon := make([]ΔTree, 0, len(orig))
for _, origδT := range orig { for _, origδT := range orig {
klonδT := ΔTree{ klonδT := ΔTree{
...@@ -512,10 +515,16 @@ func (δBtail *ΔBtail) rebuild1KeyIfNeeded(root zodb.Oid, key Key) error { ...@@ -512,10 +515,16 @@ func (δBtail *ΔBtail) rebuild1KeyIfNeeded(root zodb.Oid, key Key) error {
func (δBtail *ΔBtail) rebuild1(root zodb.Oid) error { func (δBtail *ΔBtail) rebuild1(root zodb.Oid) error {
// XXX locking // XXX locking
δTtail := δBtail.byRoot[root] // must be there δTtail := δBtail.byRoot[root] // must be there
δtrackSet, δrevSet, err := δTtail.rebuild(root, δBtail.δZtail, δBtail.db) // δtrackSet, δrevSet, err := δTtail.rebuild(root, δBtail.δZtail, δBtail.db)
trackNew := δTtail.trackNew
δTtail.trackNew = blib.PPTreeSubSet{}
vδTnew, δtrackSet, err := vδTBuild(root, trackNew, δBtail.δZtail, δBtail.db)
if err != nil { if err != nil {
return err return err
} }
// XXX comment about RCU snapshot
δTtail.vδT = vδTClone(δTtail.vδT)
δrevSet := vδTMergeInplace(&δTtail.vδT, vδTnew)
δBtail.trackSet.UnionInplace(δtrackSet) δBtail.trackSet.UnionInplace(δtrackSet)
δBtail.vδBroots_Update(root, δrevSet) δBtail.vδBroots_Update(root, δrevSet)
return nil return nil
...@@ -657,19 +666,41 @@ func vδTBuild1(atPrev zodb.Tid, δZ zodb.ΔRevEntry, trackNew blib.PPTreeSubSet ...@@ -657,19 +666,41 @@ func vδTBuild1(atPrev zodb.Tid, δZ zodb.ΔRevEntry, trackNew blib.PPTreeSubSet
debugfΔBtail(" -> root<%s> δkv*: %v δtrack*: %v δtkeycov*: %v\n", root, δT, δtrack, δtkeycov) debugfΔBtail(" -> root<%s> δkv*: %v δtrack*: %v δtkeycov*: %v\n", root, δT, δtrack, δtkeycov)
for _, δv := range δT { for k, δv := range δT {
// the diff was backward; vδT entries are with diff forward // the diff was backward; vδT entries are with diff forward
δv.New, δv.Old = δv.Old, δv.New δv.New, δv.Old = δv.Old, δv.New
δT[k] = δv
} }
return δT, δtrack, δtkeycov, nil return δT, δtrack, δtkeycov, nil
} }
// vδTMergeInplace merges vδTnew into vδT.
//
// δrevSet indicates set of new revisions created in vδT.
// vδT is modified inplace.
//
// XXX test
func vδTMergeInplace(pvδT *[]ΔTree, vδTnew []ΔTree) (δrevSet setTid) {
// TODO optimize to go through vδT and vδTnew sequentially if needed
δrevSet = setTid{}
for _, δT := range vδTnew {
newRevEntry := vδTMerge1Inplace(pvδT, δT)
if newRevEntry {
δrevSet.Add(δT.Rev)
}
}
return δrevSet
}
// vδTMerge1Inplace merges one δT entry into vδT. // vδTMerge1Inplace merges one δT entry into vδT.
//
// newRevEntry indicates whether δT.Rev was not there before in vδT.
// vδT is modified inplace. // vδT is modified inplace.
// XXX test for vδTMerge //
func vδTMerge1Inplace(pvδT *[]ΔTree, δT ΔTree) { // XXX test
func vδTMerge1Inplace(pvδT *[]ΔTree, δT ΔTree) (newRevEntry bool) {
vδT := *pvδT vδT := *pvδT
l := len(vδT) l := len(vδT)
...@@ -677,7 +708,7 @@ func vδTMerge1Inplace(pvδT *[]ΔTree, δT ΔTree) { ...@@ -677,7 +708,7 @@ func vδTMerge1Inplace(pvδT *[]ΔTree, δT ΔTree) {
return δT.Rev <= vδT[k].Rev return δT.Rev <= vδT[k].Rev
}) })
if j == l || vδT[j].Rev != δT.Rev { if j == l || vδT[j].Rev != δT.Rev {
// newRevEntry = true newRevEntry = true
δTcurr := ΔTree{Rev: δT.Rev, KV: map[Key]ΔValue{}} δTcurr := ΔTree{Rev: δT.Rev, KV: map[Key]ΔValue{}}
// insert(@j, δTcurr) // insert(@j, δTcurr)
vδT = append(vδT[:j], vδT = append(vδT[:j],
...@@ -698,9 +729,11 @@ func vδTMerge1Inplace(pvδT *[]ΔTree, δT ΔTree) { ...@@ -698,9 +729,11 @@ func vδTMerge1Inplace(pvδT *[]ΔTree, δT ΔTree) {
} }
*pvδT = vδT *pvδT = vδT
return newRevEntry
} }
/*
// rebuild rebuilds _ΔTtail taking trackNew requests into account. // rebuild rebuilds _ΔTtail taking trackNew requests into account.
// //
// It returns: // It returns:
...@@ -783,7 +816,9 @@ func (δTtail *_ΔTtail) rebuild(root zodb.Oid, δZtail *zodb.ΔTail, db *zodb.D ...@@ -783,7 +816,9 @@ func (δTtail *_ΔTtail) rebuild(root zodb.Oid, δZtail *zodb.ΔTail, db *zodb.D
return trackNew, δrevSet, nil return trackNew, δrevSet, nil
} }
*/
/*
// rebuild1 rebuilds δT for single δZ. // rebuild1 rebuilds δT for single δZ.
// //
// δtrackNew/δtkeycov represents how trackNew changes when going through `atPrev <- δZ.Rev` . // δtrackNew/δtkeycov represents how trackNew changes when going through `atPrev <- δZ.Rev` .
...@@ -877,6 +912,7 @@ func (δTtail *_ΔTtail) rebuild1(atPrev zodb.Tid, δZ zodb.ΔRevEntry, trackNew ...@@ -877,6 +912,7 @@ func (δTtail *_ΔTtail) rebuild1(atPrev zodb.Tid, δZ zodb.ΔRevEntry, trackNew
return δtrack, δtkeycov, newRevEntry, nil return δtrack, δtkeycov, newRevEntry, nil
} }
*/
// widenTrackNew widens trackNew to cover δtkeycov. // widenTrackNew widens trackNew to cover δtkeycov.
func widenTrackNew(trackNew blib.PPTreeSubSet, δtkeycov *blib.RangedKeySet, root zodb.Oid, at zodb.Tid, db *zodb.DB) (err error) { func widenTrackNew(trackNew blib.PPTreeSubSet, δtkeycov *blib.RangedKeySet, root zodb.Oid, at zodb.Tid, db *zodb.DB) (err error) {
...@@ -940,17 +976,22 @@ func (δBtail *ΔBtail) Update(δZ *zodb.EventCommit) (_ ΔB, err error) { ...@@ -940,17 +976,22 @@ func (δBtail *ΔBtail) Update(δZ *zodb.EventCommit) (_ ΔB, err error) {
if err != nil { if err != nil {
return ΔB{}, err return ΔB{}, err
} }
// XXX vvv kill?
if !δTtail.trackNew.Empty() { if !δTtail.trackNew.Empty() {
panicf("BUG: ΔBtail.Update: ΔTtail<%s>.trackNew != ø after _Update1", root) panicf("BUG: ΔBtail.Update: ΔTtail<%s>.trackNew != ø after _Update1", root)
} }
δTtail.trackNew = trackNew // δTtail.trackNew = trackNew
// NOTE we cannot skip computing diff for HEAD~..HEAD // NOTE we cannot skip computing diff for HEAD~..HEAD
// even after _Update1 because _Update1 was working with different trackNew. // even after _Update1 because _Update1 was working with different trackNew.
δtrackSet, δrevSet, err := δTtail.rebuild(root, δBtail.δZtail, δBtail.db) // δtrackSet, δrevSet, err := δTtail.rebuild(root, δBtail.δZtail, δBtail.db)
vδTnew, δtrackSet, err := vδTBuild(root, trackNew, δBtail.δZtail, δBtail.db)
if err != nil { if err != nil {
return ΔB{}, err return ΔB{}, err
} }
// XXX comment about RCU snapshot
δTtail.vδT = vδTClone(δTtail.vδT)
δrevSet := vδTMergeInplace(&δTtail.vδT, vδTnew)
δBtail.trackSet.UnionInplace(δtrackSet) δBtail.trackSet.UnionInplace(δtrackSet)
δBtail.vδBroots_Update(root, δrevSet) δBtail.vδBroots_Update(root, δrevSet)
} }
......
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