LoginSignup
1
1

More than 5 years have passed since last update.

Hyperledger Fabric v0.6.1-preview で200件以上のトランザクションが捌けなかった話

Last updated at Posted at 2017-05-30

事象

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を宣言するよりはあと)に追加する。

参考リンク

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1