mirror of https://github.com/minio/minio.git
				
				
				
			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:
		
							parent
							
								
									215ca58d6a
								
							
						
					
					
						commit
						1bb7a2a295
					
				|  | @ -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) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -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 | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue