Files
files/internal/jobs/pending_upload.go

80 lines
2.0 KiB
Go
Raw Normal View History

package jobs
import (
"context"
"time"
"git.apinb.com/bsm-sdk/core/logger"
"git.apinb.com/ops/files/internal/config"
"git.apinb.com/ops/files/internal/impl"
"git.apinb.com/ops/files/internal/lifecycle"
"git.apinb.com/ops/files/internal/models"
)
func StartPendingUploadCleanup() {
go func() {
cleanupPendingUploads()
ticker := time.NewTicker(time.Duration(config.Spec.Cleanup.IntervalSeconds) * time.Second)
defer ticker.Stop()
for range ticker.C {
cleanupPendingUploads()
}
}()
}
func cleanupPendingUploads() {
var fileObjects []models.FileObject
now := time.Now()
result := impl.DBService.
Where(
"(status = ? AND expires_at <= ?) OR (status = ? AND (delete_lease_until IS NULL OR delete_lease_until <= ?))",
models.FileStatusPending,
now,
models.FileStatusDeleting,
now,
).
Order("id ASC").
Limit(100).
Find(&fileObjects)
if result.Error != nil {
logger.Error("stage=scan")
return
}
for _, fileObject := range fileObjects {
var lease lifecycle.DeletionLease
var claimed bool
var err error
now = time.Now()
if fileObject.Status == models.FileStatusPending {
lease, claimed, err = lifecycle.ClaimExpiredPendingDeletion(impl.DBService, fileObject.ID, now)
} else {
lease, claimed, err = lifecycle.ClaimDeletionRetry(impl.DBService, fileObject.ID, now)
}
if err != nil {
logger.Errorf("identity=%s stage=claim", fileObject.Identity)
continue
}
if !claimed {
continue
}
cleanupClaimedFile(fileObject, lease)
}
}
func cleanupClaimedFile(fileObject models.FileObject, lease lifecycle.DeletionLease) {
operationCtx, cancel := context.WithTimeout(context.Background(), lifecycle.DeleteOperationTimeout)
defer cancel()
if err := impl.StorageService.Delete(operationCtx, fileObject.ObjectKey); err != nil {
logger.Errorf("identity=%s stage=oss_delete", fileObject.Identity)
return
}
if err := lifecycle.FinalizeDeletion(impl.DBService.WithContext(operationCtx), fileObject.ID, lease.Token); err != nil {
logger.Errorf("identity=%s stage=finalize", fileObject.Identity)
}
}