1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
16
17 package s3
18
19 import (
20 "context"
21 "fmt"
22
23 "github.com/aws/aws-sdk-go/aws"
24 "github.com/aws/aws-sdk-go/service/s3"
25 "perkeep.org/pkg/blob"
26 "perkeep.org/pkg/blobserver"
27
28 "go4.org/syncutil"
29 )
30
31 var statGate = syncutil.NewGate(20)
32
33 func (sto *s3Storage) StatBlobs(ctx context.Context, blobs []blob.Ref, fn func(blob.SizedRef) error) (err error) {
34 if faultStat.FailErr(&err) {
35 return
36 }
37
38 return blobserver.StatBlobsParallelHelper(ctx, blobs, fn, statGate, func(br blob.Ref) (sb blob.SizedRef, err error) {
39 resp, err := sto.client.HeadObjectWithContext(ctx, &s3.HeadObjectInput{
40 Bucket: &sto.bucket,
41 Key: aws.String(sto.dirPrefix + br.String()),
42 })
43 if err == nil {
44 return blob.SizedRef{Ref: br, Size: uint32(*resp.ContentLength)}, nil
45 }
46 if isNotFound(err) {
47 return sb, nil
48 }
49 return sb, fmt.Errorf("error statting %v: %v", br, err)
50 })
51 }