X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/504e0eb8c75d79e5664897709935512f2c59ff95..47eb67e4c084abde49d5463d4ced8b4436a59dfd:/sdk/go/arvados/fs_collection.go diff --git a/sdk/go/arvados/fs_collection.go b/sdk/go/arvados/fs_collection.go index af0068f993..fbd9775b0c 100644 --- 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), }, } - root.SetParent(root) + root.SetParent(root, ".") if err := root.loadManifest(c.ManifestText); err != nil { return nil, err } + backdateTree(root, modTime) 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 @@ -219,10 +232,11 @@ func (fn *filenode) appendSegment(e segment) { fn.fileinfo.size += int64(e.Len()) } -func (fn *filenode) SetParent(p inode) { - fn.RLock() - defer fn.RUnlock() +func (fn *filenode) SetParent(p inode, name string) { + fn.Lock() + defer fn.Unlock() fn.parent = p + fn.fileinfo.name = name } func (fn *filenode) Parent() inode { @@ -480,7 +494,7 @@ func (fn *filenode) pruneMemSegments() { 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 @@ -489,7 +503,7 @@ func (fn *filenode) pruneMemSegments() { } fn.memsize -= int64(seg.Len()) fn.segments[idx] = storedSegment{ - kc: fn.parent.FS(), + kc: fn.FS(), 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 = append(data, 10) + data = append(data, '\n') } return data, err }} - gn.SetParent(dn) + gn.SetParent(dn, name) 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, 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 { @@ -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()) + child.SetParent(node, basename) fn = child.(*filenode) return child case *filenode: