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

Commit d6d3fe0

Browse files
committed
[FAB-3999] EventHub client reconnect fix
Modified EventHub Disconnect to perform a synchronous unregister. Change-Id: I478036a4ed5e5a84a6e76bed5f44bd9e93d838e1 Signed-off-by: Troy Ronda <troy@troyronda.com>
1 parent 061e0e0 commit d6d3fe0

File tree

5 files changed

+49
-29
lines changed

5 files changed

+49
-29
lines changed

fabric-client/events/consumer/consumer.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ const defaultTimeout = time.Second * 3
4141
type EventsClient interface {
4242
RegisterAsync(ies []*ehpb.Interest) error
4343
UnregisterAsync(ies []*ehpb.Interest) error
44+
Unregister(ies []*ehpb.Interest) error
4445
Recv() (*ehpb.Event, error)
4546
Start() error
4647
Stop() error
@@ -151,7 +152,7 @@ func (ec *eventsClient) UnregisterAsync(ies []*ehpb.Interest) error {
151152
}
152153

153154
// unregister - unregisters interest in a event
154-
func (ec *eventsClient) unregister(ies []*ehpb.Interest) error {
155+
func (ec *eventsClient) Unregister(ies []*ehpb.Interest) error {
155156
var err error
156157
if err = ec.UnregisterAsync(ies); err != nil {
157158
return err

fabric-client/events/eventhub.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,8 +164,9 @@ func (eventHub *eventHub) Disconnect() {
164164
}
165165

166166
// Unregister interests with server and stop the stream
167-
eventHub.client.UnregisterAsync(eventHub.interestedEvents)
167+
eventHub.client.Unregister(eventHub.interestedEvents)
168168
eventHub.client.Stop()
169+
169170
eventHub.connected = false
170171
}
171172

@@ -175,6 +176,8 @@ func (eventHub *eventHub) RegisterBlockEvent(callback func(*common.Block)) {
175176
defer eventHub.mtx.Unlock()
176177

177178
eventHub.blockRegistrants = append(eventHub.blockRegistrants, callback)
179+
180+
// Register interest for blocks (only declare interest once, so do this for the first registrant)
178181
if len(eventHub.blockRegistrants) == 1 {
179182
eventHub.interestedEvents = append(eventHub.interestedEvents, &pb.Interest{EventType: pb.EventType_BLOCK})
180183
}
@@ -195,6 +198,7 @@ func (eventHub *eventHub) UnregisterBlockEvent(callback func(*common.Block)) {
195198
}
196199
}
197200

201+
// Unregister interest for blocks if there are no more registrants
198202
if len(eventHub.blockRegistrants) < 1 {
199203
blockEventInterest := pb.Interest{EventType: pb.EventType_BLOCK}
200204
eventHub.client.UnregisterAsync([]*pb.Interest{&blockEventInterest})

fabric-client/events/eventmocks.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ func (mec *mockEventClient) UnregisterAsync(ies []*pb.Interest) error {
9595
return nil
9696
}
9797

98+
// Unregister does not unregister anything anywhere but acts like all is well
99+
func (mec *mockEventClient) Unregister(ies []*pb.Interest) error {
100+
return mec.UnregisterAsync(ies)
101+
}
102+
98103
// Recv will return mock events sent to the event channel. Warning! This might block indefinitely
99104
func (mec *mockEventClient) Recv() (*pb.Event, error) {
100105
event := <-mec.events

test/integration/base_test_setup.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,16 @@ func (setup *BaseSetupImpl) Initialize() error {
8686
return fmt.Errorf("CreateAndJoinChannel return error: %v", err)
8787
}
8888

89+
if err := setup.setupEventHub(); err != nil {
90+
return err
91+
}
92+
93+
setup.Initialized = true
94+
95+
return nil
96+
}
97+
98+
func (setup *BaseSetupImpl) setupEventHub() error {
8999
eventHub, err := getEventHub()
90100
if err != nil {
91101
return err
@@ -98,8 +108,6 @@ func (setup *BaseSetupImpl) Initialize() error {
98108
}
99109
setup.EventHub = eventHub
100110

101-
setup.Initialized = true
102-
103111
return nil
104112
}
105113

test/integration/events_test.go

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ limitations under the License.
2020
package integration
2121

2222
import (
23-
"fmt"
2423
"testing"
2524
"time"
2625

@@ -31,7 +30,15 @@ import (
3130
)
3231

3332
func TestEvents(t *testing.T) {
33+
testSetup := initializeTests(t)
3434

35+
testFailedTx(t, testSetup)
36+
testFailedTxErrorCode(t, testSetup)
37+
testReconnectEventHub(t, testSetup)
38+
testMultipleBlockEventCallbacks(t, testSetup)
39+
}
40+
41+
func initializeTests(t *testing.T) BaseSetupImpl {
3542
testSetup := BaseSetupImpl{
3643
ConfigFile: "../fixtures/config/config_test.yaml",
3744
ChainID: "testchannel",
@@ -54,22 +61,7 @@ func TestEvents(t *testing.T) {
5461
t.Fatalf("instantiateCC return error: %v", err)
5562
}
5663

57-
testFailedTx(t, testSetup)
58-
59-
testFailedTxErrorCode(t, testSetup)
60-
// Test disconnect event hub
61-
testSetup.EventHub.Disconnect()
62-
if testSetup.EventHub.IsConnected() {
63-
t.Fatalf("Failed to disconnect event hub")
64-
}
65-
66-
// Reconnect event hub
67-
if err := testSetup.EventHub.Connect(); err != nil {
68-
t.Fatalf("Failed to connect event hub")
69-
}
70-
71-
testMultipleBlockEventCallbacks(t, testSetup)
72-
64+
return testSetup
7365
}
7466

7567
func testFailedTx(t *testing.T, testSetup BaseSetupImpl) {
@@ -121,11 +113,9 @@ func testFailedTx(t *testing.T, testSetup BaseSetupImpl) {
121113
t.Fatalf("invoke Didn't receive block event for txid1(%s) or txid1(%s)", tx1, tx2)
122114
}
123115
}
124-
125116
}
126117

127118
func testFailedTxErrorCode(t *testing.T, testSetup BaseSetupImpl) {
128-
129119
// Arguments for events CC
130120
var args []string
131121
args = append(args, "invoke")
@@ -190,7 +180,7 @@ func testFailedTxErrorCode(t *testing.T, testSetup BaseSetupImpl) {
190180
t.Fatalf("Received success for second invoke")
191181
case <-fail2:
192182
// success
193-
fmt.Println("Received error validation Code ", errorValidationCode)
183+
t.Logf("Received error validation code %s", errorValidationCode.String())
194184
if errorValidationCode.String() != "MVCC_READ_CONFLICT" {
195185
t.Fatalf("Expected error code MVCC_READ_CONFLICT")
196186
}
@@ -202,8 +192,20 @@ func testFailedTxErrorCode(t *testing.T, testSetup BaseSetupImpl) {
202192

203193
}
204194

205-
func testMultipleBlockEventCallbacks(t *testing.T, testSetup BaseSetupImpl) {
195+
func testReconnectEventHub(t *testing.T, testSetup BaseSetupImpl) {
196+
// Test disconnect event hub
197+
testSetup.EventHub.Disconnect()
198+
if testSetup.EventHub.IsConnected() {
199+
t.Fatalf("Failed to disconnect event hub")
200+
}
206201

202+
// Reconnect event hub
203+
if err := testSetup.EventHub.Connect(); err != nil {
204+
t.Fatalf("Failed to connect event hub")
205+
}
206+
}
207+
208+
func testMultipleBlockEventCallbacks(t *testing.T, testSetup BaseSetupImpl) {
207209
// Arguments for events CC
208210
var args []string
209211
args = append(args, "invoke")
@@ -213,13 +215,13 @@ func testMultipleBlockEventCallbacks(t *testing.T, testSetup BaseSetupImpl) {
213215
// Create and register test callback that will be invoked upon block event
214216
test := make(chan bool)
215217
testSetup.EventHub.RegisterBlockEvent(func(block *common.Block) {
216-
fmt.Println("Invoked test callback on block event")
218+
t.Logf("Received test callback on block event")
217219
test <- true
218220
})
219221

220222
tpResponses, tx, err := fcUtil.CreateAndSendTransactionProposal(testSetup.Chain, testSetup.ChainCodeID, testSetup.ChainID, args, []fabricClient.Peer{testSetup.Chain.GetPrimaryPeer()}, nil)
221223
if err != nil {
222-
t.Fatalf("CreateAndSendTransactionProposal return error: %v \n", err)
224+
t.Fatalf("CreateAndSendTransactionProposal returned error: %v \n", err)
223225
}
224226

225227
// Register tx for commit/block event(s)
@@ -228,7 +230,7 @@ func testMultipleBlockEventCallbacks(t *testing.T, testSetup BaseSetupImpl) {
228230

229231
_, err = fcUtil.CreateAndSendTransaction(testSetup.Chain, tpResponses)
230232
if err != nil {
231-
t.Fatalf("First invoke failed err: %v", err)
233+
t.Fatalf("CreateAndSendTransaction failed with error: %v", err)
232234
}
233235

234236
for i := 0; i < 2; i++ {
@@ -237,7 +239,7 @@ func testMultipleBlockEventCallbacks(t *testing.T, testSetup BaseSetupImpl) {
237239
case <-fail:
238240
case <-test:
239241
case <-time.After(time.Second * 30):
240-
t.Fatalf("invoke Didn't receive test callback event")
242+
t.Fatalf("Didn't receive test callback event")
241243
}
242244
}
243245

0 commit comments

Comments
 (0)