[zeromicro/go-zero]PeriodicalExecutor的backgroundFlush超时退出可能阻塞Add(task)操作

2024-03-08 298 views
7

测试用例添加到`periodicalexecutor_test.go, 执行:

go test -v -count 100 -test.run TestPeriodicalExecutor_Deadlock

原因应该是:

  1. Add开始
  2. AddAndCheck() 结束
  3. backgroundFlush正好超时退出
  4. Add阻塞在<-pe.confirmChan
func TestPeriodicalExecutor_Deadlock(t *testing.T) {
    executer := NewBulkExecutor(func(tasks []interface{}) {
    }, WithBulkTasks(1), WithBulkInterval(time.Millisecond))
    for i := 0; i < 1e6; i++ {
        executer.Add(1)
    }
}

QQ截图20201226011952 QQ截图20201226011919

回答

1

没能重现

    case vals := <-pe.commander:
        commanded = true
        pe.enterExecution()
        pe.confirmChan <- lang.Placeholder

这里只要拿了 pe.commander 里的task,就会往 confirmChan 里写的

需要再明确说明下,咋出来这个问题的,感谢!

6

只要把上面的测试用例执行多次就会出现,例如100次。 当backgroundFlush函数超过idleround的退出,但是这个时候Add函数中的pe.commander <- vals可能还没有执行,这个时候backgroundFlush已经不存在了,Add函数就会block在<-pe.confirmChan

5

可以查看提交里面的截图,我这边windows用这个测试用例是必现的。mac上多跑一些次数按说也会出现

5

这两天太忙,元旦看哈,感谢感谢!

3

有劳再试试

4

概率上确实降低了很多,但是流程上这个问题还是会存在。