13111: Merge branch 'master' into 13111-webdav-projects
authorTom Clegg <tclegg@veritasgenetics.com>
Thu, 5 Apr 2018 20:14:35 +0000 (16:14 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Thu, 5 Apr 2018 20:14:35 +0000 (16:14 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

1  2 
sdk/go/arvados/fs_collection_test.go
services/keep-web/webdav.go

index cb0f4b786581ce2674693d33a1444c3b28971c99,2604cefc4e55241a81f3d1a13f228f208c368609..d2f55d0e37d80502919f6385c2a0d457374a26c2
@@@ -213,6 -213,7 +213,7 @@@ func (s *CollectionFSSuite) TestCreateF
        c.Check(f.Close(), check.IsNil)
  
        m, err := s.fs.MarshalManifest(".")
+       c.Assert(err, check.IsNil)
        c.Check(m, check.Matches, `. 37b51d194a7513e45b56f6524f2d51f2\+3\+\S+ 0:3:new-file\\0401\n./dir1 .* 3:3:bar 0:3:foo\n`)
  }
  
@@@ -266,7 -267,9 +267,9 @@@ func (s *CollectionFSSuite) TestReadWri
        c.Check(err, check.IsNil)
        pos, err = f.Seek(0, io.SeekCurrent)
        c.Check(pos, check.Equals, int64(18))
+       c.Check(err, check.IsNil)
        pos, err = f.Seek(-18, io.SeekCurrent)
+       c.Check(pos, check.Equals, int64(0))
        c.Check(err, check.IsNil)
        n, err = io.ReadFull(f, buf)
        c.Check(n, check.Equals, 18)
  
        // truncate to current size
        err = f.Truncate(18)
+       c.Check(err, check.IsNil)
        f2.Seek(0, io.SeekStart)
        buf2, err = ioutil.ReadAll(f2)
        c.Check(err, check.IsNil)
  
        // shrink to block/extent boundary
        err = f.Truncate(32)
+       c.Check(err, check.IsNil)
        f2.Seek(0, io.SeekStart)
        buf2, err = ioutil.ReadAll(f2)
        c.Check(err, check.IsNil)
  
        // shrink to partial block/extent
        err = f.Truncate(15)
+       c.Check(err, check.IsNil)
        f2.Seek(0, io.SeekStart)
        buf2, err = ioutil.ReadAll(f2)
        c.Check(err, check.IsNil)
@@@ -358,14 -364,17 +364,17 @@@ func (s *CollectionFSSuite) TestSeekSpa
  
        checkSize := func(size int64) {
                fi, err := f.Stat()
+               c.Assert(err, check.IsNil)
                c.Check(fi.Size(), check.Equals, size)
  
                f, err := fs.OpenFile("test", os.O_CREATE|os.O_RDWR, 0755)
                c.Assert(err, check.IsNil)
                defer f.Close()
                fi, err = f.Stat()
+               c.Check(err, check.IsNil)
                c.Check(fi.Size(), check.Equals, size)
                pos, err := f.Seek(0, io.SeekEnd)
+               c.Check(err, check.IsNil)
                c.Check(pos, check.Equals, size)
        }
  
@@@ -465,10 -474,6 +474,10 @@@ func (s *CollectionFSSuite) TestMkdir(
  }
  
  func (s *CollectionFSSuite) TestConcurrentWriters(c *check.C) {
 +      if testing.Short() {
 +              c.Skip("slow")
 +      }
 +
        maxBlockSize = 8
        defer func() { maxBlockSize = 2 << 26 }()
  
@@@ -688,13 -693,13 +697,13 @@@ func (s *CollectionFSSuite) TestRename(
                                err = fs.Rename(
                                        fmt.Sprintf("dir%d/file%d/patherror", i, j),
                                        fmt.Sprintf("dir%d/irrelevant", i))
 -                              c.Check(err, check.ErrorMatches, `.*does not exist`)
 +                              c.Check(err, check.ErrorMatches, `.*not a directory`)
  
                                // newname parent dir is a file
                                err = fs.Rename(
                                        fmt.Sprintf("dir%d/dir%d/file%d", i, j, j),
                                        fmt.Sprintf("dir%d/file%d/patherror", i, inner-j-1))
 -                              c.Check(err, check.ErrorMatches, `.*does not exist`)
 +                              c.Check(err, check.ErrorMatches, `.*not a directory`)
                        }(i, j)
                }
        }
@@@ -788,10 -793,10 +797,10 @@@ func (s *CollectionFSSuite) TestPersist
  
        expect := map[string][]byte{
                "0":                nil,
-               "00":               []byte{},
-               "one":              []byte{1},
+               "00":               {},
+               "one":              {1},
                "dir/0":            nil,
-               "dir/two":          []byte{1, 2},
+               "dir/two":          {1, 2},
                "dir/zero":         nil,
                "dir/zerodir/zero": nil,
                "zero/zero/zero":   nil,
        c.Assert(err, check.IsNil)
  
        for name, data := range expect {
-               f, err := persisted.Open("bogus-" + name)
+               _, err = persisted.Open("bogus-" + name)
                c.Check(err, check.NotNil)
  
-               f, err = persisted.Open(name)
+               f, err := persisted.Open(name)
                c.Assert(err, check.IsNil)
  
                if data == nil {
@@@ -875,9 -880,11 +884,11 @@@ func (s *CollectionFSSuite) TestOpenFil
        c.Check(n, check.Equals, 1)
        c.Check(buf[:1], check.DeepEquals, []byte{1})
        pos, err = f.Seek(0, io.SeekCurrent)
+       c.Assert(err, check.IsNil)
        c.Check(pos, check.Equals, int64(1))
        f.Write([]byte{4, 5, 6})
        pos, err = f.Seek(0, io.SeekCurrent)
+       c.Assert(err, check.IsNil)
        c.Check(pos, check.Equals, int64(6))
        f.Seek(0, io.SeekStart)
        n, err = f.Read(buf)
        c.Check(pos, check.Equals, int64(3))
        f.Write([]byte{7, 8, 9})
        pos, err = f.Seek(0, io.SeekCurrent)
+       c.Check(err, check.IsNil)
        c.Check(pos, check.Equals, int64(9))
        f.Close()
  
@@@ -1018,10 -1026,6 +1030,10 @@@ var _ = check.Suite(&CollectionFSUnitSu
  
  // expect ~2 seconds to load a manifest with 256K files
  func (s *CollectionFSUnitSuite) TestLargeManifest(c *check.C) {
 +      if testing.Short() {
 +              c.Skip("slow")
 +      }
 +
        const (
                dirCount  = 512
                fileCount = 512
index 3e62b19bbe296f35a514543121d3b29111133db1,432c6af6d89847068cfbc154a413ade33c5585dc..5b23c9c5fa9f10bffec55d48e6950fd0ac76d639
@@@ -36,7 -36,7 +36,7 @@@ var 
  // existence automatically so sequences like "mkcol foo; put foo/bar"
  // work as expected.
  type webdavFS struct {
 -      collfs  arvados.CollectionFileSystem
 +      collfs  arvados.FileSystem
        writing bool
        // webdav PROPFIND reads the first few bytes of each file
        // whose filename extension isn't recognized, which is
  }
  
  func (fs *webdavFS) makeparents(name string) {
-       dir, name := path.Split(name)
 +      if !fs.writing {
 +              return
 +      }
+       dir, _ := path.Split(name)
        if dir == "" || dir == "/" {
                return
        }
@@@ -69,7 -66,7 +69,7 @@@ func (fs *webdavFS) Mkdir(ctx context.C
  }
  
  func (fs *webdavFS) OpenFile(ctx context.Context, name string, flag int, perm os.FileMode) (f webdav.File, err error) {
 -      writing := flag&(os.O_WRONLY|os.O_RDWR) != 0
 +      writing := flag&(os.O_WRONLY|os.O_RDWR|os.O_TRUNC) != 0
        if writing {
                fs.makeparents(name)
        }
                // webdav module returns 404 on all OpenFile errors,
                // but returns 405 Method Not Allowed if OpenFile()
                // succeeds but Write() or Close() fails. We'd rather
 -              // have 405.
 -              f = writeFailer{File: f, err: errReadOnly}
 +              // have 405. writeFailer ensures Close() fails if the
 +              // file is opened for writing *or* Write() is called.
 +              var err error
 +              if writing {
 +                      err = errReadOnly
 +              }
 +              f = writeFailer{File: f, err: err}
        }
        if fs.alwaysReadEOF {
                f = readEOF{File: f}
@@@ -117,15 -109,10 +117,15 @@@ type writeFailer struct 
  }
  
  func (wf writeFailer) Write([]byte) (int, error) {
 +      wf.err = errReadOnly
        return 0, wf.err
  }
  
  func (wf writeFailer) Close() error {
 +      err := wf.File.Close()
 +      if err != nil {
 +              wf.err = err
 +      }
        return wf.err
  }