12483: Persist empty files.
authorTom Clegg <tclegg@veritasgenetics.com>
Wed, 15 Nov 2017 18:01:29 +0000 (13:01 -0500)
committerTom Clegg <tclegg@veritasgenetics.com>
Wed, 15 Nov 2017 18:01:29 +0000 (13:01 -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 79626500c10acb8c392f8432ebc2add3abff4c7a..6019cfb5330b844bf8c66ac3f6760f73a75f718d 100644 (file)
@@ -699,6 +699,10 @@ func (dn *dirnode) marshalManifest(prefix string) (string, error) {
                        }
                        subdirs = subdirs + subdir
                case *filenode:
+                       if len(node.extents) == 0 {
+                               segments = append(segments, m1segment{name: name})
+                               break
+                       }
                        for _, e := range node.extents {
                                switch e := e.(type) {
                                case storedExtent:
index 4be1a3d221069bf076d4728f76154924c3499f88..6dc7286081cd3d8503a7af7f13c26f0d27104e5f 100644 (file)
@@ -574,6 +574,57 @@ func (s *CollectionFSSuite) TestPersist(c *check.C) {
        }
 }
 
+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"} {
+               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,
+       }
+       for name, data := range expect {
+               f, err := s.fs.OpenFile(name, os.O_WRONLY|os.O_CREATE, 0)
+               c.Assert(err, check.IsNil)
+               if data != nil {
+                       _, err := f.Write(data)
+                       c.Assert(err, check.IsNil)
+               }
+               f.Close()
+       }
+
+       m, err := s.fs.MarshalManifest(".")
+       c.Check(err, check.IsNil)
+       c.Logf("%q", m)
+
+       persisted, err := (&Collection{ManifestText: m}).FileSystem(s.client, s.kc)
+       c.Assert(err, check.IsNil)
+
+       for name, data := range expect {
+               f, err := persisted.Open("bogus-" + name)
+               c.Check(err, check.NotNil)
+
+               f, err = persisted.Open(name)
+               c.Assert(err, check.IsNil)
+
+               if data == nil {
+                       data = []byte{}
+               }
+               buf, err := ioutil.ReadAll(f)
+               c.Check(err, check.IsNil)
+               c.Check(buf, check.DeepEquals, data)
+       }
+}
+
 func (s *CollectionFSSuite) TestFlushFullBlocks(c *check.C) {
        maxBlockSize = 1024
        defer func() { maxBlockSize = 2 << 26 }()