in sharedlibraries/storage/storage.go [361:422]
func (rw *ReadWriter) Download(ctx context.Context) (int64, error) {
if rw.BucketHandle == nil {
return 0, errors.New("no bucket defined")
}
if rw.EncryptionKey != "" || rw.KMSKey != "" {
log.CtxLogger(ctx).Infow("Decryption enabled for download", "bucket", rw.BucketName, "object", rw.ObjectName)
}
object := rw.BucketHandle.Object(rw.ObjectName)
var decodedKey []byte
if rw.EncryptionKey != "" {
var err error
decodedKey, err = base64.StdEncoding.DecodeString(rw.EncryptionKey)
if err != nil {
return 0, err
}
object = object.Key(decodedKey)
}
var reader io.ReadCloser
var err error
if rw.ParallelDownloadWorkers > 1 {
reader, err = rw.NewParallelReader(ctx, decodedKey)
} else {
object = object.Retryer(rw.retryOptions("Failed to download data from Google Cloud Storage, retrying.")...)
reader, err = object.NewReader(ctx)
}
if err != nil {
return 0, err
}
defer reader.Close()
rw.Reader = reader
rw = rw.defaultArgs()
log.CtxLogger(ctx).Infow("Download starting", "bucket", rw.BucketName, "object", rw.ObjectName, "totalBytes", rw.TotalBytes)
var bytesWritten int64
attrs, err := object.Attrs(ctx)
if err != nil {
return 0, err
}
if attrs.ContentType == compressedContentType {
log.CtxLogger(ctx).Infow("Compressed file detected, decompressing during download", "bucket", rw.BucketName, "object", rw.ObjectName)
gzipReader, err := gzip.NewReader(rw)
if err != nil {
return 0, err
}
if bytesWritten, err = rw.Copier(rw.Writer, gzipReader); err != nil {
return 0, err
}
if err := gzipReader.Close(); err != nil {
return 0, err
}
} else {
if bytesWritten, err = rw.Copier(rw.Writer, rw); err != nil {
return 0, err
}
}
avgTransferSpeedMBps := float64(rw.bytesTransferred) / rw.totalTransferTime.Seconds() / 1024 / 1024
log.CtxLogger(ctx).Infow("Download success", "bucket", rw.BucketName, "object", rw.ObjectName, "bytesWritten", bytesWritten, "bytesTransferred", rw.bytesTransferred, "totalBytes", rw.TotalBytes, "percentComplete", 100, "avgTransferSpeedMBps", fmt.Sprintf("%g", math.Round(avgTransferSpeedMBps)))
return bytesWritten, nil
}