diff --git a/pkg/fs/local.go b/pkg/fs/local.go index 4046f5c1..e5c78cc6 100644 --- a/pkg/fs/local.go +++ b/pkg/fs/local.go @@ -2,6 +2,7 @@ package fs import ( "context" + "fmt" "io" "net/http" "os" @@ -36,7 +37,10 @@ func (l *Local) Open(name string) (http.File, error) { func (l *Local) Delete(_ctx context.Context, name string) error { path := filepath.Join(l.rootDir, name) - return os.Remove(path) + if err := os.Remove(path); err != nil { + return fmt.Errorf("failed to delete file %s: %w", path, err) + } + return nil } func (l *Local) Create(_ctx context.Context, name string, reader io.Reader) (int64, error) { diff --git a/pkg/fs/local_test.go b/pkg/fs/local_test.go index 9157450f..ce532841 100644 --- a/pkg/fs/local_test.go +++ b/pkg/fs/local_test.go @@ -7,6 +7,7 @@ import ( "path/filepath" "testing" + "github.com/pkg/errors" "github.com/stretchr/testify/assert" ) @@ -79,6 +80,9 @@ func TestLocal_Delete(t *testing.T) { _, err = os.Stat(filepath.Join(tmpDir, "1", "test")) assert.True(t, os.IsNotExist(err)) + + err = stor.Delete(testCtx, "1/test") + assert.True(t, errors.Is(err, os.ErrNotExist)) } func TestLocal_copyFile(t *testing.T) { diff --git a/pkg/fs/s3.go b/pkg/fs/s3.go index 16cdb8eb..6f2b3828 100644 --- a/pkg/fs/s3.go +++ b/pkg/fs/s3.go @@ -65,6 +65,13 @@ func (s *S3) Delete(ctx context.Context, name string) error { Bucket: &s.bucket, Key: &key, }) + if err != nil { + if awsErr, ok := err.(awserr.Error); ok { + if awsErr.Code() == "NotFound" { + return os.ErrNotExist + } + } + } return err } diff --git a/pkg/fs/s3_test.go b/pkg/fs/s3_test.go index d5e56dcf..8d25b48b 100644 --- a/pkg/fs/s3_test.go +++ b/pkg/fs/s3_test.go @@ -13,6 +13,7 @@ import ( "github.com/aws/aws-sdk-go/service/s3" "github.com/aws/aws-sdk-go/service/s3/s3iface" "github.com/aws/aws-sdk-go/service/s3/s3manager" + "github.com/pkg/errors" "github.com/stretchr/testify/assert" ) @@ -64,10 +65,13 @@ func TestS3_Delete(t *testing.T) { assert.NoError(t, err) _, err = stor.Size(testCtx, "1/test") - assert.True(t, os.IsNotExist(err)) + assert.True(t, errors.Is(err, os.ErrNotExist)) _, ok := files["1/test"] assert.False(t, ok) + + err = stor.Delete(testCtx, "1/test") + assert.True(t, errors.Is(err, os.ErrNotExist)) } func TestS3_BuildKey(t *testing.T) { diff --git a/services/update/updater.go b/services/update/updater.go index 8cc9f721..8d637ac6 100644 --- a/services/update/updater.go +++ b/services/update/updater.go @@ -398,9 +398,15 @@ func (u *Manager) cleanup(ctx context.Context, feedConfig *feed.Config) error { path = fmt.Sprintf("%s/%s", feedConfig.ID, episodeName) ) - if err := u.fs.Delete(ctx, path); err != nil { - result = multierror.Append(result, errors.Wrapf(err, "failed to delete episode: %s", episode.ID)) - continue + err := u.fs.Delete(ctx, path) + if err != nil { + if !errors.Is(err, os.ErrNotExist) { + logger.WithError(err).Errorf("failed to delete episode file: %s", episode.ID) + result = multierror.Append(result, errors.Wrapf(err, "failed to delete episode: %s", episode.ID)) + continue + } + + logger.WithField("episode_id", episode.ID).Info("episode was not found - file does not exist") } if err := u.db.UpdateEpisode(feedID, episode.ID, func(episode *model.Episode) error {