Skip to content

Commit 4200a5e

Browse files
committed
[FAB-9488] Make discovery request be shareable
This change sets makes the Send() method more user friendly by enabling the user to use the same request to be sent to multiple peers concurrently. Change-Id: I291af0c9eafe3fc46b5a961285b2c5135294e87f Signed-off-by: yacovm <yacovm@il.ibm.com>
1 parent f3d14f8 commit 4200a5e

File tree

2 files changed

+27
-30
lines changed

2 files changed

+27
-30
lines changed

discovery/client/client.go

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ type Client struct {
2828
lastRequest []byte
2929
lastSignature []byte
3030
createConnection Dialer
31-
authInfo *discovery.AuthInfo
3231
signRequest Signer
3332
}
3433

@@ -110,13 +109,13 @@ func (req *Request) addQueryMapping(queryType discovery.QueryType, key string) {
110109
}
111110

112111
// Send sends the request and returns the response, or error on failure
113-
func (c *Client) Send(ctx context.Context, req *Request) (Response, error) {
114-
req.Authentication = c.authInfo
115-
payload, err := proto.Marshal(req.Request)
112+
func (c *Client) Send(ctx context.Context, req *Request, auth *discovery.AuthInfo) (Response, error) {
113+
reqToBeSent := *req.Request
114+
reqToBeSent.Authentication = auth
115+
payload, err := proto.Marshal(&reqToBeSent)
116116
if err != nil {
117117
return nil, errors.Wrap(err, "failed marshaling Request to bytes")
118118
}
119-
120119
sig := c.lastSignature
121120
// Only sign the Request if it is different than the previous Request sent.
122121
// Otherwise, use the last signature from the previous send.
@@ -140,10 +139,6 @@ func (c *Client) Send(ctx context.Context, req *Request) (Response, error) {
140139
return nil, errors.Wrap(err, "failed connecting to discovery service")
141140
}
142141

143-
defer func() {
144-
req.Queries = nil
145-
}()
146-
147142
cl := discovery.NewDiscoveryClient(conn)
148143
resp, err := cl.Discover(ctx, &discovery.SignedRequest{
149144
Payload: payload,
@@ -472,10 +467,9 @@ type endorsementDescriptor struct {
472467
}
473468

474469
// NewClient creates a new Client instance
475-
func NewClient(createConnection Dialer, authInfo *discovery.AuthInfo, s Signer) *Client {
470+
func NewClient(createConnection Dialer, s Signer) *Client {
476471
return &Client{
477472
createConnection: createConnection,
478-
authInfo: authInfo,
479473
signRequest: s,
480474
}
481475
}

discovery/client/client_test.go

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -290,16 +290,16 @@ func TestClient(t *testing.T) {
290290
signer := func(msg []byte) ([]byte, error) {
291291
return msg, nil
292292
}
293-
294-
cl := NewClient(connect, &discovery.AuthInfo{
293+
authInfo := &discovery.AuthInfo{
295294
ClientIdentity: []byte{1, 2, 3},
296295
ClientTlsCertHash: util.ComputeSHA256(clientTLSCert.Certificate[0]),
297-
}, signer)
296+
}
297+
cl := NewClient(connect, signer)
298298

299299
sup.On("PeersOfChannel").Return(channelPeersWithoutChaincodes).Times(2)
300300
req := NewRequest()
301301
req.OfChannel("mychannel").AddEndorsersQuery("mycc").AddPeersQuery().AddConfigQuery()
302-
r, err := cl.Send(ctx, req)
302+
r, err := cl.Send(ctx, req, authInfo)
303303
assert.NoError(t, err)
304304

305305
// Check behavior for channels that we didn't query for.
@@ -339,7 +339,7 @@ func TestClient(t *testing.T) {
339339
sup.On("PeersOfChannel").Return(channelPeersWithChaincodes).Times(2)
340340
req = NewRequest()
341341
req.OfChannel("mychannel").AddEndorsersQuery("mycc").AddPeersQuery()
342-
r, err = cl.Send(ctx, req)
342+
r, err = cl.Send(ctx, req, authInfo)
343343
assert.NoError(t, err)
344344

345345
mychannel = r.ForChannel("mychannel")
@@ -361,12 +361,13 @@ func TestUnableToSign(t *testing.T) {
361361
failToConnect := func() (*grpc.ClientConn, error) {
362362
return nil, nil
363363
}
364-
cl := NewClient(failToConnect, &discovery.AuthInfo{
364+
authInfo := &discovery.AuthInfo{
365365
ClientIdentity: []byte{1, 2, 3},
366-
}, signer)
366+
}
367+
cl := NewClient(failToConnect, signer)
367368
req := NewRequest()
368369
req = req.OfChannel("mychannel")
369-
resp, err := cl.Send(ctx, req)
370+
resp, err := cl.Send(ctx, req, authInfo)
370371
assert.Nil(t, resp)
371372
assert.Contains(t, err.Error(), "not enough entropy")
372373
}
@@ -378,12 +379,13 @@ func TestUnableToConnect(t *testing.T) {
378379
failToConnect := func() (*grpc.ClientConn, error) {
379380
return nil, errors.New("unable to connect")
380381
}
381-
cl := NewClient(failToConnect, &discovery.AuthInfo{
382+
auth := &discovery.AuthInfo{
382383
ClientIdentity: []byte{1, 2, 3},
383-
}, signer)
384+
}
385+
cl := NewClient(failToConnect, signer)
384386
req := NewRequest()
385387
req = req.OfChannel("mychannel")
386-
resp, err := cl.Send(ctx, req)
388+
resp, err := cl.Send(ctx, req, auth)
387389
assert.Nil(t, resp)
388390
assert.Contains(t, err.Error(), "unable to connect")
389391
}
@@ -400,23 +402,24 @@ func TestBadResponses(t *testing.T) {
400402
return grpc.Dial(fmt.Sprintf("localhost:%d", svc.port), grpc.WithInsecure())
401403
}
402404

403-
cl := NewClient(connect, &discovery.AuthInfo{
405+
auth := &discovery.AuthInfo{
404406
ClientIdentity: []byte{1, 2, 3},
405-
}, signer)
407+
}
408+
cl := NewClient(connect, signer)
406409

407410
// Scenario I: discovery service sends back an error
408411
svc.On("Discover").Return(nil, errors.New("foo")).Once()
409412
req := NewRequest()
410413
req.OfChannel("mychannel").AddEndorsersQuery("mycc").AddPeersQuery().AddConfigQuery()
411-
r, err := cl.Send(ctx, req)
414+
r, err := cl.Send(ctx, req, auth)
412415
assert.Contains(t, err.Error(), "foo")
413416
assert.Nil(t, r)
414417

415418
// Scenario II: discovery service sends back an empty response
416419
svc.On("Discover").Return(&discovery.Response{}, nil).Once()
417420
req = NewRequest()
418421
req.OfChannel("mychannel").AddEndorsersQuery("mycc").AddPeersQuery().AddConfigQuery()
419-
r, err = cl.Send(ctx, req)
422+
r, err = cl.Send(ctx, req, auth)
420423
assert.Equal(t, "Sent 3 queries but received 0 responses back", err.Error())
421424
assert.Nil(t, r)
422425

@@ -438,7 +441,7 @@ func TestBadResponses(t *testing.T) {
438441
}, nil).Once()
439442
req = NewRequest()
440443
req.OfChannel("mychannel").AddEndorsersQuery("mycc")
441-
r, err = cl.Send(ctx, req)
444+
r, err = cl.Send(ctx, req, auth)
442445
assert.NoError(t, err)
443446
mychannel := r.ForChannel("mychannel")
444447
endorsers, err := mychannel.Endorsers("mycc", Selector{})
@@ -455,7 +458,7 @@ func TestBadResponses(t *testing.T) {
455458
}, nil).Once()
456459
req = NewRequest()
457460
req.OfChannel("mychannel").AddEndorsersQuery("mycc")
458-
r, err = cl.Send(ctx, req)
461+
r, err = cl.Send(ctx, req, auth)
459462
assert.Contains(t, err.Error(), "received empty envelope(s) for endorsers for chaincode mycc")
460463
assert.Nil(t, r)
461464

@@ -470,7 +473,7 @@ func TestBadResponses(t *testing.T) {
470473
}, nil).Once()
471474
req = NewRequest()
472475
req.OfChannel("mychannel").AddEndorsersQuery("mycc")
473-
r, err = cl.Send(ctx, req)
476+
r, err = cl.Send(ctx, req, auth)
474477
assert.NoError(t, err)
475478
mychannel = r.ForChannel("mychannel")
476479
endorsers, err = mychannel.Endorsers("mycc", Selector{})
@@ -487,7 +490,7 @@ func TestBadResponses(t *testing.T) {
487490
}, nil).Once()
488491
req = NewRequest()
489492
req.OfChannel("mychannel").AddEndorsersQuery("mycc")
490-
r, err = cl.Send(ctx, req)
493+
r, err = cl.Send(ctx, req, auth)
491494
assert.Contains(t, err.Error(), "group B isn't mapped to endorsers, but exists in a layout")
492495
assert.Empty(t, r)
493496
}

0 commit comments

Comments
 (0)