Commit 4f1846bc authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 899ca815
...@@ -213,7 +213,7 @@ type ΔTtail struct { ...@@ -213,7 +213,7 @@ type ΔTtail struct {
// XXX -> ΔT ? // XXX -> ΔT ?
type ΔTree struct { type ΔTree struct {
Rev zodb.Tid Rev zodb.Tid
KV map[Key]Value // XXX Value -> ΔValue ? ΔKV map[Key]ΔValue
} }
...@@ -1509,9 +1509,7 @@ func (δBtail *ΔBtail) ForgetPast(revCut zodb.Tid) { ...@@ -1509,9 +1509,7 @@ func (δBtail *ΔBtail) ForgetPast(revCut zodb.Tid) {
// //
// key must be tracked // key must be tracked
// at must ∈ (tail, head] // at must ∈ (tail, head]
// func (δBtail *ΔBtail) GetAt(ctx context.Context, root *Tree, key Key, at zodb.Tid) (value Value, ok bool, rev zodb.Tid, revExact bool, err error) {
// XXX naming -> GetAt ?
func (δBtail *ΔBtail) Get(ctx context.Context, root *Tree, key Key, at zodb.Tid) (value Value, ok bool, rev zodb.Tid, revExact bool, err error) {
defer xerr.Contextf(&err, "δBtail: root<%s>: get %d @%s", root.POid(), key, at) defer xerr.Contextf(&err, "δBtail: root<%s>: get %d @%s", root.POid(), key, at)
// XXX key not tracked -> panic // XXX key not tracked -> panic
// XXX at not ∈ (tail, head] -> panic // XXX at not ∈ (tail, head] -> panic
...@@ -1534,8 +1532,10 @@ func (δBtail *ΔBtail) Get(ctx context.Context, root *Tree, key Key, at zodb.Ti ...@@ -1534,8 +1532,10 @@ func (δBtail *ΔBtail) Get(ctx context.Context, root *Tree, key Key, at zodb.Ti
if at < δT.Rev { if at < δT.Rev {
continue continue
} }
value, ok = δT.KV[key] var δvalue ΔValue
δvalue, ok = δT.ΔKV[key]
if ok { if ok {
value = δvalue.New
rev = δT.Rev rev = δT.Rev
revExact = true revExact = true
break break
......
...@@ -648,7 +648,7 @@ func xverifyΔBTail_Update(t *testing.T, subj string, db *zodb.DB, treeRoot zodb ...@@ -648,7 +648,7 @@ func xverifyΔBTail_Update(t *testing.T, subj string, db *zodb.DB, treeRoot zodb
} }
t.Run(fmt.Sprintf(" track=%s", keys), func(t *testing.T) { t.Run(fmt.Sprintf(" track=%s", keys), func(t *testing.T) {
xverifyΔBTail_Update1(t, subj, db, treeRoot, t1.at,t2.at, t1.xkv,t2.xkv, t2.δZ, t2.δkv, keys, kadj12) xverifyΔBTail_Update1(t, subj, db, treeRoot, t1.at,t2.at, t1.xkv,t2.xkv, t2.δZ, t2.δxkv, keys, kadj12)
}) })
} }
}) })
...@@ -867,6 +867,8 @@ func (δbtail *ΔBtail) assertTrack(t *testing.T, subj string, trackIdxOK, track ...@@ -867,6 +867,8 @@ func (δbtail *ΔBtail) assertTrack(t *testing.T, subj string, trackIdxOK, track
// t0->t1 exercises from-scratch rebuild, // t0->t1 exercises from-scratch rebuild,
// t1->t2 further exercises incremental rebuild. // t1->t2 further exercises incremental rebuild.
func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1, t2 *tTreeCommit) { func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1, t2 *tTreeCommit) {
// t1 := t2.prev
// t0 := t1.prev
t.Run(fmt.Sprintf("rebuild/%s→%s", t0.tree, t1.tree), func(t *testing.T) { t.Run(fmt.Sprintf("rebuild/%s→%s", t0.tree, t1.tree), func(t *testing.T) {
tAllKeys := allTestKeys(t0, t1, t2) tAllKeys := allTestKeys(t0, t1, t2)
tAllKeyv := tAllKeys.SortedElements() tAllKeyv := tAllKeys.SortedElements()
...@@ -883,7 +885,9 @@ func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1 ...@@ -883,7 +885,9 @@ func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1
fmt.Printf("@%s: %v\n", xat[t2.at], t2.xkv.Flatten()) fmt.Printf("@%s: %v\n", xat[t2.at], t2.xkv.Flatten())
kadj01 := KAdj(t0,t1, allTestKeys(t0,t1,t2)) kadj01 := KAdj(t0,t1, allTestKeys(t0,t1,t2))
kadj11 := KAdj(t1,t1, allTestKeys(t0,t1,t2))
kadj12 := KAdj(t1,t2, allTestKeys(t0,t1,t2)) kadj12 := KAdj(t1,t2, allTestKeys(t0,t1,t2))
kadj22 := KAdj(t2,t2, allTestKeys(t0,t1,t2))
_ = kadj01 _ = kadj01
ø := trackIndex{} ø := trackIndex{}
...@@ -896,6 +900,16 @@ func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1 ...@@ -896,6 +900,16 @@ func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1
keys1.Add(tAllKeyv[idx1]) keys1.Add(tAllKeyv[idx1])
} }
// δkv1_1 = t1.δxkv / kadj11(keys1)
keys1_1 := kadj11.Map(keys1)
δkv1_1 := map[Key]Δstring{}
for k := range keys1_1 {
δv, ok := t1.δxkv[k]
if ok {
δkv1_1[k] = δv
}
}
t.Run(fmt.Sprintf(" T%s;R", keys1), func(t *testing.T) { t.Run(fmt.Sprintf(" T%s;R", keys1), func(t *testing.T) {
δbtail := NewΔBtail(t0.at, db) δbtail := NewΔBtail(t0.at, db)
...@@ -911,7 +925,7 @@ func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1 ...@@ -911,7 +925,7 @@ func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1
// after rebuild // after rebuild
/*trackIdx=*/ t1.xkv.trackIdx(keys1), /*trackIdx=*/ t1.xkv.trackIdx(keys1),
/*vδB=*/ /*XXX temp*/nil /*[δ1/Tadj(keys1)*/) /*vδT=*/ δkv1_1)
t.Run((" →" + t2.tree), func(t *testing.T) { t.Run((" →" + t2.tree), func(t *testing.T) {
// tracked keys1 becomes tracked keys1_2 after Update(t1->t2) // tracked keys1 becomes tracked keys1_2 after Update(t1->t2)
...@@ -927,6 +941,23 @@ func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1 ...@@ -927,6 +941,23 @@ func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1
keys2.Add(tRestKeyv2[idx2]) keys2.Add(tRestKeyv2[idx2])
} }
// δkv1_2 = t1.δxkv / (kadj12(keys1) | kadj22(keys2))
// δkv2_2 = t2.δxkv / (kadj12(keys1) | kadj22(keys2))
keys2_2 := kadj22.Map(keys2)
keys12_2 := keys1_2.Union(keys2_2)
δkv1_2 := map[Key]Δstring{}
δkv2_2 := map[Key]Δstring{}
for k := range keys12_2 {
δv1, ok := t1.δxkv[k]
if ok {
δkv1_2[k] = δv1
}
δv2, ok := t2.δxkv[k]
if ok {
δkv2_2[k] = δv2
}
}
// t.Run is expensive at this level of nest // t.Run is expensive at this level of nest
// t.Run(" T"+keys2.String()+";R", func(t *testing.T) { // t.Run(" T"+keys2.String()+";R", func(t *testing.T) {
δbtail_ := δbtail.clone() δbtail_ := δbtail.clone()
...@@ -939,7 +970,7 @@ func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1 ...@@ -939,7 +970,7 @@ func xverifyΔBTail_rebuild(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, t0, t1
// after rebuild // after rebuild
/* trackIdx=*/ t2.xkv.trackIdx(keys1_2.Union(keys2)), /* trackIdx=*/ t2.xkv.trackIdx(keys1_2.Union(keys2)),
/*vδB=*/ /*XXX temp*/nil /*[δ1/keys1+keys2, δ2/keys1+keys2]*/) /*vδT=*/ δkv1_2, δkv2_2)
// }) // })
} }
}) })
...@@ -962,7 +993,7 @@ func xverifyΔBTail_rebuild_U(t *testing.T, δbtail *ΔBtail, ti, tj *tTreeCommi ...@@ -962,7 +993,7 @@ func xverifyΔBTail_rebuild_U(t *testing.T, δbtail *ΔBtail, ti, tj *tTreeCommi
} }
// xverifyΔBTail_rebuild_TR verifies ΔBTree state after Track(keys) + rebuild. // xverifyΔBTail_rebuild_TR verifies ΔBTree state after Track(keys) + rebuild.
func xverifyΔBTail_rebuild_TR(t *testing.T, db *zodb.DB, δbtail *ΔBtail, tj *tTreeCommit, treeRoot zodb.Oid, xat map[zodb.Tid]string, keys SetKey, trackIdx trackIndex, trackNew, trackIdxAfterRebuild trackIndex,Bok []ΔB) { func xverifyΔBTail_rebuild_TR(t *testing.T, db *zodb.DB, δbtail *ΔBtail, tj *tTreeCommit, treeRoot zodb.Oid, xat map[zodb.Tid]string, keys SetKey, trackIdx trackIndex, trackNew, trackIdxAfterRebuild trackIndex,Tok ...map[Key]Δstring) {
t.Helper() t.Helper()
X := exc.Raiseif X := exc.Raiseif
ø := trackIndex{} ø := trackIndex{}
...@@ -988,13 +1019,40 @@ func xverifyΔBTail_rebuild_TR(t *testing.T, db *zodb.DB, δbtail *ΔBtail, tj * ...@@ -988,13 +1019,40 @@ func xverifyΔBTail_rebuild_TR(t *testing.T, db *zodb.DB, δbtail *ΔBtail, tj *
// XXX verify Get // XXX verify Get
// XXX verify SliceByRootRev // verify SliceByRootRev
l := len(vδTok)
vatOK := make([]zodb.Tid, l)
t0 := tj
for i := 0; i<l; i++ {
vatOK[l-i-1] = t0.at
t0 = t0.prev
}
lo := t0.prev.at
hi := vatOK[l-1]
vδToid := δbtail.SliceByRootRev(treeRoot, lo, hi)
l = len(vδToid)
vat := make([]zodb.Tid, l)
vδT := []map[Key]Δstring{}
atPrev := lo
for i, δToid := range vδToid {
vat[i] = δToid.Rev
δT := XGetδKV(db, atPrev, δToid.Rev, δToid.ΔKV) // {} k -> δ(ZBlk(oid).data)
vδT = append(vδT, δT)
atPrev = δToid.Rev
}
if !(reflect.DeepEqual(vat, vatOK) && reflect.DeepEqual(vδT, vδTok)) {
t.Errorf("@%s: after rebuild: SliceByRootRev:\nvat:\n\thave: %v\n\twant: %v\n\n"+
"vδT:\n\thave: %v\n\twant: %v",
xat[tj.at], vat, vatOK, vδT, vδTok)
}
} }
// xverifyΔBTail_Get verifies δBtail.Get on series of vt ZODB changes. // xverifyΔBTail_GetAt verifies δBtail.Get on series of vt ZODB changes.
// XXX // XXX
// XXX kill // XXX kill
func ___xverifyΔBTail_Get(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt ...*tTreeCommit) { func ___xverifyΔBTail_GetAt(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt ...*tTreeCommit) {
subj := vt[0].tree subj := vt[0].tree
for _, t := range vt[1:] { for _, t := range vt[1:] {
subj += "→" + t.tree subj += "→" + t.tree
...@@ -1027,7 +1085,7 @@ func ___xverifyΔBTail_Get(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt ...* ...@@ -1027,7 +1085,7 @@ func ___xverifyΔBTail_Get(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt ...*
}) })
} }
func xverifyΔBTail_Get1(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt []*tTreeCommit, xat map[zodb.Tid]string, keys SetKey) { func xverifyΔBTail_GetAt1(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt []*tTreeCommit, xat map[zodb.Tid]string, keys SetKey) {
X := exc.Raiseif X := exc.Raiseif
// t1->t2-> ... -> tn // t1->t2-> ... -> tn
...@@ -1048,11 +1106,11 @@ func xverifyΔBTail_Get1(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt []*tTr ...@@ -1048,11 +1106,11 @@ func xverifyΔBTail_Get1(t *testing.T, db *zodb.DB, treeRoot zodb.Oid, vt []*tTr
err = δbtail.Track(k, ok, path); X(err) err = δbtail.Track(k, ok, path); X(err)
} }
// verify Get(k, @at) for all keys and @at // verify GetAt(k, @at) for all keys and @at
for i := 1; i < len(vt); i++ { for i := 1; i < len(vt); i++ {
at := vt[i].at at := vt[i].at
for _, k := range keys.SortedElements() { for _, k := range keys.SortedElements() {
vOid, ok, rev, revExact, err := δbtail.Get(ctx, ztree, k, at); X(err) vOid, ok, rev, revExact, err := δbtail.GetAt(ctx, ztree, k, at); X(err)
v := xzgetBlkDataAt(db, vOid, rev) v := xzgetBlkDataAt(db, vOid, rev)
v_, ok_ := vt[i].xkv.Get(k).kv[k] v_, ok_ := vt[i].xkv.Get(k).kv[k]
...@@ -1105,12 +1163,12 @@ func ΔBTest(xtest interface{}) ΔBTestEntry { ...@@ -1105,12 +1163,12 @@ func ΔBTest(xtest interface{}) ΔBTestEntry {
// ΔBCommit represent test commit changing a tree. // ΔBCommit represent test commit changing a tree.
type tTreeCommit struct { type tTreeCommit struct {
// XXX +parent *tTreeCommit?
tree string // the tree in toplogy-encoding tree string // the tree in toplogy-encoding
prev *tTreeCommit // previous commit
at zodb.Tid // commit revision at zodb.Tid // commit revision
δZ *zodb.EventCommit // raw ZODB changes; δZ.tid == at δZ *zodb.EventCommit // raw ZODB changes; δZ.tid == at
xkv RBucketSet // full tree state as of @at xkv RBucketSet // full tree state as of @at
δkv map[Key]Δstring // full tree-diff against parent δxkv map[Key]Δstring // full tree-diff against parent
} }
// tZODBCacheEverything is workaround for ZODB/go not implementing real // tZODBCacheEverything is workaround for ZODB/go not implementing real
...@@ -1185,14 +1243,16 @@ func testΔBTail(t *testing.T, testq chan ΔBTestEntry) { ...@@ -1185,14 +1243,16 @@ func testΔBTail(t *testing.T, testq chan ΔBTestEntry) {
var t0 *tTreeCommit var t0 *tTreeCommit
t1 := &tTreeCommit{ t1 := &tTreeCommit{
tree: "ø", // initial XXX ok? tree: "ø", // initial XXX ok?
prev: nil, // XXX ok?
at: tg.head, at: tg.head,
xkv: XGetTree(db, tg.head, tg.treeRoot), xkv: XGetTree(db, tg.head, tg.treeRoot),
δZ: nil, // XXX ok? δZ: nil, // XXX ok?
δkv: nil, // XXX ok? δxkv: nil, // XXX ok?
} }
for test := range testq { for test := range testq {
t2 := XCommitTree(test.tree) t2 := XCommitTree(test.tree)
t2.δkv = kvdiff(t1.xkv.Flatten(), t2.xkv.Flatten()) t2.δxkv = kvdiff(t1.xkv.Flatten(), t2.xkv.Flatten()) // XXX move to XCommitTree?
t2.prev = t1 // XXX ----//----
subj := fmt.Sprintf("%s -> %s", t1.tree, t2.tree) subj := fmt.Sprintf("%s -> %s", t1.tree, t2.tree)
tracef("\n\n\n**** %s ****\n\n", subj) tracef("\n\n\n**** %s ****\n\n", subj)
......
...@@ -479,7 +479,7 @@ func (δFtail *ΔFtail) LastBlkRev(ctx context.Context, f *BigFile, blk int64, a ...@@ -479,7 +479,7 @@ func (δFtail *ΔFtail) LastBlkRev(ctx context.Context, f *BigFile, blk int64, a
// XXX tabRev -> treeRev ? // XXX tabRev -> treeRev ?
// XXX activate zfile? // XXX activate zfile?
zblkOid, ok, tabRev, tabRevExact, err := δFtail.δBtail.Get(ctx, f.zfile.blktab, blk, at) zblkOid, ok, tabRev, tabRevExact, err := δFtail.δBtail.GetAt(ctx, f.zfile.blktab, blk, at)
if err != nil { if err != nil {
panic(err) // XXX panic(err) // XXX
} }
......
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