rpcxio / rpcx-etcd

etcd plugin for rpcx
Apache License 2.0
29 stars 24 forks source link

多协程有几率获取不到servers #18

Closed peasfarmer closed 1 year ago

peasfarmer commented 3 years ago

客户端启动时协程之间同步是否存在以下bug, 导致有几率一启动是获取不到服务器列表,需要等待下一个刷新周期. 下图是左右分别为两个协程的执行时序

协程1                                 协程2

pairs := discovery.GetServices()
获取到pairs为空,协程1暂停,协程2开始执行
                                        d.pairsMu.Lock()
                                        d.pairs = pairs
                                        d.pairsMu.Unlock()
                                        由于协程1的WatchService还未执行,d.chans为空,for不能进入
                                        for _, ch := range d.chans {
                                            ...
                                            ch <- pairs:
                                            ...
                                        }

协程1继续执行
client.selector = newSelector(selectMode, servers) //由于pairs为空,所以servers也为空
...
ch := client.discovery.WatchService()
go client.watch(ch)
ch内没有内容,导致不执行UpdateServer

@smallnest 麻烦确认是否有这个问题呢

smallnest commented 1 year ago

pen碰巧client启动的·时候服务器有更新,会出现这样的情况,非常race