Commit 9feea1a4 authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 3c40e38d
...@@ -56,8 +56,13 @@ type Commit struct { ...@@ -56,8 +56,13 @@ type Commit struct {
Δ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
Δxkv map[Key]Δstring // full tree-diff against parent Δxkv map[Key]Δstring // full tree-diff against parent
ZBlkDataTab map[zodb.Oid]string // full snapshot of all ZBlk data @at ZBlkTab map[zodb.Oid]ZBlkInfo // full snapshot of all ZBlk name/data @at
// δzblkData map[zodb.Oid]Δstring // full diff for zblkData against parent XXX ? }
// ZBlkInfo describes one ZBlk object.
type ZBlkInfo struct {
Name string // this ZBlk comes under root['treegen/values'][Name]
Data string
} }
// NewT creates new T. // NewT creates new T.
...@@ -97,7 +102,7 @@ func NewT(t *testing.T) *T { ...@@ -97,7 +102,7 @@ func NewT(t *testing.T) *T {
Prev: nil, Prev: nil,
At: head, At: head,
Xkv: xGetTree(tt.DB, head, tt.Root()), Xkv: xGetTree(tt.DB, head, tt.Root()),
ZBlkDataTab: xGetBlkDataTab(tt.DB, head), ZBlkTab: xGetBlkTab(tt.DB, head),
ΔZ: nil, ΔZ: nil,
Δxkv: nil, Δxkv: nil,
} }
...@@ -182,7 +187,7 @@ func (t *T) CommitTree(tree string) *Commit { ...@@ -182,7 +187,7 @@ func (t *T) CommitTree(tree string) *Commit {
At: δZ.Tid, At: δZ.Tid,
ΔZ: δZ, ΔZ: δZ,
Xkv: xkv, Xkv: xkv,
ZBlkDataTab: xGetBlkDataTab(t.DB, δZ.Tid), ZBlkTab: xGetBlkTab(t.DB, δZ.Tid),
} }
tprev := t.Head() tprev := t.Head()
...@@ -194,14 +199,14 @@ func (t *T) CommitTree(tree string) *Commit { ...@@ -194,14 +199,14 @@ func (t *T) CommitTree(tree string) *Commit {
return ttree return ttree
} }
// xGetBlkDataTab loads all ZBlk from db@at. // xGetBlkTab loads all ZBlk from db@at.
// //
// it returns {} oid -> blkdata. // it returns {} oid -> blkdata.
func xGetBlkDataTab(db *zodb.DB, at zodb.Tid) map[zodb.Oid]string { func xGetBlkTab(db *zodb.DB, at zodb.Tid) map[zodb.Oid]ZBlkInfo {
defer exc.Contextf("%s: @%s: get blkdatatab", db.Storage().URL(), at) defer exc.Contextf("%s: @%s: get blktab", db.Storage().URL(), at)
X := exc.Raiseif X := exc.Raiseif
blkDataTab := map[zodb.Oid]string{} blkTab := map[zodb.Oid]ZBlkInfo{}
txn, ctx := transaction.New(context.Background()) txn, ctx := transaction.New(context.Background())
defer txn.Abort() defer txn.Abort()
...@@ -228,18 +233,23 @@ func xGetBlkDataTab(db *zodb.DB, at zodb.Tid) map[zodb.Oid]string { ...@@ -228,18 +233,23 @@ func xGetBlkDataTab(db *zodb.DB, at zodb.Tid) map[zodb.Oid]string {
err = zblkdir.PActivate(ctx); X(err) err = zblkdir.PActivate(ctx); X(err)
defer zblkdir.PDeactivate() defer zblkdir.PDeactivate()
for k, xzblk := range zblkdir.Data { for xname, xzblk := range zblkdir.Data {
name, ok := xname.(string)
if !ok {
exc.Raisef("root['treegen/values']: key [%q]: expected str, got %T", xname, xname)
}
zblk, ok := xzblk.(zodb.IPersistent) zblk, ok := xzblk.(zodb.IPersistent)
if !ok { if !ok {
exc.Raisef("root['treegen/values'][%q]: expected IPersistent, got %s", k, xzodb.TypeOf(xzblk)) exc.Raisef("root['treegen/values'][%q]: expected IPersistent, got %s", name, xzodb.TypeOf(xzblk))
} }
oid := zblk.POid() oid := zblk.POid()
data := xzgetBlkData(ctx, zconn, oid) data := xzgetBlkData(ctx, zconn, oid)
blkDataTab[oid] = data blkTab[oid] = ZBlkInfo{name, data}
} }
return blkDataTab return blkTab
} }
// XGetBlkData loads blk data for ZBlk<oid> @t.at // XGetBlkData loads blk data for ZBlk<oid> @t.at
...@@ -249,11 +259,11 @@ func (t *Commit) XGetBlkData(oid zodb.Oid) string { ...@@ -249,11 +259,11 @@ func (t *Commit) XGetBlkData(oid zodb.Oid) string {
if oid == VDEL { if oid == VDEL {
return DEL return DEL
} }
data, ok := t.ZBlkDataTab[oid] zblki, ok := t.ZBlkTab[oid]
if !ok { if !ok {
exc.Raisef("getBlkData ZBlk<%s> @%s: no such ZBlk", oid, t.At) exc.Raisef("getBlkData ZBlk<%s> @%s: no such ZBlk", oid, t.At)
} }
return data return zblki.Data
} }
......
...@@ -82,6 +82,7 @@ func testΔFtail(t_ *testing.T, testq chan ΔFTestEntry) { ...@@ -82,6 +82,7 @@ func testΔFtail(t_ *testing.T, testq chan ΔFTestEntry) {
err = zroot.PActivate(ctx); X(err) err = zroot.PActivate(ctx); X(err)
defer zroot.PDeactivate() defer zroot.PDeactivate()
zfile := zroot.Data["treegen/file"].(*ZBigFile) zfile := zroot.Data["treegen/file"].(*ZBigFile)
zfileOid := zfile.POid()
err = zfile.PActivate(ctx); X(err) err = zfile.PActivate(ctx); X(err)
defer zfile.PDeactivate() defer zfile.PDeactivate()
if treeOid := zfile.blktab.POid(); treeOid != t.Root() { if treeOid := zfile.blktab.POid(); treeOid != t.Root() {
...@@ -103,9 +104,8 @@ func testΔFtail(t_ *testing.T, testq chan ΔFTestEntry) { ...@@ -103,9 +104,8 @@ func testΔFtail(t_ *testing.T, testq chan ΔFTestEntry) {
Zinblk := map[string]setI64{} // ZBlk<name> -> which #blk refer to it Zinblk := map[string]setI64{} // ZBlk<name> -> which #blk refer to it
// initialize dataTab from root['treegen/values'] // initialize dataTab from root['treegen/values']
for /*oid*/_, zblk := range t.Head().ZBlkDataTab { for /*oid*/_, zblki := range t.Head().ZBlkTab {
// treegen initializes values[x] = ZBlk(x) dataTab[zblki.Name] = zblki.Data
dataTab[zblk] = zblk
} }
...@@ -186,7 +186,7 @@ func testΔFtail(t_ *testing.T, testq chan ΔFTestEntry) { ...@@ -186,7 +186,7 @@ func testΔFtail(t_ *testing.T, testq chan ΔFTestEntry) {
} }
δfilesOK := setOid{} δfilesOK := setOid{}
if δfok != nil { if δfok != nil {
δfilesOK.Add(zfile.POid()) δfilesOK.Add(zfileOid)
} }
if !δfiles.Equal(δfilesOK) { if !δfiles.Equal(δfilesOK) {
t.Errorf("wrong δF.ByFile:\nhave keys: %s\nwant keys: %s", δfiles, δfilesOK) t.Errorf("wrong δF.ByFile:\nhave keys: %s\nwant keys: %s", δfiles, δfilesOK)
...@@ -198,9 +198,31 @@ func testΔFtail(t_ *testing.T, testq chan ΔFTestEntry) { ...@@ -198,9 +198,31 @@ func testΔFtail(t_ *testing.T, testq chan ΔFTestEntry) {
} }
// verify δf // verify δf
δf := δF.ByFile[zfile.POid()] δf := δF.ByFile[zfileOid]
if !reflect.DeepEqual(δf, δfok) { if !reflect.DeepEqual(δf, δfok) {
t.Errorf("wrong δf:\nhave: %v\nwant: %v", δf, δfok) t.Errorf("δf:\nhave: %v\nwant: %v", δf, δfok)
}
// verify δftail.trackSetZBlk
trackZinblk := map[string]setI64{}
for oid, zt := range δftail.trackSetZBlk {
zblki := commit.ZBlkTab[oid]
for foid, blocks := range zt.infile {
if foid != zfileOid {
t.Errorf(".trackSetZBlk: zblk %s points to unexpected file %s", zblki.Name, foid)
continue
}
inblk, ok := trackZinblk[zblki.Name]
if !ok {
inblk = setI64{}
trackZinblk[zblki.Name] = inblk
}
inblk.Update(blocks)
}
}
if !reflect.DeepEqual(trackZinblk, Zinblk) {
t.Errorf(".trackSetZBlk:\n~have: %v\n want: %v", trackZinblk, Zinblk)
} }
// XXX ForgePast configure threshold // XXX ForgePast configure threshold
......
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