From 2683b97463ac8cb1e52dab9b37a7456eb1920a74 Mon Sep 17 00:00:00 2001 From: Rodrigue Geis Date: Tue, 27 Aug 2024 11:30:59 +0200 Subject: [PATCH 1/4] fs: check for ctx cancellation --- backends/fs/fs.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/backends/fs/fs.go b/backends/fs/fs.go index 8015afe..089d30b 100644 --- a/backends/fs/fs.go +++ b/backends/fs/fs.go @@ -22,6 +22,9 @@ type Backend struct { func (b *Backend) List(ctx context.Context, prefix string) (simpleblob.BlobList, error) { var blobs simpleblob.BlobList + if err := ctx.Err(); err != nil { + return blobs, err + } entries, err := os.ReadDir(b.rootPath) if err != nil { @@ -59,6 +62,9 @@ func (b *Backend) List(ctx context.Context, prefix string) (simpleblob.BlobList, } func (b *Backend) Load(ctx context.Context, name string) ([]byte, error) { + if err := ctx.Err(); err != nil { + return nil, err + } if !allowedName(name) { return nil, os.ErrNotExist } @@ -67,6 +73,9 @@ func (b *Backend) Load(ctx context.Context, name string) ([]byte, error) { } func (b *Backend) Store(ctx context.Context, name string, data []byte) error { + if err := ctx.Err(); err != nil { + return err + } if !allowedName(name) { return os.ErrPermission } @@ -82,6 +91,9 @@ func (b *Backend) Store(ctx context.Context, name string, data []byte) error { } func (b *Backend) Delete(ctx context.Context, name string) error { + if err := ctx.Err(); err != nil { + return err + } if !allowedName(name) { return os.ErrPermission } @@ -119,6 +131,9 @@ func New(opt Options) (*Backend, error) { func init() { simpleblob.RegisterBackend("fs", func(ctx context.Context, p simpleblob.InitParams) (simpleblob.Interface, error) { + if err := ctx.Err(); err != nil { + return nil, err + } var opt Options if err := p.OptionsThroughYAML(&opt); err != nil { return nil, err From c6792971076cfeda017f8e4e7c961fc6b3977ad9 Mon Sep 17 00:00:00 2001 From: Rodrigue Geis Date: Tue, 27 Aug 2024 11:31:38 +0200 Subject: [PATCH 2/4] memory: check ctx cancellation --- backends/memory/memory.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/backends/memory/memory.go b/backends/memory/memory.go index 5c5785d..35e297b 100644 --- a/backends/memory/memory.go +++ b/backends/memory/memory.go @@ -17,6 +17,9 @@ type Backend struct { func (b *Backend) List(ctx context.Context, prefix string) (simpleblob.BlobList, error) { var blobs simpleblob.BlobList + if err := ctx.Err(); err != nil { + return blobs, err + } b.mu.Lock() for name, data := range b.blobs { @@ -35,6 +38,9 @@ func (b *Backend) List(ctx context.Context, prefix string) (simpleblob.BlobList, } func (b *Backend) Load(ctx context.Context, name string) ([]byte, error) { + if err := ctx.Err(); err != nil { + return nil, err + } b.mu.Lock() data, exists := b.blobs[name] b.mu.Unlock() @@ -48,6 +54,9 @@ func (b *Backend) Load(ctx context.Context, name string) ([]byte, error) { } func (b *Backend) Store(ctx context.Context, name string, data []byte) error { + if err := ctx.Err(); err != nil { + return err + } dataCopy := make([]byte, len(data)) copy(dataCopy, data) @@ -59,6 +68,9 @@ func (b *Backend) Store(ctx context.Context, name string, data []byte) error { } func (b *Backend) Delete(ctx context.Context, name string) error { + if err := ctx.Err(); err != nil { + return err + } b.mu.Lock() defer b.mu.Unlock() delete(b.blobs, name) @@ -71,6 +83,9 @@ func New() *Backend { func init() { simpleblob.RegisterBackend("memory", func(ctx context.Context, p simpleblob.InitParams) (simpleblob.Interface, error) { + if err := ctx.Err(); err != nil { + return nil, err + } return New(), nil }) } From c9c32d5095211a9adff329e4cf88d78950227c47 Mon Sep 17 00:00:00 2001 From: Rodrigue Geis Date: Tue, 27 Aug 2024 11:32:18 +0200 Subject: [PATCH 3/4] tester: test for ctx cancellation --- tester/tester.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/tester/tester.go b/tester/tester.go index 8399ff1..61d291b 100644 --- a/tester/tester.go +++ b/tester/tester.go @@ -95,4 +95,16 @@ func DoBackendTests(t *testing.T, b simpleblob.Interface) { ls, err = b.List(ctx, "") assert.NoError(t, err) assert.NotContains(t, ls.Names(), "foo-1") + + // Should gracefully accept context cancellation. + ctx1, cancel1 := context.WithCancel(ctx) + cancel1() + _, err = b.List(ctx1, "") + assert.ErrorIs(t, err, context.Canceled) + _, err = b.Load(ctx1, "anything") + assert.ErrorIs(t, err, context.Canceled) + err = b.Delete(ctx1, "anything") + assert.ErrorIs(t, err, context.Canceled) + err = b.Store(ctx1, "anything", []byte{}) + assert.ErrorIs(t, err, context.Canceled) } From acceb4aef2f1574d70d8a0ef47b16d4472df26d6 Mon Sep 17 00:00:00 2001 From: Rodrigue Geis Date: Tue, 27 Aug 2024 15:35:55 +0200 Subject: [PATCH 4/4] s3: marker: check for ctx cancellation when marker is disabled too --- backends/s3/marker.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backends/s3/marker.go b/backends/s3/marker.go index ca03654..c2a80dc 100644 --- a/backends/s3/marker.go +++ b/backends/s3/marker.go @@ -14,7 +14,7 @@ import ( // anything and returns no error. func (b *Backend) setMarker(ctx context.Context, name, etag string, isDel bool) error { if !b.opt.UseUpdateMarker { - return nil + return ctx.Err() } nanos := time.Now().UnixNano() s := fmt.Sprintf("%s:%s:%d:%v", name, etag, nanos, isDel)