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

.

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