1
1
/*
2
- Copyright IBM Corp. 2016 All Rights Reserved.
2
+ Copyright IBM Corp. All Rights Reserved.
3
3
4
- Licensed under the Apache License, Version 2.0 (the "License");
5
- you may not use this file except in compliance with the License.
6
- You may obtain a copy of the License at
7
-
8
- http://www.apache.org/licenses/LICENSE-2.0
9
-
10
- Unless required by applicable law or agreed to in writing, software
11
- distributed under the License is distributed on an "AS IS" BASIS,
12
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- See the License for the specific language governing permissions and
14
- limitations under the License.
4
+ SPDX-License-Identifier: Apache-2.0
15
5
*/
16
6
17
7
package producer
@@ -25,6 +15,7 @@ import (
25
15
"github.com/golang/protobuf/proto"
26
16
27
17
"github.com/hyperledger/fabric/common/crypto"
18
+ "github.com/hyperledger/fabric/common/util"
28
19
"github.com/hyperledger/fabric/msp/mgmt"
29
20
pb "github.com/hyperledger/fabric/protos/peer"
30
21
)
@@ -33,20 +24,24 @@ type handler struct {
33
24
ChatStream pb.Events_ChatServer
34
25
interestedEvents map [string ]* pb.Interest
35
26
sessionEndTime time.Time
27
+ RemoteAddr string
36
28
}
37
29
38
30
func newEventHandler (stream pb.Events_ChatServer ) * handler {
39
- d := & handler {
40
- ChatStream : stream ,
31
+ h := & handler {
32
+ ChatStream : stream ,
33
+ interestedEvents : make (map [string ]* pb.Interest ),
34
+ RemoteAddr : util .ExtractRemoteAddress (stream .Context ()),
41
35
}
42
- d . interestedEvents = make ( map [ string ] * pb. Interest )
43
- return d
36
+ logger . Debug ( "event handler created for" , h . RemoteAddr )
37
+ return h
44
38
}
45
39
46
40
// Stop stops this handler
47
- func (d * handler ) Stop () error {
48
- d .deregisterAll ()
49
- d .interestedEvents = nil
41
+ func (h * handler ) Stop () error {
42
+ h .deregisterAll ()
43
+ h .interestedEvents = nil
44
+ logger .Debug ("handler stopped for" , h .RemoteAddr )
50
45
return nil
51
46
}
52
47
@@ -62,83 +57,86 @@ func getInterestKey(interest pb.Interest) string {
62
57
case pb .EventType_CHAINCODE :
63
58
key = "/" + strconv .Itoa (int (pb .EventType_CHAINCODE )) + "/" + interest .GetChaincodeRegInfo ().ChaincodeId + "/" + interest .GetChaincodeRegInfo ().EventName
64
59
default :
65
- logger .Errorf ("unknown interest type %s" , interest .EventType )
60
+ logger .Errorf ("unsupported interest type: %s" , interest .EventType )
66
61
}
67
62
68
63
return key
69
64
}
70
65
71
- func (d * handler ) register (iMsg []* pb.Interest ) error {
66
+ func (h * handler ) register (iMsg []* pb.Interest ) error {
72
67
// Could consider passing interest array to registerHandler
73
68
// and only lock once for entire array here
74
69
for _ , v := range iMsg {
75
- if err := registerHandler (v , d ); err != nil {
76
- logger .Errorf ("could not register %s: %s" , v , err )
70
+ if err := registerHandler (v , h ); err != nil {
71
+ logger .Errorf ("could not register %s for %s : %s" , v , h . RemoteAddr , err )
77
72
continue
78
73
}
79
- d .interestedEvents [getInterestKey (* v )] = v
74
+ h .interestedEvents [getInterestKey (* v )] = v
80
75
}
81
76
82
77
return nil
83
78
}
84
79
85
- func (d * handler ) deregister (iMsg []* pb.Interest ) error {
80
+ func (h * handler ) deregister (iMsg []* pb.Interest ) error {
86
81
for _ , v := range iMsg {
87
- if err := deRegisterHandler (v , d ); err != nil {
88
- logger .Errorf ("could not deregister %s" , v )
82
+ if err := deRegisterHandler (v , h ); err != nil {
83
+ logger .Errorf ("could not deregister %s for %s: %s " , v , h . RemoteAddr , err )
89
84
continue
90
85
}
91
- delete (d .interestedEvents , getInterestKey (* v ))
86
+ delete (h .interestedEvents , getInterestKey (* v ))
92
87
}
93
88
return nil
94
89
}
95
90
96
- func (d * handler ) deregisterAll () {
97
- for k , v := range d .interestedEvents {
98
- if err := deRegisterHandler (v , d ); err != nil {
91
+ func (h * handler ) deregisterAll () {
92
+ for k , v := range h .interestedEvents {
93
+ if err := deRegisterHandler (v , h ); err != nil {
99
94
logger .Errorf ("could not deregister %s" , v )
100
95
continue
101
96
}
102
- delete (d .interestedEvents , k )
97
+ delete (h .interestedEvents , k )
103
98
}
104
99
}
105
100
106
101
// HandleMessage handles the Openchain messages for the Peer.
107
- func (d * handler ) HandleMessage (msg * pb.SignedEvent ) error {
108
- evt , err := d .validateEventMessage (msg )
102
+ func (h * handler ) HandleMessage (msg * pb.SignedEvent ) error {
103
+ evt , err := h .validateEventMessage (msg )
109
104
if err != nil {
110
- return fmt .Errorf ("event message validation failed: [%s]" , err )
105
+ return fmt .Errorf ("event message validation failed for %s: %s" , h . RemoteAddr , err )
111
106
}
112
107
113
108
switch evt .Event .(type ) {
114
109
case * pb.Event_Register :
115
110
eventsObj := evt .GetRegister ()
116
- if err := d .register (eventsObj .Events ); err != nil {
117
- return fmt .Errorf ("could not register events %s" , err )
111
+ if err := h .register (eventsObj .Events ); err != nil {
112
+ return fmt .Errorf ("could not register events for %s: %s" , h . RemoteAddr , err )
118
113
}
119
114
case * pb.Event_Unregister :
120
115
eventsObj := evt .GetUnregister ()
121
- if err := d .deregister (eventsObj .Events ); err != nil {
122
- return fmt .Errorf ("could not unregister events %s" , err )
116
+ if err := h .deregister (eventsObj .Events ); err != nil {
117
+ return fmt .Errorf ("could not deregister events for %s: %s" , h . RemoteAddr , err )
123
118
}
124
119
case nil :
125
120
default :
126
- return fmt .Errorf ("invalid type from client %T" , evt .Event )
121
+ return fmt .Errorf ("invalid event type received from %s: %T" , h . RemoteAddr , evt .Event )
127
122
}
128
123
//TODO return supported events.. for now just return the received msg
129
- if err := d .ChatStream .Send (evt ); err != nil {
130
- return fmt .Errorf ("error sending response to %v: %s" , msg , err )
124
+ if err := h .ChatStream .Send (evt ); err != nil {
125
+ return fmt .Errorf ("error sending response to %s: %s" , h . RemoteAddr , err )
131
126
}
132
127
133
128
return nil
134
129
}
135
130
136
131
// SendMessage sends a message to the remote PEER through the stream
137
- func (d * handler ) SendMessage (msg * pb.Event ) error {
138
- err := d .ChatStream .Send (msg )
132
+ func (h * handler ) SendMessage (msg * pb.Event ) error {
133
+ logger .Debug ("sending event to" , h .RemoteAddr )
134
+ err := h .ChatStream .Send (msg )
139
135
if err != nil {
140
- return fmt .Errorf ("error Sending message through ChatStream: %s" , err )
136
+ logger .Debugf ("sending event failed for %s: %s" , h .RemoteAddr , err )
137
+ return fmt .Errorf ("error sending message through ChatStream: %s" , err )
141
138
}
139
+ logger .Debug ("event sent successfully to" , h .RemoteAddr )
142
140
return nil
143
141
}
144
142
@@ -153,7 +151,7 @@ func (d *handler) SendMessage(msg *pb.Event) error {
153
151
// However, this is not being done for v1.0 due to complexity concerns and the need to complex a stable,
154
152
// minimally viable release. Eventually events will be made channel-specific, at which point this method
155
153
// should be revisited
156
- func (d * handler ) validateEventMessage (signedEvt * pb.SignedEvent ) (* pb.Event , error ) {
154
+ func (h * handler ) validateEventMessage (signedEvt * pb.SignedEvent ) (* pb.Event , error ) {
157
155
logger .Debugf ("validating for signed event %p" , signedEvt )
158
156
159
157
// messages from the client for registering and unregistering must be signed
@@ -168,7 +166,7 @@ func (d *handler) validateEventMessage(signedEvt *pb.SignedEvent) (*pb.Event, er
168
166
if ! expirationTime .IsZero () && time .Now ().After (expirationTime ) {
169
167
return nil , fmt .Errorf ("identity expired" )
170
168
}
171
- d .sessionEndTime = expirationTime
169
+ h .sessionEndTime = expirationTime
172
170
173
171
if evt .GetTimestamp () != nil {
174
172
evtTime := time .Unix (evt .GetTimestamp ().Seconds , int64 (evt .GetTimestamp ().Nanos )).UTC ()
@@ -180,7 +178,7 @@ func (d *handler) validateEventMessage(signedEvt *pb.SignedEvent) (*pb.Event, er
180
178
}
181
179
}
182
180
183
- err = gEventProcessor .BindingInspector (d .ChatStream .Context (), evt )
181
+ err = gEventProcessor .BindingInspector (h .ChatStream .Context (), evt )
184
182
if err != nil {
185
183
return nil , err
186
184
}
@@ -191,18 +189,18 @@ func (d *handler) validateEventMessage(signedEvt *pb.SignedEvent) (*pb.Event, er
191
189
// Load MSPPrincipal for policy
192
190
principal , err := principalGetter .Get (mgmt .Members )
193
191
if err != nil {
194
- return nil , fmt .Errorf ("failed getting local MSP principal [member]: [%s] " , err )
192
+ return nil , fmt .Errorf ("failed getting local MSP principal [member]: %s " , err )
195
193
}
196
194
197
195
id , err := localMSP .DeserializeIdentity (evt .Creator )
198
196
if err != nil {
199
- return nil , fmt .Errorf ("failed deserializing event creator: [%s] " , err )
197
+ return nil , fmt .Errorf ("failed deserializing event creator: %s " , err )
200
198
}
201
199
202
200
// Verify that event's creator satisfies the principal
203
201
err = id .SatisfiesPrincipal (principal )
204
202
if err != nil {
205
- return nil , fmt .Errorf ("failed verifying the creator satisfies local MSP's [member] principal: [%s] " , err )
203
+ return nil , fmt .Errorf ("failed verifying the creator satisfies local MSP's [member] principal: %s " , err )
206
204
}
207
205
208
206
// Verify the signature
0 commit comments