14397: Fix unchecked errors in S3 block listing.
authorTom Clegg <tclegg@veritasgenetics.com>
Mon, 12 Nov 2018 14:27:12 +0000 (09:27 -0500)
committerTom Clegg <tclegg@veritasgenetics.com>
Mon, 12 Nov 2018 15:41:34 +0000 (10:41 -0500)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tclegg@veritasgenetics.com>

services/keepstore/s3_volume.go

index 02d9dcf91bd3e5e7b4dda416a3454618a3305888..68406d5a28e9de01df1bb252235c5a912fde0f30 100644 (file)
@@ -509,8 +509,7 @@ func (v *S3Volume) IndexTo(prefix string, writer io.Writer) error {
                PageSize: v.IndexPageSize,
                Stats:    &v.bucket.stats,
        }
-       for data, recent := dataL.First(), recentL.First(); data != nil; data = dataL.Next() {
-               v.bucket.stats.Tick(&v.bucket.stats.Ops, &v.bucket.stats.ListOps)
+       for data, recent := dataL.First(), recentL.First(); data != nil && dataL.Error() == nil; data = dataL.Next() {
                if data.Key >= "g" {
                        // Conveniently, "recent/*" and "trash/*" are
                        // lexically greater than all hex-encoded data
@@ -529,7 +528,7 @@ func (v *S3Volume) IndexTo(prefix string, writer io.Writer) error {
                stamp := data
 
                // Advance to the corresponding recent/X marker, if any
-               for recent != nil {
+               for recent != nil && recentL.Error() == nil {
                        if cmp := strings.Compare(recent.Key[7:], data.Key); cmp < 0 {
                                recent = recentL.Next()
                                continue
@@ -544,13 +543,16 @@ func (v *S3Volume) IndexTo(prefix string, writer io.Writer) error {
                                break
                        }
                }
+               if err := recentL.Error(); err != nil {
+                       return err
+               }
                t, err := time.Parse(time.RFC3339, stamp.LastModified)
                if err != nil {
                        return err
                }
                fmt.Fprintf(writer, "%s+%d %d\n", data.Key, data.Size, t.UnixNano())
        }
-       return nil
+       return dataL.Error()
 }
 
 // Trash a Keep block.