From 1bb7a2a295a5a5ab75e5c921867ecc35cb3740fc Mon Sep 17 00:00:00 2001 From: Anis Eleuch Date: Fri, 17 Nov 2023 16:16:46 -0800 Subject: [PATCH] Immediate transition ILM to avoid quick deferring to the scanner (#18475) Immediate transition use case and is mostly used to fill warm backend with a lot of data when a new deployment is created Currently, if the transition queue is complete, the transition will be deferred to the scanner; change this behavior by blocking the PUT request until the transition queue has a new place for a transition task. --- cmd/bucket-lifecycle.go | 22 +++++++++++++++------- cmd/data-scanner.go | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) 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 }