func TestReceiveAnyMessage(t *testing.T) { var err error adapter.count = 1 block := createTestBlock() if err = producer.SendProducerBlockEvent(block); err != nil { t.Fail() t.Logf("Error sending message %s", err) } emsg := createTestChaincodeEvent("0xffffffff", "event2") if err = producer.Send(emsg); err != nil { t.Fail() t.Logf("Error sending message %s", err) } //receive 2 messages - a block and a chaincode event for i := 0; i < 2; i++ { select { case <-adapter.notfy: case <-time.After(5 * time.Second): t.Fail() t.Logf("timed out on messge") } } }
func (d *DeliverService) readUntilClose() { for { msg, err := d.client.Recv() if err != nil { logger.Warningf("Receive error: %s", err.Error()) return } switch t := msg.Type.(type) { case *orderer.DeliverResponse_Error: if t.Error == common.Status_SUCCESS { logger.Warning("ERROR! Received success in error field") return } logger.Warning("Got error ", t) case *orderer.DeliverResponse_Block: seqNum := t.Block.Header.Number block := &common.Block{} block.Header = t.Block.Header // Copy and initialize peer metadata putils.CopyBlockMetadata(t.Block, block) block.Data = &common.BlockData{} for _, d := range t.Block.Data.Data { if d != nil { if env, err := putils.GetEnvelopeFromBlock(d); err != nil { fmt.Printf("Error getting tx from block(%s)\n", err) } else if env != nil { // validate the transaction: here we check that the transaction // is properly formed, properly signed and that the security // chain binding proposal to endorsements to tx holds. We do // NOT check the validity of endorsements, though. That's a // job for VSCC below payload, _, err := peer.ValidateTransaction(env) if err != nil { // TODO: this code needs to receive a bit more attention and discussion: // it's not clear what it means if a transaction which causes a failure // in validation is just dropped on the floor logger.Errorf("Invalid transaction, error %s", err) } else { //the payload is used to get headers err = isTxValidForVscc(payload, d) if err != nil { // TODO: this code needs to receive a bit more attention and discussion: // it's not clear what it means if a transaction which causes a failure // in validation is just dropped on the floor logger.Errorf("isTxValidForVscc returned error %s", err) continue } if t, err := proto.Marshal(env); err == nil { block.Data.Data = append(block.Data.Data, t) } else { fmt.Printf("Cannot marshal transactoins %s\n", err) } } } else { logger.Warning("Nil tx from block") } } } numberOfPeers := len(service.GetGossipService().GetPeers()) // Create payload with a block received payload := createPayload(seqNum, block) // Use payload to create gossip message gossipMsg := createGossipMsg(payload) logger.Debugf("Adding payload locally, buffer seqNum = [%d], peers number [%d]", seqNum, numberOfPeers) // Add payload to local state payloads buffer service.GetGossipService().AddPayload(d.chainID, payload) // Gossip messages with other nodes logger.Debugf("Gossiping block [%d], peers number [%d]", seqNum, numberOfPeers) service.GetGossipService().Gossip(gossipMsg) if err = producer.SendProducerBlockEvent(block); err != nil { logger.Errorf("Error sending block event %s", err) } d.unAcknowledged++ if d.unAcknowledged >= d.windowSize/2 { logger.Warningf("Sending acknowledgement [%d]", t.Block.Header.Number) err = d.client.Send(&orderer.DeliverUpdate{ Type: &orderer.DeliverUpdate_Acknowledgement{ Acknowledgement: &orderer.Acknowledgement{ Number: seqNum, }, }, }) if err != nil { return } d.unAcknowledged = 0 } default: logger.Warning("Received unknown: ", t) return } } }