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

Commit 8f5d6f4

Browse files
committed
[FAB-8839] Use connection cache in event client
The deliver and event hub client now use the connection cache. Change-Id: Iab7906eb006de4a27e97ab5de386077aa71ab99e Signed-off-by: Bob Stasyszyn <Bob.Stasyszyn@securekey.com>
1 parent cc87976 commit 8f5d6f4

File tree

6 files changed

+84
-22
lines changed

6 files changed

+84
-22
lines changed

pkg/fab/comm/connection.go

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@ SPDX-License-Identifier: Apache-2.0
77
package comm
88

99
import (
10-
"context"
10+
reqContext "context"
1111
"sync/atomic"
1212

1313
"github.com/pkg/errors"
1414

1515
fabcontext "github.com/hyperledger/fabric-sdk-go/pkg/common/context"
1616
"github.com/hyperledger/fabric-sdk-go/pkg/common/options"
17+
"github.com/hyperledger/fabric-sdk-go/pkg/context"
1718
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
1819
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
1920
"github.com/hyperledger/fabric-sdk-go/pkg/core/config/comm"
@@ -34,6 +35,7 @@ type GRPCConnection struct {
3435
chConfig fab.ChannelCfg
3536
conn *grpc.ClientConn
3637
stream grpc.ClientStream
38+
commManager fab.CommManager
3739
tlsCertHash []byte
3840
done int32
3941
}
@@ -52,20 +54,22 @@ func NewConnection(ctx fabcontext.Client, chConfig fab.ChannelCfg, streamProvide
5254
return nil, err
5355
}
5456

55-
grpcctx := context.Background()
56-
grpcctx, cancel := context.WithTimeout(grpcctx, params.connectTimeout)
57+
reqCtx, cancel := reqContext.WithTimeout(context.NewRequest(ctx), params.connectTimeout)
5758
defer cancel()
5859

59-
grpcconn, err := grpc.DialContext(grpcctx, endpoint.ToAddress(url), dialOpts...)
60+
commManager, ok := context.RequestCommManager(reqCtx)
61+
if !ok {
62+
return nil, errors.New("unable to get comm manager")
63+
}
64+
65+
grpcconn, err := commManager.DialContext(reqCtx, endpoint.ToAddress(url), dialOpts...)
6066
if err != nil {
6167
return nil, errors.Wrapf(err, "could not connect to %s", url)
6268
}
6369

6470
stream, err := streamProvider(grpcconn)
6571
if err != nil {
66-
if closeErr := grpcconn.Close(); closeErr != nil {
67-
logger.Warnf("error closing GRPC connection: %s", closeErr)
68-
}
72+
commManager.ReleaseConn(grpcconn)
6973
return nil, errors.Wrapf(err, "could not create stream to %s", url)
7074
}
7175

@@ -76,6 +80,7 @@ func NewConnection(ctx fabcontext.Client, chConfig fab.ChannelCfg, streamProvide
7680
return &GRPCConnection{
7781
context: ctx,
7882
chConfig: chConfig,
83+
commManager: commManager,
7984
conn: grpcconn,
8085
stream: stream,
8186
tlsCertHash: comm.TLSCertHash(ctx.Config()),
@@ -94,15 +99,15 @@ func (c *GRPCConnection) Close() {
9499
return
95100
}
96101

97-
logger.Debugf("Closing stream....")
102+
logger.Debug("Closing stream....")
98103
if err := c.stream.CloseSend(); err != nil {
99104
logger.Warnf("error closing GRPC stream: %s", err)
100105
}
101106

102-
logger.Debugf("Closing connection....")
103-
if err := c.conn.Close(); err != nil {
104-
logger.Warnf("error closing GRPC connection: %s", err)
105-
}
107+
logger.Debug("Releasing connection....")
108+
c.commManager.ReleaseConn(c.conn)
109+
110+
logger.Debug("... connection successfully closed.")
106111
}
107112

108113
// Closed returns true if the connection has been closed

pkg/fab/comm/connection_test.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313

1414
"google.golang.org/grpc/keepalive"
1515

16-
fabcontext "github.com/hyperledger/fabric-sdk-go/pkg/common/context"
1716
eventmocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/events/mocks"
1817
fabmocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
1918

@@ -43,6 +42,7 @@ func TestConnection(t *testing.T) {
4342
_, err = NewConnection(context, chConfig, testStream, "invalidhost:0000",
4443
WithFailFast(true),
4544
WithCertificate(nil),
45+
WithInsecure(),
4646
WithHostOverride(""),
4747
WithKeepAliveParams(keepalive.ClientParameters{}),
4848
WithConnectTimeout(3*time.Second),
@@ -80,10 +80,12 @@ func TestConnection(t *testing.T) {
8080
conn.Close()
8181
}
8282

83-
// Use the Deliver server for testing
83+
// Use the Event Hub server for testing
8484
var testServer *eventmocks.MockEventhubServer
8585
var endorserAddr []string
8686

87-
func newMockContext() fabcontext.Client {
88-
return fabmocks.NewMockContext(fabmocks.NewMockUser("test"))
87+
func newMockContext() *fabmocks.MockContext {
88+
context := fabmocks.NewMockContext(fabmocks.NewMockUser("test"))
89+
context.SetCustomInfraProvider(NewMockInfraProvider())
90+
return context
8991
}

pkg/fab/comm/mocks.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
/*
2+
Copyright SecureKey Technologies Inc. All Rights Reserved.
3+
4+
SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
package comm
8+
9+
import (
10+
"context"
11+
12+
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/fab"
13+
fabmocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
14+
"google.golang.org/grpc"
15+
)
16+
17+
// MockCommManager is a non-caching comm manager used
18+
// for unit testing
19+
type MockCommManager struct {
20+
}
21+
22+
// DialContext creates a connection
23+
func (m *MockCommManager) DialContext(ctx context.Context, target string, opts ...grpc.DialOption) (*grpc.ClientConn, error) {
24+
return grpc.DialContext(ctx, target, opts...)
25+
}
26+
27+
// ReleaseConn closes the connection
28+
func (m *MockCommManager) ReleaseConn(conn *grpc.ClientConn) {
29+
if err := conn.Close(); err != nil {
30+
logger.Warnf("Error closing connection: %s", err)
31+
}
32+
}
33+
34+
// MockInfraProvider overrides the comm manager to return
35+
// the MockCommManager
36+
type MockInfraProvider struct {
37+
fabmocks.MockInfraProvider
38+
}
39+
40+
// NewMockInfraProvider return a new MockInfraProvider
41+
func NewMockInfraProvider() *MockInfraProvider {
42+
return &MockInfraProvider{}
43+
}
44+
45+
// CommManager returns the MockCommManager
46+
func (f *MockInfraProvider) CommManager() fab.CommManager {
47+
return &MockCommManager{}
48+
}

pkg/fab/events/deliverclient/connection/connection_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,5 +220,7 @@ func TestMain(m *testing.M) {
220220
}
221221

222222
func newMockContext() *fabmocks.MockContext {
223-
return fabmocks.NewMockContext(fabmocks.NewMockUser("user1"))
223+
context := fabmocks.NewMockContext(fabmocks.NewMockUser("user1"))
224+
context.SetCustomInfraProvider(comm.NewMockInfraProvider())
225+
return context
224226
}

pkg/fab/events/eventhubclient/connection/connection_test.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ import (
1313
"testing"
1414
"time"
1515

16-
fabcontext "github.com/hyperledger/fabric-sdk-go/pkg/common/context"
1716
"github.com/hyperledger/fabric-sdk-go/pkg/context/api/core"
17+
"github.com/hyperledger/fabric-sdk-go/pkg/fab/comm"
1818
clientdisp "github.com/hyperledger/fabric-sdk-go/pkg/fab/events/client/dispatcher"
1919
eventmocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/events/mocks"
2020
fabmocks "github.com/hyperledger/fabric-sdk-go/pkg/fab/mocks"
@@ -198,6 +198,8 @@ func newPeerConfig(eventURL string) *core.PeerConfig {
198198
}
199199
}
200200

201-
func newMockContext() fabcontext.Client {
202-
return fabmocks.NewMockContext(fabmocks.NewMockUser("user1"))
201+
func newMockContext() *fabmocks.MockContext {
202+
context := fabmocks.NewMockContext(fabmocks.NewMockUser("user1"))
203+
context.SetCustomInfraProvider(comm.NewMockInfraProvider())
204+
return context
203205
}

pkg/fabsdk/provider/fabpvdr/fabpvdr.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,13 @@ func (f *InfraProvider) Initialize(providers context.Providers) error {
8383

8484
// Close frees resources and caches.
8585
func (f *InfraProvider) Close() {
86-
logger.Debug("Closing comm manager...")
87-
f.commManager.Close()
8886
logger.Debug("Closing event service cache...")
8987
f.eventServiceCache.Close()
88+
89+
// Comm Manager must be closed last since other resources
90+
// may still be using it.
91+
logger.Debug("Closing comm manager...")
92+
f.commManager.Close()
9093
}
9194

9295
// CommManager provides comm support such as GRPC onnections

0 commit comments

Comments
 (0)