Время ожидания истекло при запросе больших данных в Hyperledger Fabric 1.4.1 - PullRequest
1 голос
/ 08 мая 2019

Я использую Hyperledger Fabric 1.4.1, со службой заказа Kafka, Couch DB в качестве stateDB, цепным кодом Java и Java SDK.У меня истекло время ожидания, когда я пытаюсь отправить большие данные в канал и затем запросить их обратно.

Размер данных отправленной мной транзакции составляет 512 КБ, и я могу запросить ее у коллег.

Я пытался отправить его 7 раз с одним и тем же идентификатором, и я могу получить все 7 историй с помощью функции shim getHistoryForKey.Но когда я отправил его 8 раз с одним и тем же идентификатором, getHistoryForKey не удалось.

Ниже показано сообщение об ошибке (от коллег):

Error: endorsement failure during query. response: status:500 message:"failed to execute transaction fdfbc5b72efd688136c777f5b114a3cedc62339e42f6c39a27e86ca11b8e3d14: error sending: timeout expired while executing transaction"

Я попытался увеличить время ожиданиясо следующими параметрами и их комбинациями в peer и клиенте:

CORE_CHAINCODE_EXECUTETIMEOUT="120s"
CORE_LEDGER_STATE_COUCHDBCONFIG_REQUESTTIMEOUT="120s"
# (seems this setting is not for Hyperledger Fabric)
CORE_PEER_GRPCOPTIONS_REQUESET_TIMEOUT="120s"

Но они не помогли в моем случае.Я также заметил, что 7 копий тестовых данных занимают около 3,5 МБ, и я попытался запросить данные 4 МБ (что составляет около 8 копий) у однорангового узла, но не смог.см. следующее сообщение об ошибке:

SEVERE: An error occured on the chaincode stream. Shutting down the chaincode stream.
io.grpc.StatusRuntimeException: RESOURCE_EXHAUSTED: 
io.grpc.netty.NettyClientTransport$3: Frame size 6294852 exceeds maximum: 4194304.

Кажется, что есть ограничение grpc при запуске докера цепочки кодов Java.

Мы протестировали с помощью go chaincode, такой проблемы не возникает.

1 Ответ

0 голосов
/ 09 мая 2019

Нам удалось это исправить, переопределив класс ChaincodeBase

ManagedChannelBuilder<?> newChannelBuilder() throws IOException {
    final NettyChannelBuilder builder = NettyChannelBuilder.forAddress(host, port);
    logger.info("Configuring channel connection to peer.");        

    builder.maxInboundMessageSize(104857600);
    logger.info("maxInboundMessageSize is 104857600.");
    if (tlsEnabled) {
        builder.negotiationType(NegotiationType.TLS);
        builder.sslContext(createSSLContext());
    } else {
        builder.usePlaintext(true);
    }
    return builder;
}

Я отправил заявку на фабрику Jira, чтобы поддержать изменение переменной без переопределения.

...