X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/86f966c2b2a14d9f30135cf2fc2b9cb08270d1b1..5dd128f5a57e704e3b3ea5225130ca85bd3bb84c:/sdk/go/arvados/fs_deferred.go diff --git a/sdk/go/arvados/fs_deferred.go b/sdk/go/arvados/fs_deferred.go index 4eb48b2f77..e85446098f 100644 --- a/sdk/go/arvados/fs_deferred.go +++ b/sdk/go/arvados/fs_deferred.go @@ -5,42 +5,10 @@ package arvados import ( - "log" "os" "sync" - "time" ) -func deferredCollectionFS(fs FileSystem, parent inode, coll Collection) inode { - modTime := coll.ModifiedAt - if modTime.IsZero() { - modTime = time.Now() - } - placeholder := &treenode{ - fs: fs, - parent: parent, - inodes: nil, - fileinfo: fileinfo{ - name: coll.Name, - modTime: modTime, - mode: 0755 | os.ModeDir, - }, - } - return &deferrednode{wrapped: placeholder, create: func() inode { - err := fs.RequestAndDecode(&coll, "GET", "arvados/v1/collections/"+coll.UUID, nil, nil) - if err != nil { - log.Printf("BUG: unhandled error: %s", err) - return placeholder - } - cfs, err := coll.FileSystem(fs, fs) - if err != nil { - log.Printf("BUG: unhandled error: %s", err) - return placeholder - } - return cfs.(*collectionFileSystem).asChildNode(parent, coll.Name) - }} -} - // A deferrednode wraps an inode that's expensive to build. Initially, // it responds to basic directory functions by proxying to the given // placeholder. If a caller uses a read/write/lock operation, @@ -85,15 +53,16 @@ func (dn *deferrednode) Child(name string, replace func(inode) (inode, error)) ( return dn.realinode().Child(name, replace) } -// Sync is currently unimplemented, except when it's a no-op because -// the real inode hasn't been created. +// 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 ErrInvalidArgument - } else { + if !dn.created { return nil + } else if syncer, ok := dn.wrapped.(syncer); ok { + return syncer.Sync() + } else { + return ErrInvalidOperation } } @@ -109,3 +78,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) }