运行调用或查询操作会强制链代码容器重新启动

时间:2018-01-17 07:17:49

标签: hyperledger-fabric

我不确定社区是否知道此问题,但我尝试在[fabric samples]下运行余额转移应用程序:https://github.com/hyperledger/fabric-samples。一切似乎都顺利进行。但是,在运行查询或调用操作时,包含链代码的docker容器崩溃并重新启动。你可以通过运行来检查它 docker ps -a。状态将显示容器刚刚启动。

我查看了被查询的同行的日志,似乎问题出现在这里:

2018-01-17 07:06:33.654 UTC [container] lockContainer -> DEBU 891 waiting for container(dev-peer0.org1.example.com-mycc-v0) lock 2018-01-17 07:06:33.654 UTC [container] lockContainer -> DEBU 892 got container (dev-peer0.org1.example.com-mycc-v0) lock 2018-01-17 07:06:33.655 UTC [dockercontroller] Start -> DEBU 893 Cleanup container dev-peer0.org1.example.com-mycc-v0 ****2018-01-17 07:06:33.693 UTC [chaincode] processStream -> ERRO 894 Error handling chaincode support stream: rpc error: code = Canceled desc = context canceled**** 2018-01-17 07:06:33.693 UTC [chaincode] deregisterHandler -> DEBU 895 Deregister handler: mycc:v0 2018-01-17 07:06:34.343 UTC [dockercontroller] stopInternal -> DEBU 896 Stopped container dev-peer0.org1.example.com-mycc-v0 2018-01-17 07:06:34.343 UTC [dockercontroller] stopInternal -> DEBU 897 Kill container dev-peer0.org1.example.com-mycc-v0 (API error (409): {"message":"Cannot kill container: dev-peer0.org1.example.com-mycc-v0: Container d818357f76068ab0a9efbf70be9b9a19fd7f6cc7bbe11eaba95c0a61d208ceac is not running"} ) 2018-01-17 07:06:34.459 UTC [dockercontroller] stopInternal -> DEBU 898 Removed container dev-peer0.org1.example.com-mycc-v0 2018-01-17 07:06:34.459 UTC [dockercontroller] Start -> DEBU 899 Start container dev-peer0.org1.example.com-mycc-v0 2018-01-17 07:06:34.459 UTC [dockercontroller] createContainer -> DEBU 89a Create container: dev-peer0.org1.example.com-mycc-v0 2018-01-17 07:06:34.724 UTC [dockercontroller] createContainer -> DEBU 89b Created container: dev-peer0.org1.example.com-mycc-v0-f021beca29998638e0bb7caa7af8fda7f1e709518214a3181d259abcb2347093

知道发生了什么事吗?

1 个答案:

答案 0 :(得分:0)

链码有两种类型

  1. 系统链码(对等二进制文件的一部分)

  2. 应用程序链代码(由智能合约/链代码开发人员开发)

系统链代码是对等二进制文件本身的一部分,而应用程序链代码则在Docker容器中实例化。有各种系统链码,例如LSCC,CSCC,QSCC等。
LSCC是指生命周期系统链代码,它管理应用程序链代码的生命周期。
LSCC包含各种与链码相关的逻辑,例如安装逻辑,实例化逻辑,升级逻辑,调用和查询逻辑。


所以,重点是

如果
chaincode容器已经启动并运行 然后,执行查询/调用函数并将结果返回给 呼叫者。
其他
由于任何原因,如果链码容器被杀死并且无法运行 通过gRPC的请求 然后, LSCC调用/查询逻辑再次启动chaincode容器,直到 准备好处理调用者发出的请求。