在处理续约应答的协程中代码的错误

来源: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群里有几位同学都指正过,谢谢提醒~

0
0

Go语言开发分布式任务调度 轻松搞定高性能Crontab

分布式系统设计+高并发细节处理,一次性让你“晋级”到位

1136 学习 · 177 问题

查看课程