@@ -84,129 +84,142 @@ func (ds *deliverServer) Handle(srv ab.AtomicBroadcast_DeliverServer) error {
84
84
return err
85
85
}
86
86
87
- payload , err := utils .UnmarshalPayload (envelope .Payload )
88
- if err != nil {
89
- logger .Warningf ("Received an envelope with no payload: %s" , err )
90
- return sendStatusReply (srv , cb .Status_BAD_REQUEST )
91
- }
92
-
93
- if payload .Header == nil {
94
- logger .Warningf ("Malformed envelope received with bad header" )
95
- return sendStatusReply (srv , cb .Status_BAD_REQUEST )
87
+ if err := ds .deliverBlocks (srv , envelope ); err != nil {
88
+ return err
96
89
}
97
90
98
- chdr , err := utils .UnmarshalChannelHeader (payload .Header .ChannelHeader )
99
- if err != nil {
100
- logger .Warningf ("Failed to unmarshal channel header: %s" , err )
101
- return sendStatusReply (srv , cb .Status_BAD_REQUEST )
102
- }
91
+ logger .Debugf ("Waiting for new SeekInfo" )
92
+ }
93
+ }
103
94
104
- chain , ok := ds .sm .GetChain (chdr .ChannelId )
105
- if ! ok {
106
- // Note, we log this at DEBUG because SDKs will poll waiting for channels to be created
107
- // So we would expect our log to be somewhat flooded with these
108
- logger .Debugf ("Rejecting deliver because channel %s not found" , chdr .ChannelId )
109
- return sendStatusReply (srv , cb .Status_NOT_FOUND )
110
- }
95
+ func (ds * deliverServer ) deliverBlocks (srv ab.AtomicBroadcast_DeliverServer , envelope * cb.Envelope ) error {
111
96
112
- erroredChan := chain .Errored ()
113
- select {
114
- case <- erroredChan :
115
- logger .Warningf ("[channel: %s] Rejecting deliver request because of consenter error" , chdr .ChannelId )
116
- return sendStatusReply (srv , cb .Status_SERVICE_UNAVAILABLE )
117
- default :
97
+ payload , err := utils .UnmarshalPayload (envelope .Payload )
98
+ if err != nil {
99
+ logger .Warningf ("Received an envelope with no payload: %s" , err )
100
+ return sendStatusReply (srv , cb .Status_BAD_REQUEST )
101
+ }
118
102
119
- }
103
+ if payload .Header == nil {
104
+ logger .Warningf ("Malformed envelope received with bad header" )
105
+ return sendStatusReply (srv , cb .Status_BAD_REQUEST )
106
+ }
120
107
121
- lastConfigSequence := chain .Sequence ()
108
+ chdr , err := utils .UnmarshalChannelHeader (payload .Header .ChannelHeader )
109
+ if err != nil {
110
+ logger .Warningf ("Failed to unmarshal channel header: %s" , err )
111
+ return sendStatusReply (srv , cb .Status_BAD_REQUEST )
112
+ }
122
113
123
- sf := sigfilter .New (policies .ChannelReaders , chain .PolicyManager ())
124
- result , _ := sf .Apply (envelope )
125
- if result != filter .Forward {
126
- logger .Warningf ("[channel: %s] Received unauthorized deliver request" , chdr .ChannelId )
127
- return sendStatusReply (srv , cb .Status_FORBIDDEN )
128
- }
114
+ chain , ok := ds .sm .GetChain (chdr .ChannelId )
115
+ if ! ok {
116
+ // Note, we log this at DEBUG because SDKs will poll waiting for channels to be created
117
+ // So we would expect our log to be somewhat flooded with these
118
+ logger .Debugf ("Rejecting deliver because channel %s not found" , chdr .ChannelId )
119
+ return sendStatusReply (srv , cb .Status_NOT_FOUND )
120
+ }
129
121
130
- seekInfo := & ab.SeekInfo {}
131
- if err = proto .Unmarshal (payload .Data , seekInfo ); err != nil {
132
- logger .Warningf ("[channel: %s] Received a signed deliver request with malformed seekInfo payload: %s" , chdr .ChannelId , err )
133
- return sendStatusReply (srv , cb .Status_BAD_REQUEST )
134
- }
122
+ erroredChan := chain .Errored ()
123
+ select {
124
+ case <- erroredChan :
125
+ logger .Warningf ("[channel: %s] Rejecting deliver request because of consenter error" , chdr .ChannelId )
126
+ return sendStatusReply (srv , cb .Status_SERVICE_UNAVAILABLE )
127
+ default :
135
128
136
- if seekInfo .Start == nil || seekInfo .Stop == nil {
137
- logger .Warningf ("[channel: %s] Received seekInfo message with missing start or stop %v, %v" , chdr .ChannelId , seekInfo .Start , seekInfo .Stop )
138
- return sendStatusReply (srv , cb .Status_BAD_REQUEST )
139
- }
129
+ }
140
130
141
- logger .Debugf ("[channel: %s] Received seekInfo (%p) %v" , chdr .ChannelId , seekInfo , seekInfo )
142
-
143
- cursor , number := chain .Reader ().Iterator (seekInfo .Start )
144
- var stopNum uint64
145
- switch stop := seekInfo .Stop .Type .(type ) {
146
- case * ab.SeekPosition_Oldest :
147
- stopNum = number
148
- case * ab.SeekPosition_Newest :
149
- stopNum = chain .Reader ().Height () - 1
150
- case * ab.SeekPosition_Specified :
151
- stopNum = stop .Specified .Number
152
- if stopNum < number {
153
- logger .Warningf ("[channel: %s] Received invalid seekInfo message: start number %d greater than stop number %d" , chdr .ChannelId , number , stopNum )
154
- return sendStatusReply (srv , cb .Status_BAD_REQUEST )
155
- }
156
- }
131
+ lastConfigSequence := chain .Sequence ()
157
132
158
- for {
159
- if seekInfo .Behavior == ab .SeekInfo_BLOCK_UNTIL_READY {
160
- select {
161
- case <- erroredChan :
162
- logger .Warningf ("[channel: %s] Aborting deliver request because of consenter error" , chdr .ChannelId )
163
- return sendStatusReply (srv , cb .Status_SERVICE_UNAVAILABLE )
164
- case <- cursor .ReadyChan ():
165
- }
166
- } else {
167
- select {
168
- case <- cursor .ReadyChan ():
169
- default :
170
- return sendStatusReply (srv , cb .Status_NOT_FOUND )
171
- }
172
- }
133
+ sf := sigfilter .New (policies .ChannelReaders , chain .PolicyManager ())
134
+ result , _ := sf .Apply (envelope )
135
+ if result != filter .Forward {
136
+ logger .Warningf ("[channel: %s] Received unauthorized deliver request" , chdr .ChannelId )
137
+ return sendStatusReply (srv , cb .Status_FORBIDDEN )
138
+ }
173
139
174
- currentConfigSequence := chain .Sequence ()
175
- if currentConfigSequence > lastConfigSequence {
176
- lastConfigSequence = currentConfigSequence
177
- sf := sigfilter .New (policies .ChannelReaders , chain .PolicyManager ())
178
- result , _ := sf .Apply (envelope )
179
- if result != filter .Forward {
180
- logger .Warningf ("[channel: %s] Client authorization revoked for deliver request" , chdr .ChannelId )
181
- return sendStatusReply (srv , cb .Status_FORBIDDEN )
182
- }
183
- }
140
+ seekInfo := & ab.SeekInfo {}
141
+ if err = proto .Unmarshal (payload .Data , seekInfo ); err != nil {
142
+ logger .Warningf ("[channel: %s] Received a signed deliver request with malformed seekInfo payload: %s" , chdr .ChannelId , err )
143
+ return sendStatusReply (srv , cb .Status_BAD_REQUEST )
144
+ }
184
145
185
- block , status := cursor .Next ()
186
- if status != cb .Status_SUCCESS {
187
- logger .Errorf ("[channel: %s] Error reading from channel, cause was: %v" , chdr .ChannelId , status )
188
- return sendStatusReply (srv , status )
189
- }
146
+ if seekInfo .Start == nil || seekInfo .Stop == nil {
147
+ logger .Warningf ("[channel: %s] Received seekInfo message with missing start or stop %v, %v" , chdr .ChannelId , seekInfo .Start , seekInfo .Stop )
148
+ return sendStatusReply (srv , cb .Status_BAD_REQUEST )
149
+ }
190
150
191
- logger .Debugf ("[channel: %s] Delivering block for (%p)" , chdr .ChannelId , seekInfo )
151
+ logger .Debugf ("[channel: %s] Received seekInfo (%p) %v" , chdr .ChannelId , seekInfo , seekInfo )
152
+
153
+ cursor , number := chain .Reader ().Iterator (seekInfo .Start )
154
+ defer cursor .Close ()
155
+ var stopNum uint64
156
+ switch stop := seekInfo .Stop .Type .(type ) {
157
+ case * ab.SeekPosition_Oldest :
158
+ stopNum = number
159
+ case * ab.SeekPosition_Newest :
160
+ stopNum = chain .Reader ().Height () - 1
161
+ case * ab.SeekPosition_Specified :
162
+ stopNum = stop .Specified .Number
163
+ if stopNum < number {
164
+ logger .Warningf ("[channel: %s] Received invalid seekInfo message: start number %d greater than stop number %d" , chdr .ChannelId , number , stopNum )
165
+ return sendStatusReply (srv , cb .Status_BAD_REQUEST )
166
+ }
167
+ }
192
168
193
- if err := sendBlockReply (srv , block ); err != nil {
194
- logger .Warningf ("[channel: %s] Error sending to stream: %s" , chdr .ChannelId , err )
195
- return err
169
+ for {
170
+ if seekInfo .Behavior == ab .SeekInfo_BLOCK_UNTIL_READY {
171
+ select {
172
+ case <- erroredChan :
173
+ logger .Warningf ("[channel: %s] Aborting deliver request because of consenter error" , chdr .ChannelId )
174
+ return sendStatusReply (srv , cb .Status_SERVICE_UNAVAILABLE )
175
+ case <- cursor .ReadyChan ():
196
176
}
177
+ } else {
178
+ select {
179
+ case <- cursor .ReadyChan ():
180
+ default :
181
+ return sendStatusReply (srv , cb .Status_NOT_FOUND )
182
+ }
183
+ }
197
184
198
- if stopNum == block .Header .Number {
199
- break
185
+ currentConfigSequence := chain .Sequence ()
186
+ if currentConfigSequence > lastConfigSequence {
187
+ lastConfigSequence = currentConfigSequence
188
+ sf := sigfilter .New (policies .ChannelReaders , chain .PolicyManager ())
189
+ result , _ := sf .Apply (envelope )
190
+ if result != filter .Forward {
191
+ logger .Warningf ("[channel: %s] Client authorization revoked for deliver request" , chdr .ChannelId )
192
+ return sendStatusReply (srv , cb .Status_FORBIDDEN )
200
193
}
201
194
}
202
195
203
- if err := sendStatusReply (srv , cb .Status_SUCCESS ); err != nil {
196
+ block , status := cursor .Next ()
197
+ if status != cb .Status_SUCCESS {
198
+ logger .Errorf ("[channel: %s] Error reading from channel, cause was: %v" , chdr .ChannelId , status )
199
+ return sendStatusReply (srv , status )
200
+ }
201
+
202
+ logger .Debugf ("[channel: %s] Delivering block for (%p)" , chdr .ChannelId , seekInfo )
203
+
204
+ if err := sendBlockReply (srv , block ); err != nil {
204
205
logger .Warningf ("[channel: %s] Error sending to stream: %s" , chdr .ChannelId , err )
205
206
return err
206
207
}
207
208
208
- logger .Debugf ("[channel: %s] Done delivering for (%p), waiting for new SeekInfo" , chdr .ChannelId , seekInfo )
209
+ if stopNum == block .Header .Number {
210
+ break
211
+ }
209
212
}
213
+
214
+ if err := sendStatusReply (srv , cb .Status_SUCCESS ); err != nil {
215
+ logger .Warningf ("[channel: %s] Error sending to stream: %s" , chdr .ChannelId , err )
216
+ return err
217
+ }
218
+
219
+ logger .Debugf ("[channel: %s] Done delivering for (%p)" , chdr .ChannelId , seekInfo )
220
+
221
+ return nil
222
+
210
223
}
211
224
212
225
func sendStatusReply (srv ab.AtomicBroadcast_DeliverServer , status cb.Status ) error {
0 commit comments