批量插入Hyperledger Fabric可以保持超时

时间:2018-10-05 06:58:08

标签: couchdb hyperledger-fabric hyperledger

我们正在将记录批量插入Hyperledger Fabric。但是,我们遇到了超时问题。即使我们继续增加超时时间,我们也只会在以后发生此错误。

每个事务使用PutState循环为所有这些记录插入1000条记录(盲插入,读集中没有内容)。我们还将BatchTimeout增加到3s,将MaxMessageCount增加到100,这样我们得到了更大的块(我们看到每个块4个事务,因此每个块将4000个[每个事务4x1000个记录]记录插入分类帐中)。

当CouchDB的bulk_update失败并且对等方必须分别重试每个事务(每个事务1000条记录)中的每条记录时,查询将花费太长的时间,并且超时。但这是我们的假设。我们还发现了:https://jira.hyperledger.org/browse/FAB-10558,但是它说它已经在v1.2.0中得到了修复,这是我们正在使用的版本。

我们从以下日志中得到的错误是net/http: request canceled (Client.Timeout exceeded while reading body)

我们尝试在对等容器中设置以下环境变量:

CORE_CHAINCODE_EXECUTETIMEOUT=120s

使用Java SDK时也使用req.setProposalWaitTime(120 * 1000)

但是,稍后我们会收到相同的超时错误。因此,我们可以将超时变量增加到更大的数目,但我们相信稍后会再次发生。插入CouchDB所需的时间与CouchDB中的记录数成正比吗?可能随着文档数量的增加而更新索引会花费更多时间吗?


我们获得的运行时错误日志(插入2-4百万条记录后)如下:

    October 5th 2018, 04:36:38.646  github.com/hyperledger/fabric/core/committer.(*LedgerCommitter).CommitWithPvtData(0xc4222db8c0, 0xc451e4f470, 0xc4312ddd40, 0xdf8475800)
    October 5th 2018, 04:36:38.646  github.com/hyperledger/fabric/gossip/state.(*GossipStateProviderImpl).deliverPayloads(0xc4220c5a00)
    October 5th 2018, 04:36:38.646  goroutine 283 [running]:
    October 5th 2018, 04:36:38.646      /opt/gopath/src/github.com/hyperledger/fabric/core/committer/committer_impl.go:105 +0x6b
    October 5th 2018, 04:36:38.646      /opt/gopath/src/github.com/hyperledger/fabric/gossip/privdata/coordinator.go:236 +0xc3b
    October 5th 2018, 04:36:38.646      /opt/gopath/src/github.com/hyperledger/fabric/gossip/state/state.go:771 +0x6c
    October 5th 2018, 04:36:38.646  
    October 5th 2018, 04:36:38.646  github.com/hyperledger/fabric/core/ledger/kvledger.(*kvLedger).CommitWithPvtData(0xc421fb1860, 0xc451e4f470, 0x0, 0x0)
    October 5th 2018, 04:36:38.646  github.com/hyperledger/fabric/gossip/privdata.(*coordinator).StoreBlock(0xc422286e60, 0xc42462cd80, 0x0, 0x0, 0x0, 0xc4312dde78, 0x7329db)
    October 5th 2018, 04:36:38.646  github.com/hyperledger/fabric/gossip/state.(*GossipStateProviderImpl).commitBlock(0xc4220c5a00, 0xc42462cd80, 0x0, 0x0, 0x0, 0x0, 0x0)
    October 5th 2018, 04:36:38.646  panic: Error during commit to txmgr:net/http: request canceled (Client.Timeout exceeded while reading body)
    October 5th 2018, 04:36:38.646      /opt/gopath/src/github.com/hyperledger/fabric/core/ledger/kvledger/kv_ledger.go:273 +0x870
    October 5th 2018, 04:36:38.646      /opt/gopath/src/github.com/hyperledger/fabric/gossip/state/state.go:558 +0x3c5
    October 5th 2018, 04:36:38.646      /opt/gopath/src/github.com/hyperledger/fabric/gossip/state/state.go:239 +0x681
    October 5th 2018, 04:36:38.646  created by github.com/hyperledger/fabric/gossip/state.NewGossipStateProvider
    October 5th 2018, 04:36:03.645  2018-10-04 20:36:00.783 UTC [kvledger] CommitWithPvtData -> INFO 466e[0m Channel [mychannel]: Committed block [1719] with 4 transaction(s)
    October 5th 2018, 04:35:56.644  [33m2018-10-04 20:35:55.807 UTC [statecouchdb] commitUpdates -> WARN 465c[0m CouchDB batch document update encountered an problem. Retrying update for document ID:32216027-da66-4ecd-91a1-a37bdf47f07d
    October 5th 2018, 04:35:56.644  [33m2018-10-04 20:35:55.866 UTC [statecouchdb] commitUpdates -> WARN 4663[0m CouchDB batch document update encountered an problem. Retrying update for document ID:6eaed2ae-e5c4-48b1-b063-20eb3009969b
    October 5th 2018, 04:35:56.644  [33m2018-10-04 20:35:55.870 UTC [statecouchdb] commitUpdates -> WARN 4664[0m CouchDB batch document update encountered an problem. Retrying update for document ID:2ca2fbcc-e78f-4ed0-be70-2c4d7ecbee69
    October 5th 2018, 04:35:56.644  [33m2018-10-04 20:35:55.904 UTC [statecouchdb] commitUpdates -> WARN 4667[0m CouchDB batch document update encountered an problem. ... and so on

1 个答案:

答案 0 :(得分:4)

[33m2018-10-04 20:35:55.870 UTC [statecouchdb] commitUpdates -> WARN 4664[0m CouchDB batch document update encountered an problem. Retrying update for document ID:2ca2fbcc-e78f-4ed0-be70-2c4d7ecbee69

以上内容表明POST http://localhost:5984/db/_bulk_docks失败,因此单独尝试了各个文档。

查看可用于配置的不同参数,将ledger section下的requestTimeout增加可能值得一试。

这可以通过在docker-compose中为您的对等容器设置以下环境变量来完成:

CORE_LEDGER_STATE_COUCHDBCONFIG_REQUESTTIMEOUT=100s

与配置参数关联的环境变量的名称可以通过查看this答案来得出。

配置CORE_CHAINCODE_EXECUTETIMEOUTproposalWaitime可能不会对下游的其他连接产生影响(这里是 peer couchdb )正在超时,然后传播超时异常。