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

.

parent 748b40e8
......@@ -63,6 +63,9 @@ func NewPathSet() *PathSet {
//
// XXX catch cycles on add?
func (m *PathSet) Add(master interface{}, path []zodb.IPersistent) {
fmt.Printf("\n\nPathSet.Add %v %s\n", master, path)
panic("aaa")
l := len(path)
if l == 0 {
panic("empty path")
......
......@@ -670,7 +670,7 @@ func (root *Root) zδhandle1(zevent zodb.CommitEvent) {
// find out which files need to be invalidated due to index change
// XXX no indexMu lock needed because head is Locked
// XXX stub -> TODO full δbtree
// XXX stub -> TODO full δbtree | update indexLooked itself
fmt.Printf("\nbtreeChangev: %v\n", btreeChangev)
xfiles := bfdir.indexLooked.Invalidates(btreeChangev)
fmt.Printf("xfiles: %v\n", xfiles)
......@@ -737,12 +737,13 @@ func (root *Root) zδhandle1(zevent zodb.CommitEvent) {
panic(err) // XXX
}
zbfSize, err := file.zbf.Size(ctx)
zbfSize, treePath, err := file.zbf.Size(ctx)
if err != nil {
panic(err) // XXX
}
file.zbfSize = zbfSize
bfdir.indexLooked.Add(file, treePath)
}
// notify .wcfs/zhead
......@@ -1041,13 +1042,13 @@ func (head *Head) bigopen(ctx context.Context, oid zodb.Oid) (_ *BigFile, err er
}
}()
zbfSize, err := zbf.Size(ctx)
zbfSize, treePath, err := zbf.Size(ctx)
if err != nil {
return nil, err
}
// zconn.Incref()
return &BigFile{
f := &BigFile{
Node: newDefaultNode(),
head: head,
zbf: zbf,
......@@ -1056,7 +1057,13 @@ func (head *Head) bigopen(ctx context.Context, oid zodb.Oid) (_ *BigFile, err er
// XXX this is needed only for head/
δFtail: NewΔTailI64(zconn.At()),
loading: make(map[int64]*blkLoadState),
}, nil
}
head.bfdir.indexMu.Lock() // XXX locking ok?
head.bfdir.indexLooked.Add(f, treePath)
head.bfdir.indexMu.Unlock()
return f, nil
}
// Close release all resources of BigFile.
......
......@@ -458,7 +458,7 @@ func (bf *ZBigFile) LoadBlk(ctx context.Context, blk int64) (_ []byte, treePath
defer bf.PDeactivate()
pathRevMax = 0
xzblk, ok, err := bf.blktab.GetTo(ctx, blk, func(node zodb.IPersistent) {
xzblk, ok, err := bf.blktab.VGet(ctx, blk, func(node zodb.IPersistent) {
treePath = append(treePath, node)
pathRevMax = tidmax(pathRevMax, node.PSerial())
})
......@@ -499,29 +499,33 @@ func (bf *ZBigFile) LoadBlk(ctx context.Context, blk int64) (_ []byte, treePath
}
// Size returns whole file size.
func (bf *ZBigFile) Size(ctx context.Context) (_ int64, err error) {
//
// it also returns BTree path scaned to obtain size.
func (bf *ZBigFile) Size(ctx context.Context) (_ int64, treePath []zodb.IPersistent, err error) {
defer xerr.Contextf(&err, "bigfile %s: size", bf.POid())
err = bf.PActivate(ctx)
if err != nil {
return 0, err
return 0, nil, err
}
defer bf.PDeactivate()
tailblk, ok, err := bf.blktab.MaxKey(ctx)
tailblk, ok, err := bf.blktab.VMaxKey(ctx, func(node zodb.IPersistent) {
treePath = append(treePath, node)
})
if err != nil {
return 0, err
return 0, nil, err
}
if !ok {
return 0, nil
return 0, nil, nil
}
size := (tailblk + 1) * bf.blksize
if size / bf.blksize != tailblk + 1 {
return 0, syscall.EFBIG // overflow
return 0, nil, syscall.EFBIG // overflow
}
return size, nil
return size, treePath, 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