X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d1ae12cad34862d063a1235bfe53459eef7ae589..c502c5a50aae825683ee4cff629c6839a4209501:/sdk/go/arvados/fs_deferred.go diff --git a/sdk/go/arvados/fs_deferred.go b/sdk/go/arvados/fs_deferred.go index 97fe68b28c..07cf760034 100644 --- a/sdk/go/arvados/fs_deferred.go +++ b/sdk/go/arvados/fs_deferred.go @@ -12,10 +12,8 @@ import ( ) func deferredCollectionFS(fs FileSystem, parent inode, coll Collection) inode { - var modTime time.Time - if coll.ModifiedAt != nil { - modTime = *coll.ModifiedAt - } else { + modTime := coll.ModifiedAt + if modTime.IsZero() { modTime = time.Now() } placeholder := &treenode{ @@ -26,6 +24,7 @@ func deferredCollectionFS(fs FileSystem, parent inode, coll Collection) inode { name: coll.Name, modTime: modTime, mode: 0755 | os.ModeDir, + sys: &coll, }, } return &deferrednode{wrapped: placeholder, create: func() inode { @@ -34,14 +33,14 @@ func deferredCollectionFS(fs FileSystem, parent inode, coll Collection) inode { log.Printf("BUG: unhandled error: %s", err) return placeholder } - cfs, err := coll.FileSystem(fs, fs) + newfs, err := coll.FileSystem(fs, fs) if err != nil { log.Printf("BUG: unhandled error: %s", err) return placeholder } - root := cfs.rootnode() - root.SetParent(parent, coll.Name) - return root + cfs := newfs.(*collectionFileSystem) + cfs.SetParent(parent, coll.Name) + return cfs }} } @@ -85,10 +84,23 @@ func (dn *deferrednode) Write(p []byte, pos filenodePtr) (int, filenodePtr, erro return dn.realinode().Write(p, pos) } -func (dn *deferrednode) Child(name string, replace func(inode) inode) inode { +func (dn *deferrednode) Child(name string, replace func(inode) (inode, error)) (inode, error) { return dn.realinode().Child(name, replace) } +// Sync is a no-op if the real inode hasn't even been created yet. +func (dn *deferrednode) Sync() error { + dn.mtx.Lock() + defer dn.mtx.Unlock() + if !dn.created { + return nil + } else if syncer, ok := dn.wrapped.(syncer); ok { + return syncer.Sync() + } else { + return ErrInvalidOperation + } +} + func (dn *deferrednode) Truncate(size int64) error { return dn.realinode().Truncate(size) } func (dn *deferrednode) SetParent(p inode, name string) { dn.realinode().SetParent(p, name) } func (dn *deferrednode) IsDir() bool { return dn.currentinode().IsDir() } @@ -101,3 +113,6 @@ func (dn *deferrednode) RLock() { dn.realinode().RLock( func (dn *deferrednode) RUnlock() { dn.realinode().RUnlock() } func (dn *deferrednode) FS() FileSystem { return dn.currentinode().FS() } func (dn *deferrednode) Parent() inode { return dn.currentinode().Parent() } +func (dn *deferrednode) MemorySize() int64 { return dn.currentinode().MemorySize() } +func (dn *deferrednode) Snapshot() (inode, error) { return dn.realinode().Snapshot() } +func (dn *deferrednode) Splice(repl inode) error { return dn.realinode().Splice(repl) }