diff --git a/cmd/bucket-lifecycle.go b/cmd/bucket-lifecycle.go index 7268a7535..e39ec626e 100644 --- a/cmd/bucket-lifecycle.go +++ b/cmd/bucket-lifecycle.go @@ -224,11 +224,19 @@ type transitionState struct { lastDayStats map[string]*lastDayTierStats } -func (t *transitionState) queueTransitionTask(oi ObjectInfo, event lifecycle.Event, src lcEventSrc) { - select { - case <-t.ctx.Done(): - case t.transitionCh <- transitionTask{objInfo: oi, event: event, src: src}: - default: +func (t *transitionState) queueTransitionTask(oi ObjectInfo, event lifecycle.Event, src lcEventSrc, blocking bool) { + task := transitionTask{objInfo: oi, event: event, src: src} + if blocking { + select { + case <-t.ctx.Done(): + case t.transitionCh <- task: + } + } else { + select { + case <-t.ctx.Done(): + case t.transitionCh <- task: + default: + } } } @@ -238,7 +246,7 @@ var globalTransitionState *transitionState // via its Init method. func newTransitionState(ctx context.Context) *transitionState { return &transitionState{ - transitionCh: make(chan transitionTask, 10000), + transitionCh: make(chan transitionTask, 100000), ctx: ctx, killCh: make(chan struct{}), lastDayStats: make(map[string]*lastDayTierStats), @@ -368,7 +376,7 @@ func enqueueTransitionImmediate(obj ObjectInfo, src lcEventSrc) { if lc, err := globalLifecycleSys.Get(obj.Bucket); err == nil { switch event := lc.Eval(obj.ToLifecycleOpts()); event.Action { case lifecycle.TransitionAction, lifecycle.TransitionVersionAction: - globalTransitionState.queueTransitionTask(obj, event, src) + globalTransitionState.queueTransitionTask(obj, event, src, true) } } } diff --git a/cmd/data-scanner.go b/cmd/data-scanner.go index 7ac982f7d..6ad770bd4 100644 --- a/cmd/data-scanner.go +++ b/cmd/data-scanner.go @@ -1173,7 +1173,7 @@ func applyTransitionRule(event lifecycle.Event, src lcEventSrc, obj ObjectInfo) if obj.DeleteMarker { return false } - globalTransitionState.queueTransitionTask(obj, event, src) + globalTransitionState.queueTransitionTask(obj, event, src, false) return true }