12483: Fix makeParentDirs bug when higher levels already exist.
authorTom Clegg <tclegg@veritasgenetics.com>
Wed, 15 Nov 2017 18:14:13 +0000 (13:14 -0500)
committerTom Clegg <tclegg@veritasgenetics.com>
Wed, 15 Nov 2017 18:14:13 +0000 (13:14 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/arvados/collection_fs.go
sdk/go/arvados/collection_fs_test.go

index 6019cfb5330b844bf8c66ac3f6760f73a75f718d..328d68f8975fc51e3253c5c0ac5f892e949b912d 100644 (file)
@@ -794,7 +794,10 @@ func (dn *dirnode) loadManifest(txt string) error {
                                return fmt.Errorf("line %d: bad file segment %q", lineno, token)
                        }
                        name := path.Clean(dirname + "/" + manifestUnescape(toks[2]))
-                       dn.makeParentDirs(name)
+                       err = dn.makeParentDirs(name)
+                       if err != nil {
+                               return fmt.Errorf("line %d: cannot use path %q: %s", lineno, name, err)
+                       }
                        f, err := dn.OpenFile(name, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0700)
                        if err != nil {
                                return fmt.Errorf("line %d: cannot append to %q: %s", lineno, name, err)
@@ -852,7 +855,7 @@ func (dn *dirnode) loadManifest(txt string) error {
 func (dn *dirnode) makeParentDirs(name string) (err error) {
        names := strings.Split(name, "/")
        for _, name := range names[:len(names)-1] {
-               f, err := dn.mkdir(name)
+               f, err := dn.OpenFile(name, os.O_CREATE, os.ModeDir|0755)
                if err != nil {
                        return err
                }
@@ -872,8 +875,8 @@ func (dn *dirnode) mkdir(name string) (*file, error) {
 
 func (dn *dirnode) Mkdir(name string, perm os.FileMode) error {
        f, err := dn.mkdir(name)
-       if err != nil {
-               f.Close()
+       if err == nil {
+               err = f.Close()
        }
        return err
 }
index 6dc7286081cd3d8503a7af7f13c26f0d27104e5f..ecb1f8928003e3d6bc891f6bbea50e97e0891c09 100644 (file)
@@ -578,19 +578,20 @@ func (s *CollectionFSSuite) TestPersistEmptyFiles(c *check.C) {
        var err error
        s.fs, err = (&Collection{}).FileSystem(s.client, s.kc)
        c.Assert(err, check.IsNil)
-       for _, name := range []string{"dir", "zero", "zero/zero"} {
+       for _, name := range []string{"dir", "dir/zerodir", "zero", "zero/zero"} {
                err = s.fs.Mkdir(name, 0755)
                c.Assert(err, check.IsNil)
        }
 
        expect := map[string][]byte{
-               "0":              nil,
-               "00":             []byte{},
-               "one":            []byte{1},
-               "dir/0":          nil,
-               "dir/two":        []byte{1, 2},
-               "dir/zero":       nil,
-               "zero/zero/zero": nil,
+               "0":                nil,
+               "00":               []byte{},
+               "one":              []byte{1},
+               "dir/0":            nil,
+               "dir/two":          []byte{1, 2},
+               "dir/zero":         nil,
+               "dir/zerodir/zero": nil,
+               "zero/zero/zero":   nil,
        }
        for name, data := range expect {
                f, err := s.fs.OpenFile(name, os.O_WRONLY|os.O_CREATE, 0)