@@ -150,10 +150,29 @@ type GossipStateProviderImpl struct {
150
150
stateTransferActive int32
151
151
152
152
stateMetrics * metrics.StateMetrics
153
+
154
+ requestValidator * stateRequestValidator
153
155
}
154
156
155
157
var logger = util .GetLogger (util .StateLogger , "" )
156
158
159
+ // stateRequestValidator facilitates validation of the state request messages
160
+ type stateRequestValidator struct {
161
+ }
162
+
163
+ // validate checks for RemoteStateRequest message validity
164
+ func (v * stateRequestValidator ) validate (request * proto.RemoteStateRequest ) error {
165
+ if request .StartSeqNum > request .EndSeqNum {
166
+ return errors .Errorf ("Invalid sequence interval [%d...%d)." , request .StartSeqNum , request .EndSeqNum )
167
+ }
168
+
169
+ if request .EndSeqNum > defAntiEntropyBatchSize + request .StartSeqNum {
170
+ return errors .Errorf ("Requesting blocks range [%d-%d) greater than configured allowed" +
171
+ " (%d) batching size for anti-entropy." , request .StartSeqNum , request .EndSeqNum , defAntiEntropyBatchSize )
172
+ }
173
+ return nil
174
+ }
175
+
157
176
// NewGossipStateProvider creates state provider with coordinator instance
158
177
// to orchestrate arrival of private rwsets and blocks before committing them into the ledger.
159
178
func NewGossipStateProvider (chainID string , services * ServicesMediator , ledger ledgerResources , stateMetrics * metrics.StateMetrics ) GossipStateProvider {
@@ -233,6 +252,8 @@ func NewGossipStateProvider(chainID string, services *ServicesMediator, ledger l
233
252
once : sync.Once {},
234
253
235
254
stateMetrics : stateMetrics ,
255
+
256
+ requestValidator : & stateRequestValidator {},
236
257
}
237
258
238
259
logger .Infof ("Updating metadata information, " +
@@ -391,21 +412,14 @@ func (s *GossipStateProviderImpl) handleStateRequest(msg proto.ReceivedMessage)
391
412
}
392
413
request := msg .GetGossipMessage ().GetStateRequest ()
393
414
394
- batchSize := request .EndSeqNum - request .StartSeqNum
395
- if batchSize > defAntiEntropyBatchSize {
396
- logger .Errorf ("Requesting blocks batchSize size (%d) greater than configured allowed" +
397
- " (%d) batching for anti-entropy. Ignoring request..." , batchSize , defAntiEntropyBatchSize )
398
- return
399
- }
400
-
401
- if request .StartSeqNum > request .EndSeqNum {
402
- logger .Errorf ("Invalid sequence interval [%d...%d], ignoring request..." , request .StartSeqNum , request .EndSeqNum )
415
+ if err := s .requestValidator .validate (request ); err != nil {
416
+ logger .Errorf ("State request validation failed, %s. Ignoring request..." , err )
403
417
return
404
418
}
405
419
406
420
currentHeight , err := s .ledger .LedgerHeight ()
407
421
if err != nil {
408
- logger .Errorf ("Cannot access to current ledger height, due to %+v" , errors . WithStack ( err ) )
422
+ logger .Errorf ("Cannot access to current ledger height, due to %+v" , err )
409
423
return
410
424
}
411
425
if currentHeight < request .EndSeqNum {
0 commit comments