13111: Propagate errors in Readdir().
authorTom Clegg <tclegg@veritasgenetics.com>
Thu, 8 Feb 2018 21:29:40 +0000 (16:29 -0500)
committerTom Clegg <tclegg@veritasgenetics.com>
Thu, 8 Feb 2018 21:29:40 +0000 (16:29 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/arvados/fs_base.go
sdk/go/arvados/fs_deferred.go
sdk/go/arvados/fs_filehandle.go
sdk/go/arvados/fs_project.go

index 6402a8ec3fa49c189636d6198d4fa1eb2f5e4ed8..4d22c1e82c6cc807d34c9e4c98bb8a7b68f731c2 100644 (file)
@@ -96,7 +96,7 @@ type inode interface {
        Write([]byte, filenodePtr) (int, filenodePtr, error)
        Truncate(int64) error
        IsDir() bool
-       Readdir() []os.FileInfo
+       Readdir() ([]os.FileInfo, error)
        Size() int64
        FileInfo() os.FileInfo
 
@@ -198,8 +198,8 @@ func (*nullnode) IsDir() bool {
        return false
 }
 
-func (*nullnode) Readdir() []os.FileInfo {
-       return nil
+func (*nullnode) Readdir() ([]os.FileInfo, error) {
+       return nil, ErrInvalidOperation
 }
 
 func (*nullnode) Child(name string, replace func(inode) inode) inode {
@@ -263,7 +263,7 @@ func (n *treenode) FileInfo() os.FileInfo {
        return n.fileinfo
 }
 
-func (n *treenode) Readdir() (fi []os.FileInfo) {
+func (n *treenode) Readdir() (fi []os.FileInfo, err error) {
        n.RLock()
        defer n.RUnlock()
        fi = make([]os.FileInfo, 0, len(n.inodes))
index e63883819ea64cda9428bf8e2896433c46f94e5e..97fe68b28c77942ff1570f58fb9b035ebf942231 100644 (file)
@@ -89,15 +89,15 @@ func (dn *deferrednode) Child(name string, replace func(inode) inode) inode {
        return dn.realinode().Child(name, replace)
 }
 
-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() }
-func (dn *deferrednode) Readdir() []os.FileInfo         { return dn.realinode().Readdir() }
-func (dn *deferrednode) Size() int64                    { return dn.currentinode().Size() }
-func (dn *deferrednode) FileInfo() os.FileInfo          { return dn.currentinode().FileInfo() }
-func (dn *deferrednode) Lock()                          { dn.realinode().Lock() }
-func (dn *deferrednode) Unlock()                        { dn.realinode().Unlock() }
-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) 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() }
+func (dn *deferrednode) Readdir() ([]os.FileInfo, error) { return dn.realinode().Readdir() }
+func (dn *deferrednode) Size() int64                     { return dn.currentinode().Size() }
+func (dn *deferrednode) FileInfo() os.FileInfo           { return dn.currentinode().FileInfo() }
+func (dn *deferrednode) Lock()                           { dn.realinode().Lock() }
+func (dn *deferrednode) Unlock()                         { dn.realinode().Unlock() }
+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() }
index d5865317fb77c28bdba096bac3640e881ad74aba..127bee8ddf7c6e641597d92c935353eece84564b 100644 (file)
@@ -74,10 +74,14 @@ func (f *filehandle) Readdir(count int) ([]os.FileInfo, error) {
                return nil, ErrInvalidOperation
        }
        if count <= 0 {
-               return f.inode.Readdir(), nil
+               return f.inode.Readdir()
        }
        if f.unreaddirs == nil {
-               f.unreaddirs = f.inode.Readdir()
+               var err error
+               f.unreaddirs, err = f.inode.Readdir()
+               if err != nil {
+                       return nil, err
+               }
        }
        if len(f.unreaddirs) == 0 {
                return nil, io.EOF
index 4dd869910cda702cc3271c042ac112c68bb93332..f9cb7997023a28d97fbc3b94035f113a4bc3edd2 100644 (file)
@@ -79,8 +79,11 @@ func (pn *projectnode) setup() {
        }
 }
 
-func (pn *projectnode) Readdir() []os.FileInfo {
+func (pn *projectnode) Readdir() ([]os.FileInfo, error) {
        pn.setupOnce.Do(pn.setup)
+       if pn.err != nil {
+               return nil, pn.err
+       }
        return pn.inode.Readdir()
 }