upwell
upwell
修改了一个版本来修复hang的问题,参考了golang db connection pool的逻辑来处理意外hang的情况,我再自己的程序里面用了一段时间(半个月左右),暂时没有遇到问题。
## 现象: 当有较多的goroutine在等待从Pool中Get连接,同时没有空闲连接时,有种情况,当被使用的连接,同时出错并被调用者Close掉时,等待获取连接的goroutine会一直阻塞等待从connReq这个channel获取连接,而所有的连接都已经被关闭了,不会再有可用的连接,导致一直等待,程序hang住。 ## 原因 在`Get`方法中,第133行检查完已创建的连接数达到了最大值后,会等待从`connReq`的channel等待其它goroutine Put回来的连接。 在`Close`方法中,会把`openingConns--`,但已经没法触发`Get`方法去新建连接了,`Get`方法都被阻塞在从`connReq`的channel拿连接了。 Get方法133行 https://github.com/silenceper/pool/blob/58e025e48bf97061c9f2638564fd6857092caeb4/channel.go#L133 https://github.com/silenceper/pool/blob/58e025e48bf97061c9f2638564fd6857092caeb4/channel.go#L130-L140 Close方法 https://github.com/silenceper/pool/blob/58e025e48bf97061c9f2638564fd6857092caeb4/channel.go#L202-L213