大家好,我是powervip!今天和大家一起探討一下:如果Fabric的智能合約函數(shù)陷入死循環(huán)會怎么樣
先看一段合約函數(shù)代碼:
func (t *SimpleChaincode) Test(stub shim.ChaincodeStubInterface, args []string) pb.Response {
// 選擇商品價格在1元到100元之間的商品名稱和數(shù)量
s := "{\"fields\": [\"GoodsName\", \"GoodsCount\"], \"selector\":{ \"$and\": [{\"GoodPrice\":{\"$gte\": 1}}, {\"GoodPrice\":{\"$lte\": 100}}] }}"
resultsIterator, err := stub.GetQueryResult(q)
defer resultsIterator.Close()
if err != nil {
return shim.Error(err.Error())
}
var count uint64
for resultsIterator.HasNext() {
count++
// resultsIterator.Next() // 注釋掉該語句,函數(shù)將陷入死循環(huán)
fmt.Println("count=", count)
}
msg := fmt.Sprintf("count: %d", count)
return shim.Success([]byte(msg))
}
上面的代碼由于把 resultsIterator.Next() 這行代碼注釋掉,返回的數(shù)據(jù)集如果包含有1條記錄或以上,游標(biāo)就會一直停留在第一條數(shù)據(jù)記錄上,導(dǎo)致 resultsIterator.HasNext() 永遠(yuǎn)為true,從而陷入死循環(huán)。
合約函數(shù)陷入死循環(huán)后,由于Fabric一般默認(rèn)的智能合約函數(shù)調(diào)用時長最長為30秒,超過30秒后,F(xiàn)abric會返回類似于下面的超時提示:
Error: endorsement failure during invoke. response: status:500 message:"failed to execute transaction 81f3c7715ae5f6678c711238571bb1c778c274bc505287da3f857465835832d6: error sending: timeout expired while executing transaction"
你以為合約函數(shù)調(diào)用就這樣結(jié)束了?No!如果你attach上peer節(jié)點(diǎn)(具體命令是:docker attach c5841e55155a,c5841e55155a為該節(jié)點(diǎn)的CONTAINER ID),你會發(fā)現(xiàn),peer節(jié)點(diǎn)的log會不斷地打印出類似下面的信息:
count= 10000
count= 10001
count= 10002
count= 10003
count= 10004
count= 10005
count= 10006
count= 10007
count= 10008
count= 10009
...
表明合約函數(shù)還在不斷地執(zhí)行死循環(huán)代碼。
如果這時候,你想在客戶端執(zhí)行其它的合約函數(shù),得到的結(jié)果都是超時,因?yàn)橹悄芎霞s在上次調(diào)用中陷入死循環(huán)后,沒辦法執(zhí)行新的函數(shù)調(diào)用了。后果真的很嚴(yán)重,需要認(rèn)真注意合約函數(shù)會引起死循環(huán)的代碼!
要如何結(jié)束死循環(huán),目前來看只有重啟peer節(jié)點(diǎn)了。如果你有更好的方法,歡迎提出來討論。
------------------------------------------------------------------------------
我是powervip
我的公眾號:區(qū)塊鏈戰(zhàn)斗機(jī)
我的知乎:powervip - 知乎
我的學(xué)習(xí)筆記:www.study.win
原創(chuàng)作品,版權(quán)所有,侵權(quán)必究!商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán);非商業(yè)轉(zhuǎn)載需保留作者署名信息,注明出處并保留原文鏈接。
如果你覺得這篇文章寫得還可以,請幫忙點(diǎn)個贊,謝謝!文章來源:http://www.zghlxwxcb.cn/news/detail-419834.html
你的鼓勵,我的動力!?文章來源地址http://www.zghlxwxcb.cn/news/detail-419834.html
到了這里,關(guān)于如果Fabric的智能合約函數(shù)陷入死循環(huán)會怎么樣的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!