@@ -47,7 +47,7 @@ class SyncTask(object):
47
47
initial_blockheaders_per_request = 32
48
48
max_blockheaders_per_request = 192
49
49
max_skeleton_size = 128
50
- blockheaders_request_timeout = 15 .
50
+ blockheaders_request_timeout = 20 .
51
51
max_retries = 3
52
52
retry_delay = 2.
53
53
blocks_request_timeout = 16.
@@ -210,10 +210,15 @@ def fetch_headerbatch(self,origin,skeleton):
210
210
self .headertask_queue .put ((request .start ,request .start ))
211
211
log_st .debug ('timeouted request' ,
212
212
start = request .start ,proto = proto )
213
+ # if failed header requests> 2 else set it idle try one more time,
214
+ # if len(request.headers) > 2:
215
+ proto .idle = True
216
+ # else:
217
+ # proto.stop()
213
218
del self .pending_headerRequests [proto ]
214
- # if overtimes> 2 else set it idle try one more time,
215
- # proto.idle = True
216
- proto . stop ()
219
+
220
+
221
+
217
222
218
223
log_st .debug ('header task queue size, pending queue size, batch_requestsize' ,size = self .headertask_queue .qsize (),pending = len (self .pending_headerRequests ),batch_request = len (self .batch_requests ))
219
224
#if self.headertask_queue.qsize == 0 and len(self.pending_headerRequests)==0 and len(self.batch_requests)==0 :
@@ -249,8 +254,8 @@ def fetch_headerbatch(self,origin,skeleton):
249
254
continue
250
255
try :
251
256
proto_received = deferred .get (timeout = self .blockheaders_request_timeout )['proto' ]
252
- header = deferred .get (timeout = self .blockheaders_request_timeout )['headers' ]
253
- log_st .debug ('headers batch received from proto' , header = header )
257
+ headers = deferred .get (timeout = self .blockheaders_request_timeout )['headers' ]
258
+ log_st .debug ('headers batch received from proto' , header = headers )
254
259
except gevent .Timeout :
255
260
log_st .warn ('syncing batch hashchain timed out' )
256
261
retry += 1
@@ -266,34 +271,35 @@ def fetch_headerbatch(self,origin,skeleton):
266
271
del self .header_request
267
272
268
273
# check if header is empty
269
-
270
- if header [0 ] not in self .batch_requests :
271
- continue
272
274
if proto_received not in self .pending_headerRequests :
273
- continue
274
- start_header = self .pending_headerRequests [proto_received ].start
275
- del self .pending_headerRequests [proto_received ]
276
- verified = self .verify_headers (proto_received ,header )
275
+ continue
276
+ self .deliver_headers (origin ,proto_received , headers )
277
+ proto_received .idle = True
278
+
279
+
280
+ def deliver_headers (self ,origin ,proto ,header ):
281
+ if header [0 ] not in self .batch_requests :
282
+ return
283
+ start_header = self .pending_headerRequests [proto ].start
284
+ del self .pending_headerRequests [proto ]
285
+ verified = self .verify_headers (proto ,header )
286
+
277
287
if not verified :
278
288
self .headertask_queue .put ((start_header ,start_header ))
279
- continue
280
-
281
-
289
+ return
282
290
batch_header = header [::- 1 ] #in hight rising order
283
291
self .batch_result [(batch_header [0 ].number - origin - 1 ):batch_header [0 ].number - origin - 1 + len (batch_header )]= batch_header
284
292
# log_st.debug('batch result',batch_result= self.batch_result)
285
293
self .batch_requests .remove (header [0 ])
286
- proto_received .set_idle ()
287
- del self .requests [proto_received ]
288
-
294
+ del self .requests [proto ]
289
295
header_ready = 0
290
296
while (self .header_processed + header_ready ) < len (self .batch_result ) and self .batch_result [self .header_processed + header_ready ]:
291
297
header_ready += self .max_blockheaders_per_request
292
298
293
299
if header_ready > 0 :
294
300
# Headers are ready for delivery, gather them
295
301
processed = self .batch_result [self .header_processed :self .header_processed + header_ready ]
296
- # log_st.debug('issue fetching blocks',header_processed=self.header_processed, blocks=processed, proto=proto_received ,count=len(processed),start=processed[0].number)
302
+ # log_st.debug('issue fetching blocks',header_processed=self.header_processed,blocks=processed, proto=proto ,count=len(processed),start=processed[0].number)
297
303
298
304
count = len (processed )
299
305
self .synchronizer .blockheader_queue .put (processed )
@@ -303,7 +309,7 @@ def fetch_headerbatch(self,origin,skeleton):
303
309
# return self.batch_result[:self.header_processed]
304
310
log_st .debug ('remaining headers' ,num = len (self .batch_requests ),headers = self .batch_requests )
305
311
306
-
312
+
307
313
308
314
309
315
def idle_protocols (self ):
@@ -340,7 +346,7 @@ def fetch_headers(self,proto, fromx):
340
346
self .requests [proto ] = deferred
341
347
blockheaders_batch = deferred .get (block = True ,timeout = self .blockheaders_request_timeout )
342
348
except gevent .Timeout :
343
- log_st .warn ('syncing batch hashchain timed out' )
349
+ log_st .warn ('fetch_headers syncing batch hashchain timed out' )
344
350
proto .stop ()
345
351
return self .exit (success = False )
346
352
finally :
@@ -462,7 +468,7 @@ def fetch_blocks(self):
462
468
while True :
463
469
try :
464
470
result = self .fetch_ready .get ()
465
- log_st .debug ('start fetching blocks' )
471
+ log_body_st .debug ('start fetching blocks' )
466
472
num_blocks = len (self .block_requests_pool )
467
473
deferred = AsyncResult ()
468
474
self .body_request = deferred
@@ -477,10 +483,12 @@ def fetch_blocks(self):
477
483
self .bodytask_queue .put ((h .number ,h ))
478
484
log_body_st .debug ('timeouted request' ,
479
485
start = request .start ,proto = proto )
486
+ # if failed headers> 2 set it idle,
487
+ if len (request .headers ) > 2 :
488
+ proto .body_idle = True
489
+ else :
490
+ proto .stop ()
480
491
del self .pending_bodyRequests [proto ]
481
- # if overtimes> 2 else set it idle try one more time,
482
- # proto.body_idle = True
483
- proto .stop ()
484
492
485
493
if len (self .block_requests_pool ) == 0 :
486
494
log_body_st .debug ('block body fetching completed!' )
@@ -495,14 +503,6 @@ def fetch_blocks(self):
495
503
# assert proto not in self.requests
496
504
if proto .is_stopped :
497
505
continue
498
-
499
- if pending > 8192 - num_fetched :
500
- throttled = True
501
- log_body_st .debug ('throttled' )
502
- break
503
- else :
504
- throttled = False
505
-
506
506
if not self .reserve_blocks (proto , self .max_blocks_per_request ):
507
507
log_body_st .debug ('reserve blocks failed' )
508
508
break
@@ -523,13 +523,13 @@ def fetch_blocks(self):
523
523
except gevent .Timeout :
524
524
log_body_st .warn ('syncing batch block body timed out' )
525
525
retry += 1
526
- if retry >= self .max_retries :
527
- log_body_st .warn ('headers sync failed with all peers' ,
528
- num_protos = len (self .body_idle_protocols ()))
529
- return self .exit (success = False )
530
- else :
531
- log_body_st .info ('headers sync failed with peers, retry' , retry = retry )
532
- gevent .sleep (self .retry_delay )
526
+ # if retry >= self.max_retries:
527
+ # log_body_st.warn('headers sync failed with all peers',
528
+ # num_protos=len(self.body_idle_protocols()))
529
+ # return self.exit(success=False)
530
+ # else:
531
+ log_body_st .info ('headers sync failed with peers, retry' , retry = retry )
532
+ gevent .sleep (self .retry_delay )
533
533
continue
534
534
finally :
535
535
del self .body_request
0 commit comments