在处理续约应答的协程中代码的错误
来源:4-8 lease租约实现kv过期
memory0572
2019-04-24
视频与代码库中的代码为
go func() {
for {
select {
case keepResp = <- keepRespChan:
if keepRespChan == nil {
fmt.Println("租约已经失效了")
goto END
} else { // 每秒会续租一次, 所以就会受到一次应答
fmt.Println("收到自动续租应答:", keepResp.ID)
}
}
}
END:
}()
其中,用keepRespChan是否等于nil来判断是否失效似乎不对。因为keepRespChan的类型是chan of *clientv3.LeaseKeepAliveResponse,在lease.KeepAlive()的返回值中已经被初始化过了。所以keepRespChan一直会是一个地址。
验证是否存在问题的办法很容易,在程序运行期间,手动将etcd服务进行关闭。此时代码就会报错:
所以判断的代码应该是keepResp == nil.因为源代码lease.go中如果etcd异常,KeepAlive函数将会close chan。此时<-keepRespChan返回nil
写回答
1回答
-
小鱼儿老师
2019-05-01
嗯嗯,同学说的对,这是我粗心搞错了,Q群里有几位同学都指正过,谢谢提醒~
00
相似问题