14406: Only call LocalLocator() once per block per stream.
authorTom Clegg <tclegg@veritasgenetics.com>
Tue, 6 Nov 2018 16:13:05 +0000 (11:13 -0500)
committerTom Clegg <tclegg@veritasgenetics.com>
Tue, 6 Nov 2018 16:13:05 +0000 (11:13 -0500)
Avoid excess calls when many files are packed in a single block.

Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

sdk/go/arvados/fs_collection.go

index 2b9b7b30c31d97d35cca40f884ce572f2a3fae72..e5c0b32acef7fc5d01b5753c5930a90bd6998c52 100644 (file)
@@ -586,6 +586,7 @@ func (dn *dirnode) sync(names []string) error {
                return nil
        }
 
+       localLocator := map[string]string{}
        for _, name := range names {
                fn, ok := dn.inodes[name].(*filenode)
                if !ok {
@@ -594,9 +595,14 @@ func (dn *dirnode) sync(names []string) error {
                for idx, seg := range fn.segments {
                        switch seg := seg.(type) {
                        case storedSegment:
-                               loc, err := dn.fs.LocalLocator(seg.locator)
-                               if err != nil {
-                                       return err
+                               loc, ok := localLocator[seg.locator]
+                               if !ok {
+                                       var err error
+                                       loc, err = dn.fs.LocalLocator(seg.locator)
+                                       if err != nil {
+                                               return err
+                                       }
+                                       localLocator[seg.locator] = loc
                                }
                                seg.locator = loc
                                fn.segments[idx] = seg