From de26924a4a47fa6b48971cf51f51a5b732745e59 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Mon, 19 Sep 2022 13:59:11 +0200 Subject: [PATCH] don't error out if storage key already exists (#840) --- internal/media/processingemoji.go | 4 ++-- internal/media/processingmedia.go | 4 ++-- internal/storage/local.go | 13 +++++++++++-- internal/storage/storage.go | 1 + 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/internal/media/processingemoji.go b/internal/media/processingemoji.go index e3ed5ce0a..7ffb6d7fa 100644 --- a/internal/media/processingemoji.go +++ b/internal/media/processingemoji.go @@ -136,7 +136,7 @@ func (p *ProcessingEmoji) loadStatic(ctx context.Context) error { } // put the static in storage - if err := p.storage.Put(ctx, p.emoji.ImageStaticPath, static.small); err != nil { + if err := p.storage.Put(ctx, p.emoji.ImageStaticPath, static.small); err != nil && err != storage.ErrAlreadyExists { p.err = fmt.Errorf("loadStatic: error storing static: %s", err) atomic.StoreInt32(&p.staticState, int32(errored)) return p.err @@ -217,7 +217,7 @@ func (p *ProcessingEmoji) store(ctx context.Context) error { multiReader := io.MultiReader(bytes.NewBuffer(firstBytes), reader) // store this for now -- other processes can pull it out of storage as they please - if err := p.storage.PutStream(ctx, p.emoji.ImagePath, multiReader); err != nil { + if err := p.storage.PutStream(ctx, p.emoji.ImagePath, multiReader); err != nil && err != storage.ErrAlreadyExists { return fmt.Errorf("store: error storing stream: %s", err) } diff --git a/internal/media/processingmedia.go b/internal/media/processingmedia.go index 3f3a68f3f..e537c8301 100644 --- a/internal/media/processingmedia.go +++ b/internal/media/processingmedia.go @@ -162,7 +162,7 @@ func (p *ProcessingMedia) loadThumb(ctx context.Context) error { // put the thumbnail in storage log.Tracef("loadThumb: storing new thumbnail %s", p.attachment.URL) - if err := p.storage.Put(ctx, p.attachment.Thumbnail.Path, thumb.small); err != nil { + if err := p.storage.Put(ctx, p.attachment.Thumbnail.Path, thumb.small); err != nil && err != storage.ErrAlreadyExists { p.err = fmt.Errorf("loadThumb: error storing thumbnail: %s", err) atomic.StoreInt32(&p.thumbState, int32(errored)) return p.err @@ -341,7 +341,7 @@ func (p *ProcessingMedia) store(ctx context.Context) error { p.attachment.File.FileSize = fileSize // store this for now -- other processes can pull it out of storage as they please - if err := p.storage.PutStream(ctx, p.attachment.File.Path, clean); err != nil { + if err := p.storage.PutStream(ctx, p.attachment.File.Path, clean); err != nil && err != storage.ErrAlreadyExists { return fmt.Errorf("store: error storing stream: %s", err) } diff --git a/internal/storage/local.go b/internal/storage/local.go index 8ed3ca8d8..103233219 100644 --- a/internal/storage/local.go +++ b/internal/storage/local.go @@ -24,6 +24,7 @@ import ( "net/url" "codeberg.org/gruf/go-store/kv" + "codeberg.org/gruf/go-store/storage" ) type Local struct { @@ -39,11 +40,19 @@ func (l *Local) GetStream(ctx context.Context, key string) (io.ReadCloser, error } func (l *Local) PutStream(ctx context.Context, key string, r io.Reader) error { - return l.KVStore.PutStream(key, r) + err := l.KVStore.PutStream(key, r) + if err == storage.ErrAlreadyExists { + return ErrAlreadyExists + } + return err } func (l *Local) Put(ctx context.Context, key string, value []byte) error { - return l.KVStore.Put(key, value) + err := l.KVStore.Put(key, value) + if err == storage.ErrAlreadyExists { + return ErrAlreadyExists + } + return err } func (l *Local) Delete(ctx context.Context, key string) error { diff --git a/internal/storage/storage.go b/internal/storage/storage.go index 7a4ebc6c3..7bd4c18aa 100644 --- a/internal/storage/storage.go +++ b/internal/storage/storage.go @@ -34,6 +34,7 @@ import ( ) var ErrNotSupported = errors.New("driver does not suppport functionality") +var ErrAlreadyExists = errors.New("storage key already exists") // Driver implements the functionality to store and retrieve blobs // (images,video,audio)