#背景
-
在做区块链项目时,银行发送业务交易时有时会出现超时,报错的response;于是跟踪部署的服务的相关容器,发现业务chaincode容器存在不断重启的现象,业务chaincode容器存活一般几分钟到几小时不等。这说明chaincode容器异常挂掉过,然后再被拉起。
-
但是获取区块链状态的状态chaincode没有重启过,一直在运行。
#现象描述
具体地,chaincode容器的日志如下:
错误为:
[E] [chaincode.go:304] Received error from server: [rpc error: code = Internal desc = transport is closing], ending chaincode stream
相应地,peer上的错误日志如下:
错误为:
2018/07/11 08:11:11 [E] [handler.go:329] Error handling chaincode support stream: [rpc error: code = Canceled desc = context canceled]
从以上现象,可知chaincode确实因为错误挂掉了,这个错误表面上看是因为一个rpc error导致的,再具体一点的原因是:transport is closing, 也即是因为rpc的这个链接被关掉了,但是为何被关掉现在还不得知。
#原因分析
原因分析一:查看代码,追溯何因导致
chaincode启动过程:
main()->shim.Start()->userChaincodeStreamGetter():主要是创建grpc的连接,返回stream对象-> chatWithPeer(chaincodename, stream, cc):与peer建立通信,处理一些消息
###grpc client端:chaincode处理peer发过来消息方法:
go func() {
...
for {
in = nil
err = nil
nsInfo = nil
if recv {
recv = false
go func() {