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.
This commit is contained in:
Anis Eleuch 2023-11-17 16:16:46 -08:00 committed by GitHub
parent 215ca58d6a
commit 1bb7a2a295
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 8 deletions

View File

@ -224,11 +224,19 @@ type transitionState struct {
lastDayStats map[string]*lastDayTierStats lastDayStats map[string]*lastDayTierStats
} }
func (t *transitionState) queueTransitionTask(oi ObjectInfo, event lifecycle.Event, src lcEventSrc) { func (t *transitionState) queueTransitionTask(oi ObjectInfo, event lifecycle.Event, src lcEventSrc, blocking bool) {
select { task := transitionTask{objInfo: oi, event: event, src: src}
case <-t.ctx.Done(): if blocking {
case t.transitionCh <- transitionTask{objInfo: oi, event: event, src: src}: select {
default: 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. // via its Init method.
func newTransitionState(ctx context.Context) *transitionState { func newTransitionState(ctx context.Context) *transitionState {
return &transitionState{ return &transitionState{
transitionCh: make(chan transitionTask, 10000), transitionCh: make(chan transitionTask, 100000),
ctx: ctx, ctx: ctx,
killCh: make(chan struct{}), killCh: make(chan struct{}),
lastDayStats: make(map[string]*lastDayTierStats), lastDayStats: make(map[string]*lastDayTierStats),
@ -368,7 +376,7 @@ func enqueueTransitionImmediate(obj ObjectInfo, src lcEventSrc) {
if lc, err := globalLifecycleSys.Get(obj.Bucket); err == nil { if lc, err := globalLifecycleSys.Get(obj.Bucket); err == nil {
switch event := lc.Eval(obj.ToLifecycleOpts()); event.Action { switch event := lc.Eval(obj.ToLifecycleOpts()); event.Action {
case lifecycle.TransitionAction, lifecycle.TransitionVersionAction: case lifecycle.TransitionAction, lifecycle.TransitionVersionAction:
globalTransitionState.queueTransitionTask(obj, event, src) globalTransitionState.queueTransitionTask(obj, event, src, true)
} }
} }
} }

View File

@ -1173,7 +1173,7 @@ func applyTransitionRule(event lifecycle.Event, src lcEventSrc, obj ObjectInfo)
if obj.DeleteMarker { if obj.DeleteMarker {
return false return false
} }
globalTransitionState.queueTransitionTask(obj, event, src) globalTransitionState.queueTransitionTask(obj, event, src, false)
return true return true
} }