2020-10-28 18:59:02 +01:00
|
|
|
package store
|
|
|
|
|
|
|
|
import (
|
2021-01-09 05:08:20 +01:00
|
|
|
"time"
|
|
|
|
|
2020-10-28 18:59:02 +01:00
|
|
|
"github.com/lbryio/lbry.go/v2/stream"
|
2021-01-09 05:08:20 +01:00
|
|
|
"github.com/lbryio/reflector.go/shared"
|
2020-10-28 18:59:02 +01:00
|
|
|
)
|
|
|
|
|
2021-04-12 23:05:50 +02:00
|
|
|
// CloudFrontRWStore combines a Cloudfront and an S3 store. Reads go to Cloudfront/Wasabi, writes go to S3.
|
2020-10-28 18:59:02 +01:00
|
|
|
type CloudFrontRWStore struct {
|
2021-04-12 23:05:50 +02:00
|
|
|
cf *ITTTStore
|
2020-10-28 18:59:02 +01:00
|
|
|
s3 *S3Store
|
|
|
|
}
|
|
|
|
|
|
|
|
// NewCloudFrontRWStore returns an initialized CloudFrontRWStore store pointer.
|
|
|
|
// NOTE: It panics if either argument is nil.
|
2021-04-12 23:05:50 +02:00
|
|
|
func NewCloudFrontRWStore(cf *ITTTStore, s3 *S3Store) *CloudFrontRWStore {
|
2020-10-28 18:59:02 +01:00
|
|
|
if cf == nil || s3 == nil {
|
|
|
|
panic("both stores must be set")
|
|
|
|
}
|
|
|
|
return &CloudFrontRWStore{cf: cf, s3: s3}
|
|
|
|
}
|
|
|
|
|
|
|
|
const nameCloudFrontRW = "cloudfront_rw"
|
|
|
|
|
|
|
|
// Name is the cache type name
|
|
|
|
func (c *CloudFrontRWStore) Name() string { return nameCloudFrontRW }
|
|
|
|
|
|
|
|
// Has checks if the hash is in the store.
|
|
|
|
func (c *CloudFrontRWStore) Has(hash string) (bool, error) {
|
|
|
|
return c.cf.Has(hash)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get gets the blob from Cloudfront.
|
2021-01-09 05:08:20 +01:00
|
|
|
func (c *CloudFrontRWStore) Get(hash string) (stream.Blob, shared.BlobTrace, error) {
|
|
|
|
start := time.Now()
|
|
|
|
blob, trace, err := c.cf.Get(hash)
|
|
|
|
return blob, trace.Stack(time.Since(start), c.Name()), err
|
2020-10-28 18:59:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
// Put stores the blob on S3
|
|
|
|
func (c *CloudFrontRWStore) Put(hash string, blob stream.Blob) error {
|
|
|
|
return c.s3.Put(hash, blob)
|
|
|
|
}
|
|
|
|
|
|
|
|
// PutSD stores the sd blob on S3
|
|
|
|
func (c *CloudFrontRWStore) PutSD(hash string, blob stream.Blob) error {
|
|
|
|
return c.s3.PutSD(hash, blob)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Delete deletes the blob from S3
|
|
|
|
func (c *CloudFrontRWStore) Delete(hash string) error {
|
|
|
|
return c.s3.Delete(hash)
|
|
|
|
}
|
2020-12-23 06:04:42 +01:00
|
|
|
|
|
|
|
// Shutdown shuts down the store gracefully
|
|
|
|
func (c *CloudFrontRWStore) Shutdown() {
|
|
|
|
c.s3.Shutdown()
|
|
|
|
c.cf.Shutdown()
|
|
|
|
return
|
|
|
|
}
|