Skip to content
This repository was archived by the owner on Apr 25, 2025. It is now read-only.

Commit b8813fe

Browse files
author
Firas Qutishat
committed
[FAB-4035] Improve handling error in orderer
Return Broadcast status in SendBroadcast and improve handling error in SendBroadcast method Change-Id: I2c750a16393d42bb15418da295d0e88780f3a465 Signed-off-by: Firas Qutishat <firas.qutishat@securekey.com>
1 parent 83acc41 commit b8813fe

File tree

4 files changed

+27
-17
lines changed

4 files changed

+27
-17
lines changed

fabric-client/chain.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1181,7 +1181,7 @@ func (c *chain) BroadcastEnvelope(envelope *SignedEnvelope) ([]*TransactionRespo
11811181
var transactionResponse *TransactionResponse
11821182

11831183
logger.Debugf("Broadcasting envelope to orderer :%s\n", orderer.GetURL())
1184-
if err := orderer.SendBroadcast(envelope); err != nil {
1184+
if err, _ := orderer.SendBroadcast(envelope); err != nil {
11851185
logger.Debugf("Receive Error Response from orderer :%v\n", err)
11861186
transactionResponse = &TransactionResponse{orderer.GetURL(),
11871187
fmt.Errorf("Error calling orderer '%s': %s", orderer.GetURL(), err)}

fabric-client/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ func (c *client) CreateChannel(request *CreateChannelRequest) (Chain, error) {
286286
err.Error())
287287
}
288288
// Send request
289-
err = request.Orderer.SendBroadcast(&SignedEnvelope{
289+
err, _ = request.Orderer.SendBroadcast(&SignedEnvelope{
290290
Signature: signedEnvelope.Signature,
291291
Payload: signedEnvelope.Payload,
292292
})

fabric-client/mockorderer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ func (o *mockOrderer) GetURL() string {
3737
}
3838

3939
// SendBroadcast mocks sending a broadcast by sending nothing nowhere
40-
func (o *mockOrderer) SendBroadcast(envelope *SignedEnvelope) error {
41-
return o.MockError
40+
func (o *mockOrderer) SendBroadcast(envelope *SignedEnvelope) (error, *common.Status) {
41+
return o.MockError, nil
4242
}
4343

4444
// SendBroadcast mocks sending a deliver request to the ordering service

fabric-client/orderer.go

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ package fabricclient
2222
import (
2323
"crypto/x509"
2424
"fmt"
25-
"io"
26-
"strings"
2725
"time"
2826

2927
"github.com/hyperledger/fabric-sdk-go/config"
@@ -38,7 +36,7 @@ import (
3836
// HFC sends a block of transactions of endorsed proposals requiring ordering.
3937
type Orderer interface {
4038
GetURL() string
41-
SendBroadcast(envelope *SignedEnvelope) error
39+
SendBroadcast(envelope *SignedEnvelope) (error, *common.Status)
4240
SendDeliver(envelope *SignedEnvelope) (chan *common.Block, chan error)
4341
}
4442

@@ -81,45 +79,51 @@ func (o *orderer) GetURL() string {
8179
}
8280

8381
// SendBroadcast Send the created transaction to Orderer.
84-
func (o *orderer) SendBroadcast(envelope *SignedEnvelope) error {
82+
func (o *orderer) SendBroadcast(envelope *SignedEnvelope) (error, *common.Status) {
8583
conn, err := grpc.Dial(o.url, o.grpcDialOption...)
8684
if err != nil {
87-
return err
85+
return err, nil
8886
}
8987
defer conn.Close()
9088

9189
broadcastStream, err := ab.NewAtomicBroadcastClient(conn).Broadcast(context.Background())
9290
if err != nil {
93-
return fmt.Errorf("Error Create NewAtomicBroadcastClient %v", err)
91+
return fmt.Errorf("Error Create NewAtomicBroadcastClient %v", err), nil
9492
}
9593
done := make(chan bool)
9694
var broadcastErr error
95+
var broadcastStatus *common.Status = nil
96+
9797
go func() {
9898
for {
9999
broadcastResponse, err := broadcastStream.Recv()
100100
logger.Debugf("Orderer.broadcastStream - response:%v, error:%v\n", broadcastResponse, err)
101101
if err != nil {
102-
if strings.Contains(err.Error(), io.EOF.Error()) {
103-
done <- true
104-
return
105-
}
106102
broadcastErr = fmt.Errorf("error broadcast response : %v", err)
107-
continue
103+
done <- true
104+
return
105+
}
106+
broadcastStatus = &broadcastResponse.Status
107+
if broadcastResponse.Status == common.Status_SUCCESS {
108+
done <- true
109+
return
108110
}
109111
if broadcastResponse.Status != common.Status_SUCCESS {
110112
broadcastErr = fmt.Errorf("broadcast response is not success : %v", broadcastResponse.Status)
113+
done <- true
114+
return
111115
}
112116
}
113117
}()
114118
if err := broadcastStream.Send(&common.Envelope{
115119
Payload: envelope.Payload,
116120
Signature: envelope.Signature,
117121
}); err != nil {
118-
return fmt.Errorf("Failed to send a envelope to orderer: %v", err)
122+
return fmt.Errorf("Failed to send a envelope to orderer: %v", err), nil
119123
}
120124
broadcastStream.CloseSend()
121125
<-done
122-
return broadcastErr
126+
return broadcastErr, broadcastStatus
123127
}
124128

125129
// SendDeliver sends a deliver request to the ordering service and returns the
@@ -175,6 +179,12 @@ func (o *orderer) SendDeliver(envelope *SignedEnvelope) (chan *common.Block,
175179
close(responses)
176180
return
177181
}
182+
if t.Status != common.Status_SUCCESS {
183+
errors <- fmt.Errorf("Got error status from ordering service: %s",
184+
t.Status)
185+
return
186+
}
187+
178188
// Response is a requested block
179189
case *ab.DeliverResponse_Block:
180190
logger.Debug("Received block from ordering service")

0 commit comments

Comments
 (0)