diff --git a/cmd/data-scanner.go b/cmd/data-scanner.go index 35ef2f7b0..9664b0635 100644 --- a/cmd/data-scanner.go +++ b/cmd/data-scanner.go @@ -944,7 +944,7 @@ func (i *scannerItem) applyLifecycle(ctx context.Context, o ObjectLayer, oi Obje defer globalScannerMetrics.timeILM(lcEvt.Action)() switch lcEvt.Action { - case lifecycle.DeleteAction, lifecycle.DeleteVersionAction, lifecycle.DeleteRestoredAction, lifecycle.DeleteRestoredVersionAction: + case lifecycle.DeleteAction, lifecycle.DeleteVersionAction, lifecycle.DeleteRestoredAction, lifecycle.DeleteRestoredVersionAction, lifecycle.DeleteAllVersionsAction: return applyLifecycleAction(lcEvt, lcEventSrc_Scanner, oi), 0 case lifecycle.TransitionAction, lifecycle.TransitionVersionAction: return applyLifecycleAction(lcEvt, lcEventSrc_Scanner, oi), size @@ -1133,6 +1133,12 @@ func evalActionFromLifecycle(ctx context.Context, lc lifecycle.Lifecycle, lr loc return event } + if obj.IsLatest && event.Action == lifecycle.DeleteAllVersionsAction { + if lr.LockEnabled && enforceRetentionForDeletion(ctx, obj) { + return lifecycle.Event{Action: lifecycle.NoneAction} + } + } + switch event.Action { case lifecycle.DeleteVersionAction, lifecycle.DeleteRestoredVersionAction: // Defensive code, should never happen @@ -1232,7 +1238,8 @@ func applyExpiryRule(event lifecycle.Event, src lcEventSrc, obj ObjectInfo) bool func applyLifecycleAction(event lifecycle.Event, src lcEventSrc, obj ObjectInfo) (success bool) { switch action := event.Action; action { case lifecycle.DeleteVersionAction, lifecycle.DeleteAction, - lifecycle.DeleteRestoredAction, lifecycle.DeleteRestoredVersionAction: + lifecycle.DeleteRestoredAction, lifecycle.DeleteRestoredVersionAction, + lifecycle.DeleteAllVersionsAction: success = applyExpiryRule(event, src, obj) case lifecycle.TransitionAction, lifecycle.TransitionVersionAction: success = applyTransitionRule(event, src, obj) diff --git a/internal/bucket/lifecycle/lifecycle.go b/internal/bucket/lifecycle/lifecycle.go index ee6b90010..25d5b2a32 100644 --- a/internal/bucket/lifecycle/lifecycle.go +++ b/internal/bucket/lifecycle/lifecycle.go @@ -92,7 +92,7 @@ func (a Action) Delete() bool { if a.DeleteRestored() { return true } - return a == DeleteVersionAction || a == DeleteAction + return a == DeleteVersionAction || a == DeleteAction || a == DeleteAllVersionsAction } // Lifecycle - Configuration for bucket lifecycle.