Closed
Description
timer.item.removed = true
newItem := &timingEntry{
baseEntry: task,
value: timer.item.value,
}
tw.slots[pos].PushBack(newItem)
tw.setTimerPosition(pos, newItem)
以上代码中,旧的task的removed被标记为了true,但是新、旧task在timers里都是同样的key,当执行到旧task时从timers里移除了该key,当再move或remove新task的时候由于key已经不存在,导致执行失效了。
一下代码可以测试出bug:
const testStep = time.Second
func TestMoveTask(t *testing.T) {
keys := make([]string, 0)
tw, _ := NewTimingWheel(testStep, 10, func(k, v interface{}) {
keys = append(keys, k.(string))
fmt.Printf("%v\n", k)
})
fmt.Printf("第一次SetTimer\n")
tw.SetTimer("first", "v1", testStep * 8)
time.Sleep(testStep * 6)
fmt.Printf("move task\n")
tw.MoveTimer("first", testStep * 7)
time.Sleep(testStep * 3)
fmt.Printf("remove task\n")
tw.removeTask("first")
time.Sleep(testStep * 30)
assert.Equal(t, 0, len(keys))
}
Metadata
Metadata
Assignees
Labels
No labels