RussellLuo / timingwheel

Golang implementation of Hierarchical Timing Wheels.
MIT License
655 stars 121 forks source link

timewheel启动了很久,新插入一个定时器直接就过期 #45

Open tangeping opened 1 year ago

tangeping commented 1 year ago

currentTime 只有在advanceClock中更新。假如 timewheel开了很久了,bucket 中没有定时器,新插入一个定时器,addOrRun读到currentTime 是不是直接就过期了?

func (tw *TimingWheel) advanceClock(expiration int64) {
    currentTime := atomic.LoadInt64(&tw.currentTime)
    if expiration >= currentTime+tw.tick {
        currentTime = truncate(expiration, tw.tick)
        atomic.StoreInt64(&tw.currentTime, currentTime)

        // Try to advance the clock of the overflow wheel if present
        overflowWheel := atomic.LoadPointer(&tw.overflowWheel)
        if overflowWheel != nil {
            (*TimingWheel)(overflowWheel).advanceClock(currentTime)
        }
    }
}

@RussellLuo

ch0ngsheng commented 1 year ago

时间轮的currentTime向前推进,是由DelayQueue中的堆顶元素过期的事件触发的。没有bucket到期就不会更新currentTime。