Etcd 的 watch chan 被 close,不知道应该如何复现

2022-03-25 17:39:37 +08:00
 kalista

看了下 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. 未能成功复现。

1501 次点击
所在节点    Go 编程语言
2 条回复
BlindingDark
2022-03-25 19:18:26 +08:00
用的什么环境,etcd 的版本是多少?
kalista
2022-03-25 19:34:43 +08:00
@BlindingDark sry ,忘记说了,etcd 版本是 3.3 。https://github.com/etcd-io/etcd/issues/8668 按这个 issue 的描述,compact 是可能会在这种场景导致 channel 被 close ,最终的复现方法比较另类,先在程序循环内断点断住,写入大量数据后,再执行 compact ,把断点去掉,等待一段时间可以复现

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/842900

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX