Skip to content

Commit 331af3b

Browse files
use range requests (#52)
Co-authored-by: Luke Lombardi <[email protected]>
1 parent 447539c commit 331af3b

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

pkg/s3_client.go

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@ import (
1212
"github.com/aws/aws-sdk-go-v2/service/s3"
1313
)
1414

15+
const (
16+
downloadChunkSize = 64 * 1024 * 1024 // 64MB
17+
)
18+
1519
type S3Client struct {
1620
Client *s3.Client
1721
Source S3SourceConfig
@@ -70,15 +74,39 @@ func (c *S3Client) Head(ctx context.Context, key string) (bool, *s3.HeadObjectOu
7074
}
7175

7276
func (c *S3Client) DownloadIntoBuffer(ctx context.Context, key string, buffer *bytes.Buffer) error {
73-
resp, err := c.Client.GetObject(ctx, &s3.GetObjectInput{
74-
Bucket: aws.String(c.Source.BucketName),
75-
Key: aws.String(key),
76-
})
77-
if err != nil {
77+
ok, head, err := c.Head(ctx, key)
78+
if err != nil || !ok {
7879
return err
7980
}
81+
size := aws.ToInt64(head.ContentLength)
82+
83+
buffer.Reset()
84+
var start int64 = 0
85+
86+
for start < size {
87+
end := start + downloadChunkSize - 1
88+
if end >= size {
89+
end = size - 1
90+
}
91+
92+
rangeHeader := fmt.Sprintf("bytes=%d-%d", start, end)
93+
resp, err := c.Client.GetObject(ctx, &s3.GetObjectInput{
94+
Bucket: aws.String(c.Source.BucketName),
95+
Key: aws.String(key),
96+
Range: &rangeHeader,
97+
})
98+
if err != nil {
99+
return err
100+
}
101+
102+
n, err := io.Copy(buffer, resp.Body)
103+
resp.Body.Close()
104+
if err != nil {
105+
return err
106+
}
107+
108+
start += n
109+
}
80110

81-
defer resp.Body.Close()
82-
_, err = io.Copy(buffer, resp.Body)
83-
return err
111+
return nil
84112
}

pkg/server.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,6 +500,7 @@ func (cs *CacheService) StoreContentFromSource(ctx context.Context, req *proto.S
500500
} else {
501501
err := cs.cacheSourceFromS3(req.Source, &buffer)
502502
if err != nil {
503+
Logger.Errorf("StoreFromContent[ERR] - error caching source: %v", err)
503504
return &proto.StoreContentFromSourceResponse{Ok: false, ErrorMsg: err.Error()}, err
504505
}
505506
}

0 commit comments

Comments
 (0)