看了下 watch 的说明,在指定 watch 的 revision 被 compact 时或者 context 取消或到期,watch chan 会被 close 。 以下是我遇到的一个疑似被 close 的场景,已知问题是(服务存在大量与 etcd 的短连接)。
for {
ach := etcdClientV3.Watch(context.Background(), "/test", clientv3.WithPrefix())
for {
select {
case wch := <- ach {
fmt.Println("recv chan")
}
}
}
}
尝试过往 etcdput 大量数据,再程序运行过程再 compact. 未能成功复现。
1
BlindingDark 2022-03-25 19:18:26 +08:00 via Android
用的什么环境,etcd 的版本是多少?
|
2
kalista OP @BlindingDark sry ,忘记说了,etcd 版本是 3.3 。https://github.com/etcd-io/etcd/issues/8668 按这个 issue 的描述,compact 是可能会在这种场景导致 channel 被 close ,最终的复现方法比较另类,先在程序循环内断点断住,写入大量数据后,再执行 compact ,把断点去掉,等待一段时间可以复现
|