事象
Fabricのサンプルとして配られている送金処理(exsample02)を繰りまわしたところ、
200をトリガーに処理が止まってしまった。v1.0に期待
ソース修正点
app.js
//省略(l.140くらい)
var step;
for (step = 0; step < 1000; step++)
{
invoke(user);
}
//省略(l.150くらい)
エラーメッセージ
error.log
Error: started twice without stopping
at Error (native)
at ResponseTime.start (/home/ratnakar/go/src/github.com/hyperledger/fabric/event-perf/node_modules/hfc/lib/stats.js:77:19)
at TCertGetter.getTCerts (/home/ratnakar/go/src/github.com/hyperledger/fabric/event-perf/node_modules/hfc/lib/hfc.js:1705:35)
at TCertGetter.getNextTCert (/home/ratnakar/go/src/github.com/hyperledger/fabric/event-perf/node_modules/hfc/lib/hfc.js:1659:18)
at Member.getNextTCert (/home/ratnakar/go/src/github.com/hyperledger/fabric/event-perf/node_modules/hfc/lib/hfc.js:862:28)
at TransactionContext.getMyTCert (/home/ratnakar/go/src/github.com/hyperledger/fabric/event-perf/node_modules/hfc/lib/hfc.js:1175:21)
at TransactionContext.invoke (/home/ratnakar/go/src/github.com/hyperledger/fabric/event-perf/node_modules/hfc/lib/hfc.js:1012:14)
at Member.invoke (/home/ratnakar/go/src/github.com/hyperledger/fabric/event-perf/node_modules/hfc/lib/hfc.js:814:12)
at executeTest (/home/ratnakar/go/src/github.com/hyperledger/fabric/event-perf/childProcess.js:58:27)
at /home/ratnakar/go/src/github.com/hyperledger/fabric/event-perf/childProcess.js:76:13
原因(推測)
トランザクション発行時、はじめにHFCがmembersrvcからTCert Batch Size(def200)の数だけ
TCertを発行するがそれを使い切った後のプロセスに問題がある?
解決方法
暫定ですが・・・
1. HFCのバグを取り除く
/opt/gopath/src/github.com/hyperledger/fabric/examples/sdk/node/node_modules/hfc/lib/hfc.jsの中身をいじって、getTCertResponseTimeを使っているところを除く(3箇所)とうごいた。
hfc.js
// 省略(l.1700くらい)
TCertGetter.prototype.getTCerts = function () {
var self = this;
var req = {
name: self.member.getName(),
enrollment: self.member.getEnrollment(),
num: self.member.getTCertBatchSize(),
attrs: self.attrs
};
// self.getTCertResponseTime.start(); ←getTCertResponseTimeがだめみたい・・・
self.memberServices.getTCertBatch(req, function (err, tcerts) {
if (err) {
// self.getTCertResponseTime.cancel(); ←getTCertResponseTimeがだめみたい・・・
// Error all waiters
while (self.getTCertWaiters.length > 0) {
self.getTCertWaiters.shift()(err);
}
return;
}
// self.getTCertResponseTime.stop(); ←getTCertResponseTimeがだめみたい・・・
// Add to member's tcert list
while (tcerts.length > 0) {
self.tcerts.push(tcerts.shift());
}
// Allow waiters to proceed
while (self.getTCertWaiters.length > 0 && self.tcerts.length > 0) {
var waiter = self.getTCertWaiters.shift();
waiter(null, self.tcerts.shift());
}
});
};
// 省略(l1720くらい)
2. Tcert Batch Sizeを大きくする(根本解決じゃない)
ファイルをベタ書きで書き換える、メソッドを呼び出す両方ありますが後者を記載。
app.js
chain.setTCertBatchSize(1000);
↑を最初のほうのどこか(chainを宣言するよりはあと)に追加する。