projects
/
arvados.git
/ blobdiff
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
13111: Merge branch 'master' into 12308-go-fuse
[arvados.git]
/
sdk
/
go
/
arvados
/
fs_collection.go
diff --git
a/sdk/go/arvados/fs_collection.go
b/sdk/go/arvados/fs_collection.go
index af0068f99392b0b3107e4bdb5f2d8044053fa020..fbd9775b0cde0876e68328fd63a019485eeac4a9 100644
(file)
--- a/
sdk/go/arvados/fs_collection.go
+++ b/
sdk/go/arvados/fs_collection.go
@@
-63,14
+63,27
@@
func (c *Collection) FileSystem(client apiClient, kc keepClient) (CollectionFile
inodes: make(map[string]inode),
},
}
inodes: make(map[string]inode),
},
}
- root.SetParent(root)
+ root.SetParent(root
, "."
)
if err := root.loadManifest(c.ManifestText); err != nil {
return nil, err
}
if err := root.loadManifest(c.ManifestText); err != nil {
return nil, err
}
+ backdateTree(root, modTime)
fs.root = root
return fs, nil
}
fs.root = root
return fs, nil
}
+func backdateTree(n inode, modTime time.Time) {
+ switch n := n.(type) {
+ case *filenode:
+ n.fileinfo.modTime = modTime
+ case *dirnode:
+ n.fileinfo.modTime = modTime
+ for _, n := range n.inodes {
+ backdateTree(n, modTime)
+ }
+ }
+}
+
func (fs *collectionFileSystem) newNode(name string, perm os.FileMode, modTime time.Time) (node inode, err error) {
if name == "" || name == "." || name == ".." {
return nil, ErrInvalidArgument
func (fs *collectionFileSystem) newNode(name string, perm os.FileMode, modTime time.Time) (node inode, err error) {
if name == "" || name == "." || name == ".." {
return nil, ErrInvalidArgument
@@
-219,10
+232,11
@@
func (fn *filenode) appendSegment(e segment) {
fn.fileinfo.size += int64(e.Len())
}
fn.fileinfo.size += int64(e.Len())
}
-func (fn *filenode) SetParent(p inode) {
- fn.
R
Lock()
- defer fn.
R
Unlock()
+func (fn *filenode) SetParent(p inode
, name string
) {
+ fn.Lock()
+ defer fn.Unlock()
fn.parent = p
fn.parent = p
+ fn.fileinfo.name = name
}
func (fn *filenode) Parent() inode {
}
func (fn *filenode) Parent() inode {
@@
-480,7
+494,7
@@
func (fn *filenode) pruneMemSegments() {
if !ok || seg.Len() < maxBlockSize {
continue
}
if !ok || seg.Len() < maxBlockSize {
continue
}
- locator, _, err := fn.
parent.(fsBackend
).PutB(seg.buf)
+ locator, _, err := fn.
FS(
).PutB(seg.buf)
if err != nil {
// TODO: stall (or return errors from)
// subsequent writes until flushing
if err != nil {
// TODO: stall (or return errors from)
// subsequent writes until flushing
@@
-489,7
+503,7
@@
func (fn *filenode) pruneMemSegments() {
}
fn.memsize -= int64(seg.Len())
fn.segments[idx] = storedSegment{
}
fn.memsize -= int64(seg.Len())
fn.segments[idx] = storedSegment{
- kc: fn.
parent.
FS(),
+ kc: fn.FS(),
locator: locator,
size: seg.Len(),
offset: 0,
locator: locator,
size: seg.Len(),
offset: 0,
@@
-518,11
+532,11
@@
func (dn *dirnode) Child(name string, replace func(inode) inode) inode {
}
data, err := json.Marshal(&coll)
if err == nil {
}
data, err := json.Marshal(&coll)
if err == nil {
- data = append(data,
10
)
+ data = append(data,
'\n'
)
}
return data, err
}}
}
return data, err
}}
- gn.SetParent(dn)
+ gn.SetParent(dn
, name
)
return gn
}
return dn.treenode.Child(name, replace)
return gn
}
return dn.treenode.Child(name, replace)
@@
-825,8
+839,9
@@
func (dn *dirnode) createFileAndParents(path string) (fn *filenode, err error) {
}
node.Child(name, func(child inode) inode {
if child == nil {
}
node.Child(name, func(child inode) inode {
if child == nil {
- node, err = node.FS().newNode(name, 0755|os.ModeDir, node.Parent().FileInfo().ModTime())
- child = node
+ child, err = node.FS().newNode(name, 0755|os.ModeDir, node.Parent().FileInfo().ModTime())
+ child.SetParent(node, name)
+ node = child
} else if !child.IsDir() {
err = ErrFileExists
} else {
} else if !child.IsDir() {
err = ErrFileExists
} else {
@@
-842,6
+857,7
@@
func (dn *dirnode) createFileAndParents(path string) (fn *filenode, err error) {
switch child := child.(type) {
case nil:
child, err = node.FS().newNode(basename, 0755, node.FileInfo().ModTime())
switch child := child.(type) {
case nil:
child, err = node.FS().newNode(basename, 0755, node.FileInfo().ModTime())
+ child.SetParent(node, basename)
fn = child.(*filenode)
return child
case *filenode:
fn = child.(*filenode)
return child
case *filenode: