10181: Add Size method to arvados.CollectionFileSystem.
authorTom Clegg <tclegg@veritasgenetics.com>
Thu, 20 Sep 2018 04:59:35 +0000 (00:59 -0400)
committerTom Clegg <tclegg@veritasgenetics.com>
Thu, 20 Sep 2018 04:59:35 +0000 (00:59 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/arvados/fs_collection.go
sdk/go/arvados/fs_collection_test.go

index 7ce37aa24e7b35bfbabec9508af3b2e308d4cc76..bcf2f4810432039dc436ca03f1a8a9200f1c0b0a 100644 (file)
@@ -31,6 +31,8 @@ type CollectionFileSystem interface {
        // Prefix (normally ".") is a top level directory, effectively
        // prepended to all paths in the returned manifest.
        MarshalManifest(prefix string) (string, error)
+
+       Size() int64
 }
 
 type collectionFileSystem struct {
@@ -139,6 +141,10 @@ func (fs *collectionFileSystem) MarshalManifest(prefix string) (string, error) {
        return fs.fileSystem.root.(*dirnode).marshalManifest(prefix)
 }
 
+func (fs *collectionFileSystem) Size() int64 {
+       return fs.fileSystem.root.(*dirnode).Size()
+}
+
 // filenodePtr is an offset into a file that is (usually) efficient to
 // seek to. Specifically, if filenode.repacked==filenodePtr.repacked
 // then
@@ -877,6 +883,18 @@ func (dn *dirnode) createFileAndParents(path string) (fn *filenode, err error) {
        return
 }
 
+func (dn *dirnode) Size() (bytes int64) {
+       dn.RLock()
+       defer dn.RUnlock()
+       for _, i := range dn.inodes {
+               switch i := i.(type) {
+               case *filenode, *dirnode:
+                       bytes += i.Size()
+               }
+       }
+       return
+}
+
 type segment interface {
        io.ReaderAt
        Len() int
index d2f55d0e37d80502919f6385c2a0d457374a26c2..ac3bbbbada39dc2a68727aee6a1ab27ae45b35e9 100644 (file)
@@ -353,6 +353,7 @@ func (s *CollectionFSSuite) TestReadWriteFile(c *check.C) {
        c.Check(err, check.IsNil)
        m = regexp.MustCompile(`\+A[^\+ ]+`).ReplaceAllLiteralString(m, "")
        c.Check(m, check.Equals, "./dir1 3858f62230ac3c915f300c664312c63f+6 25d55ad283aa400af464c76d713c07ad+8 3:3:bar 6:3:foo\n")
+       c.Check(s.fs.Size(), check.Equals, int64(6))
 }
 
 func (s *CollectionFSSuite) TestSeekSparse(c *check.C) {
@@ -1060,6 +1061,7 @@ func (s *CollectionFSUnitSuite) TestLargeManifest(c *check.C) {
        f, err := coll.FileSystem(nil, nil)
        c.Check(err, check.IsNil)
        c.Logf("%s loaded", time.Now())
+       c.Check(f.Size(), check.Equals, int64(42*dirCount*fileCount))
 
        for i := 0; i < dirCount; i++ {
                for j := 0; j < fileCount; j++ {