Hyperledger Composer - ошибка 8: RESOURCE_EXHAUSTED - PullRequest
0 голосов
/ 14 мая 2018

Я сталкиваюсь с ошибкой, когда пытаюсь обновить два ресурса, связанных с одним и тем же активом.Я получаю сообщение об ошибке после обновления с HL Composer v0.18.1 до v0.19.4.

Здесь представлены модели:

asset Order identified by pullID {
  o String pullID
  --> PackCase caseNumber optional
}

asset PackCase identified by caseNumber{
    o String caseNumber
    --> Order[] orders optional
}

Я хочу связать Order1 и Order2 с Packcase1.Для этого я использую этот метод в процессоре транзакций, который вставляет заказ в массив packcase.orders и одновременно обновляет ссылку order.casenumber:

function AssociatePackCaseToOrder(tx){

    tx.order.caseNumber = tx.packCase;
    tx.packCase.orders.push(tx.order);

    return getAssetRegistry(namespaceAsset+'.Order')
    .then(function(ordersRegistry){
        return ordersRegistry.update(tx.order)
        .then(function(){
            console.info("Order Updated");
            return getAssetRegistry(namespaceAsset+'.PackCase')
            .then(function(packCaseRegistry){
                return packCaseRegistry.update(tx.packCase)
                .then(function(){
                    console.info("PackCase Updated");
                })
            })
        })
    })
}

Но когда я пытаюсь вызвать этот метод два разапоследовательно я получаю эту ошибку:

Error trying invoke business network. Error: No valid responses from any peers.\nResponse from attempted peer comms was an error:
Error: 8 RESOURCE_EXHAUSTED: received trailing metadata size exceeds limit",
"stack":"Error: Error trying invoke business network. Error: No valid responses from any peers.
Response from attempted peer comms was an error: Error: 8 RESOURCE_EXHAUSTED: received trailing metadata size exceeds limit
at _initializeChannel.then.then.then.then.catch (/usr/lib/node_modules/composer-rest-server/node_modules/composer-connector-hlfv1/lib/hlfconnection.js:967:34)
at <anonymous>

Кто-нибудь знает, что может быть причиной ошибки?

1 Ответ

0 голосов
/ 14 мая 2018

Я думаю, что в вашем коде есть проблема, и RESOURCE_EXHAUSTED (который, вероятно, исходит из ограничений размера сообщения grpc) - возможно, это первая строка, в которой вы назначаете объект для String.

В настоящее время (хотя вы не опубликовали модель транзакции) вы пытаетесь связать Заказ (или коллекцию) с PackCase - ваш код показывает одну транзакцию за раз (вы обновляете реестр для каждого ресурса).Код, показанный ниже, добавляет ссылку на номер регистра в Order и помещает идентификатор заказа (идентификатор FQ) в массив PackCase.

То есть с такой моделью:

asset Order identified by pullID {
  o String pullID
  o String caseNumber optional
  --> PackCase packcase optional // this would make more sense naming-wise
}

asset PackCase identified by caseNumber {
    o String caseNumber
    --> Order[] orders optional    
    // o Order[] orders optional   // alternative, see below.
}

transaction acpto {
  --> Order order
  --> PackCase packCase
}

yourкод транзакции выглядит следующим образом:

/**
     * Associate the Packcase to order
     * @param {org.acme.mynetwork.acpto} tx - the tx to be processed
     * @transaction
**/



function AssociatePackCaseToOrder(tx){

   var namespaceAsset = 'org.acme.mynetwork';
    tx.order.caseNumber = tx.packCase.getIdentifier(); // eg. '1'
   console.log(" case ref is " +  tx.packCase.getIdentifier() ); 
   console.log(" order ref is " +  tx.order.getIdentifier() );

 //  tx.order.pullID  = tx.order.getIdentifier(); // because its a relationship, will still have the FQ identifer hence commented out FYI


    if(tx.packCase.orders == null) {
        tx.packCase.orders  = []; // initialise
    }

    tx.packCase.orders.push(tx.order);

    return getAssetRegistry(namespaceAsset+'.Order')
    .then(function(ordersRegistry){
        return ordersRegistry.update(tx.order)
        .then(function(){
            console.info("Order Updated");
            return getAssetRegistry(namespaceAsset+'.PackCase')
            .then(function(packCaseRegistry){
                return packCaseRegistry.update(tx.packCase)
                .then(function(){
                    console.info("PackCase Updated");
                })
            })
        })
    })
}

Ваш метод: --> Order[] orders optional

{
      "$class": "org.acme.mynetwork.PackCase",
      "caseNumber": "5",
      "orders": [
        "resource:org.acme.mynetwork.Order#1",
        "resource:org.acme.mynetwork.Order#2",
        "resource:org.acme.mynetwork.Order#3"
      ]
    }

альтернатива Order[] orders optional:

после отправки 3 транзакций для Заказа 1, Заказа2 и Заказ 3, вы получаете это в активе PackCase:

{
  "$class": "org.acme.mynetwork.PackCase",
  "caseNumber": "3",
  "orders": [
    {
      "$class": "org.acme.mynetwork.Order", 
      "pullID": "1",
      "caseNumber": "3"
    },
    {
      "$class": "org.acme.mynetwork.Order",
      "pullID": "2",
      "caseNumber": "3"
    }
    {
      "$class": "org.acme.mynetwork.Order",
      "pullID": "3",
      "caseNumber": "3"
    }
  ]
}

Достаточно сказать, что номер заказа Заказа обновляется со ссылочным номером дела от PackCase.

...