diff --git a/pkg/mock/storage.go b/pkg/mock/storage.go index 6f2488b..11df57f 100644 --- a/pkg/mock/storage.go +++ b/pkg/mock/storage.go @@ -22,6 +22,7 @@ import ( type MockStorageReader struct { ctrl *gomock.Controller recorder *MockStorageReaderMockRecorder + isgomock struct{} } // MockStorageReaderMockRecorder is the mock recorder for MockStorageReader. @@ -60,6 +61,7 @@ func (mr *MockStorageReaderMockRecorder) CatFileFromStorage(name, offset, setts type MockStorageWriter struct { ctrl *gomock.Controller recorder *MockStorageWriterMockRecorder + isgomock struct{} } // MockStorageWriterMockRecorder is the mock recorder for MockStorageWriter. @@ -111,6 +113,7 @@ func (mr *MockStorageWriterMockRecorder) PutFileToDest(name, r, settings any) *g type MockStorageLister struct { ctrl *gomock.Controller recorder *MockStorageListerMockRecorder + isgomock struct{} } // MockStorageListerMockRecorder is the mock recorder for MockStorageLister. @@ -149,6 +152,7 @@ func (mr *MockStorageListerMockRecorder) ListPath(prefix any) *gomock.Call { type MockStorageMover struct { ctrl *gomock.Controller recorder *MockStorageMoverMockRecorder + isgomock struct{} } // MockStorageMoverMockRecorder is the mock recorder for MockStorageMover. @@ -168,6 +172,20 @@ func (m *MockStorageMover) EXPECT() *MockStorageMoverMockRecorder { return m.recorder } +// AbortMultipartUploads mocks base method. +func (m *MockStorageMover) AbortMultipartUploads() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AbortMultipartUploads") + ret0, _ := ret[0].(error) + return ret0 +} + +// AbortMultipartUploads indicates an expected call of AbortMultipartUploads. +func (mr *MockStorageMoverMockRecorder) AbortMultipartUploads() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AbortMultipartUploads", reflect.TypeOf((*MockStorageMover)(nil).AbortMultipartUploads)) +} + // DeleteObject mocks base method. func (m *MockStorageMover) DeleteObject(key string) error { m.ctrl.T.Helper() @@ -200,6 +218,7 @@ func (mr *MockStorageMoverMockRecorder) MoveObject(from, to any) *gomock.Call { type MockStorageInteractor struct { ctrl *gomock.Controller recorder *MockStorageInteractorMockRecorder + isgomock struct{} } // MockStorageInteractorMockRecorder is the mock recorder for MockStorageInteractor. @@ -219,6 +238,20 @@ func (m *MockStorageInteractor) EXPECT() *MockStorageInteractorMockRecorder { return m.recorder } +// AbortMultipartUploads mocks base method. +func (m *MockStorageInteractor) AbortMultipartUploads() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AbortMultipartUploads") + ret0, _ := ret[0].(error) + return ret0 +} + +// AbortMultipartUploads indicates an expected call of AbortMultipartUploads. +func (mr *MockStorageInteractorMockRecorder) AbortMultipartUploads() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AbortMultipartUploads", reflect.TypeOf((*MockStorageInteractor)(nil).AbortMultipartUploads)) +} + // CatFileFromStorage mocks base method. func (m *MockStorageInteractor) CatFileFromStorage(name string, offset int64, setts []settings.StorageSettings) (io.ReadCloser, error) { m.ctrl.T.Helper() diff --git a/pkg/proc/delete_handler.go b/pkg/proc/delete_handler.go index 5d01709..e7b9dc3 100644 --- a/pkg/proc/delete_handler.go +++ b/pkg/proc/delete_handler.go @@ -76,6 +76,10 @@ func (dh *BasicDeleteHandler) HandleDeleteGarbage(msg message.DeleteMessage) err return errors.Wrap(err, "failed to move some files") } + if err := dh.StorageInterractor.AbortMultipartUploads(); err != nil { + return err + } + return nil } diff --git a/pkg/storage/filestorage.go b/pkg/storage/filestorage.go index 4515ab6..a05708f 100644 --- a/pkg/storage/filestorage.go +++ b/pkg/storage/filestorage.go @@ -85,3 +85,7 @@ func (s *FileStorageInteractor) MoveObject(from string, to string) error { func (s *FileStorageInteractor) DeleteObject(key string) error { return os.Remove(path.Join(s.cnf.StoragePrefix, key)) } + +func (s *FileStorageInteractor) AbortMultipartUploads() error { + return nil +} diff --git a/pkg/storage/s3storage.go b/pkg/storage/s3storage.go index 3a6d14d..ab45c82 100644 --- a/pkg/storage/s3storage.go +++ b/pkg/storage/s3storage.go @@ -249,3 +249,43 @@ func (s *S3StorageInteractor) MoveObject(from string, to string) error { } return s.DeleteObject(from) } + +func (s *S3StorageInteractor) AbortMultipartUploads() error { + sess, err := s.pool.GetSession(context.TODO()) + if err != nil { + return err + } + + uploads := make([]*s3.MultipartUpload, 0) + var keyMarker *string + for { + out, err := sess.ListMultipartUploads(&s3.ListMultipartUploadsInput{ + Bucket: aws.String(s.cnf.StorageBucket), + KeyMarker: keyMarker, + }) + if err != nil { + return err + } + + uploads = append(uploads, out.Uploads...) + + if !*out.IsTruncated { + break + } + + keyMarker = out.NextKeyMarker + } + + for i := 0; i < len(uploads); i++ { + _, err := sess.AbortMultipartUpload(&s3.AbortMultipartUploadInput{ + Bucket: aws.String(s.cnf.StorageBucket), + UploadId: uploads[i].UploadId, + Key: uploads[i].Key, + }) + if err != nil { + return err + } + } + + return nil +} diff --git a/pkg/storage/storage.go b/pkg/storage/storage.go index 3e00c4c..22e35c3 100644 --- a/pkg/storage/storage.go +++ b/pkg/storage/storage.go @@ -26,6 +26,7 @@ type StorageLister interface { type StorageMover interface { MoveObject(from string, to string) error DeleteObject(key string) error + AbortMultipartUploads() error } //go:generate mockgen -destination=pkg/mock/storage.go -package=mock