in core/base/slot_chain.go [162:219]
func (sc *SlotChain) Entry(ctx *EntryContext) *TokenResult {
// This should not happen, unless there are errors existing in Sentinel internal.
// If happened, need to add TokenResult in EntryContext
defer func() {
if err := recover(); err != nil {
logging.Error(errors.Errorf("%+v", err), "Sentinel internal panic in SlotChain.Entry()")
ctx.SetError(errors.Errorf("%+v", err))
return
}
}()
// execute prepare slot
sps := sc.statPres
if len(sps) > 0 {
for _, s := range sps {
s.Prepare(ctx)
}
}
// execute rule based checking slot
rcs := sc.ruleChecks
var ruleCheckRet *TokenResult
if len(rcs) > 0 {
for _, s := range rcs {
sr := s.Check(ctx)
if sr == nil {
// nil equals to check pass
continue
}
// check slot result
if sr.IsBlocked() {
ruleCheckRet = sr
break
}
}
}
if ruleCheckRet == nil {
ctx.RuleCheckResult.ResetToPass()
} else {
ctx.RuleCheckResult = ruleCheckRet
}
// execute statistic slot
ss := sc.stats
ruleCheckRet = ctx.RuleCheckResult
if len(ss) > 0 {
for _, s := range ss {
// indicate the result of rule based checking slot.
if !ruleCheckRet.IsBlocked() {
s.OnEntryPassed(ctx)
} else {
// The block error should not be nil.
s.OnEntryBlocked(ctx, ruleCheckRet.blockErr)
}
}
}
return ruleCheckRet
}