Commit 96451811 authored by Kirill Smelkov's avatar Kirill Smelkov

.

parent 6fdd5467
......@@ -82,7 +82,7 @@
// where /bigfile/<bigfileX> represent bigfile data as of revision <revX>.
//
// Unless accessed {head,@<revX>}/bigfile/<bigfileX> are not automatically visible in
// wcfs filesystem. Similarly @<revX>/ should be explicitly created by client via mkdir. XXX -> just @<revX> access.
// wcfs filesystem. Similarly @<revX>/ become visible only after accessed.
//
//
// Invalidation protocol
......@@ -1002,19 +1002,19 @@ func (bfdir *BigFileDir) lookup(out *fuse.Attr, name string, fctx *fuse.Context)
// XXX do we need to support unlink? -> no, @<revX>/ are automatically garbage-collected.
// / -> Mkdir receives client request to create @<rev>/.
//
// it is not an error if @<rev>/ already exists - mkdir succeeds and EEXIST is not returned.
// in other words mkdir behaves here similarly to `mkdir -p`.
//
// XXX -> remove mkdir and just create @revX/ on lookup.
func (root *Root) Mkdir(name string, mode uint32, fctx *fuse.Context) (*nodefs.Inode, fuse.Status) {
inode, err := root.mkdir(name, fctx) // XXX ok to ignore mode?
// / -> Lookup receives client request to create @<rev>/.
func (root *Root) Lookup(out *fuse.Attr, name string, fctx *fuse.Context) (*nodefs.Inode, fuse.Status) {
revd, err := root.lookup(name, fctx)
var inode *nodefs.Inode
if revd != nil {
inode = revd.Inode()
_ = revd.GetAttr(out, nil, fctx) // always ok
}
return inode, err2LogStatus(err)
}
func (root *Root) mkdir(name string, fctx *fuse.Context) (_ *nodefs.Inode, err error) {
defer xerr.Contextf(&err, "/: mkdir %q", name)
func (root *Root) lookup(name string, fctx *fuse.Context) (_ *Head, err error) {
defer xerr.Contextf(&err, "/: lookup %q", name) // XXX name -> path?
var rev zodb.Tid
ok := false
......@@ -1029,11 +1029,11 @@ func (root *Root) mkdir(name string, fctx *fuse.Context) (_ *nodefs.Inode, err e
// check to see if dir(rev) is already there
root.revMu.Lock()
_, already := root.revTab[rev]
revDir, already := root.revTab[rev]
root.revMu.Unlock()
if already {
return nil, syscall.EEXIST
return revDir, nil
}
// not there - without revMu lock proceed to open @rev view of ZODB
......@@ -1044,19 +1044,20 @@ func (root *Root) mkdir(name string, fctx *fuse.Context) (_ *nodefs.Inode, err e
return nil, err
}
// relock root and either mkdir or EEXIST if the directory was maybe
// simultaneously created while we were not holding revMu.
// relock root and either register new revX/ directory or, if the
// directory was maybe simultaneously created while we were not holding
// revMu, return that.
root.revMu.Lock()
_, already = root.revTab[rev]
revDir, already = root.revTab[rev]
if already {
root.revMu.Unlock()
// zconnRev.Release()
transaction.Current(zconnRev.txnCtx).Abort()
return nil, syscall.EEXIST
return revDir, nil
}
// XXX -> newHead()
revDir := &Head{
revDir = &Head{
Node: newDefaultNode(),
rev: rev,
zconn: zconnRev,
......@@ -1078,7 +1079,7 @@ func (root *Root) mkdir(name string, fctx *fuse.Context) (_ *nodefs.Inode, err e
mkdir(revDir, "bigfile", bfdir)
// XXX + "at"
return revDir.Inode(), nil
return revDir, nil
}
......@@ -1159,6 +1160,21 @@ func (f *BigFile) Close() error {
return nil
}
// /(head|<rev>)/ -> Getattr serves stat.
func (head *Head) GetAttr(out *fuse.Attr, _ nodefs.File, _ *fuse.Context) fuse.Status {
at := head.rev
if at == 0 {
head.zconnMu.RLock()
at = head.zconn.At()
head.zconnMu.RUnlock()
}
t := at.Time().Time
out.Mode = fuse.S_IFDIR | 0555
out.SetTimes(/*atime=*/nil, /*mtime=*/&t, /*ctime=*/&t)
return fuse.OK
}
// /(head|<rev>)/bigfile/<bigfileX> -> Getattr serves stat.
func (f *BigFile) GetAttr(out *fuse.Attr, _ nodefs.File, _ *fuse.Context) fuse.Status {
f.head.zconnMu.RLock()
......
......@@ -264,7 +264,6 @@ def test_wcfs():
rev1 = wc.mountpoint + ("/@%s" % h(tcommit1))
fpath1 = rev1 + "/bigfile/" + h(f._p_oid)
os.mkdir(rev1)
st = os.stat(fpath1)
assert st.st_size == fsize1
#assert st.st_mtime == tidtime(tcommit1) FIXME proper sync
......
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