@@ -629,13 +629,13 @@ func (q *queue) DeliverBodies(id string, txLists [][]*types.Transaction, txListH
629629 result .SetBodyDone ()
630630 }
631631 return q .deliver (id , q .blockTaskPool , q .blockTaskQueue , q .blockPendPool ,
632- bodyReqTimer , bodyInMeter , bodyDropMeter , len (txLists ), validate , reconstruct )
632+ bodyReqTimer , bodyInMeter , bodyDropMeter , len (txLists ), validate , reconstruct , false , 0 )
633633}
634634
635635// DeliverReceipts injects a receipt retrieval response into the results queue.
636636// The method returns the number of transaction receipts accepted from the delivery
637637// and also wakes any threads waiting for data delivery.
638- func (q * queue ) DeliverReceipts (id string , receiptList []rlp.RawValue , receiptListHashes []common.Hash ) (int , error ) {
638+ func (q * queue ) DeliverReceipts (id string , receiptList []rlp.RawValue , receiptListHashes []common.Hash , incomplete bool , from int ) (int , error ) {
639639 q .lock .Lock ()
640640 defer q .lock .Unlock ()
641641
@@ -650,7 +650,7 @@ func (q *queue) DeliverReceipts(id string, receiptList []rlp.RawValue, receiptLi
650650 result .SetReceiptsDone ()
651651 }
652652 return q .deliver (id , q .receiptTaskPool , q .receiptTaskQueue , q .receiptPendPool ,
653- receiptReqTimer , receiptInMeter , receiptDropMeter , len (receiptList ), validate , reconstruct )
653+ receiptReqTimer , receiptInMeter , receiptDropMeter , len (receiptList ), validate , reconstruct , incomplete , from )
654654}
655655
656656// deliver injects a data retrieval response into the results queue.
@@ -662,22 +662,24 @@ func (q *queue) deliver(id string, taskPool map[common.Hash]*types.Header,
662662 taskQueue * prque.Prque [int64 , * types.Header ], pendPool map [string ]* fetchRequest ,
663663 reqTimer * metrics.Timer , resInMeter , resDropMeter * metrics.Meter ,
664664 results int , validate func (index int , header * types.Header ) error ,
665- reconstruct func (index int , result * fetchResult )) (int , error ) {
665+ reconstruct func (index int , result * fetchResult ), incomplete bool , from int ) (int , error ) {
666666 // Short circuit if the data was never requested
667667 request := pendPool [id ]
668668 if request == nil {
669669 resDropMeter .Mark (int64 (results ))
670670 return 0 , errNoFetchesPending
671671 }
672- delete (pendPool , id )
672+ if ! incomplete {
673+ delete (pendPool , id )
674+ }
673675
674676 reqTimer .UpdateSince (request .Time )
675677 resInMeter .Mark (int64 (results ))
676678
677679 // If no data items were retrieved, mark them as unavailable for the origin peer
678680 if results == 0 {
679681 for _ , header := range request .Headers {
680- request .Peer .MarkLacking (header .Hash ())
682+ request .Peer .MarkLacking (header .Hash ()) //todo?
681683 }
682684 }
683685 // Assemble each of the results with their headers and retrieved data parts
@@ -687,7 +689,7 @@ func (q *queue) deliver(id string, taskPool map[common.Hash]*types.Header,
687689 i int
688690 hashes []common.Hash
689691 )
690- for _ , header := range request .Headers {
692+ for _ , header := range request .Headers [ from :] {
691693 // Short circuit assembly if no more fetch results are found
692694 if i >= results {
693695 break
@@ -701,7 +703,7 @@ func (q *queue) deliver(id string, taskPool map[common.Hash]*types.Header,
701703 i ++
702704 }
703705
704- for _ , header := range request .Headers [: i ] {
706+ for _ , header := range request .Headers [from : from + i ] {
705707 if res , stale , err := q .resultCache .GetDeliverySlot (header .Number .Uint64 ()); err == nil && ! stale {
706708 reconstruct (accepted , res )
707709 } else {
@@ -718,8 +720,15 @@ func (q *queue) deliver(id string, taskPool map[common.Hash]*types.Header,
718720 resDropMeter .Mark (int64 (results - accepted ))
719721
720722 // Return all failed or missing fetches to the queue
721- for _ , header := range request .Headers [accepted :] {
722- taskQueue .Push (header , - int64 (header .Number .Uint64 ()))
723+ //todo
724+ if incomplete {
725+ for _ , header := range request .Headers [from + accepted : from + results ] {
726+ taskQueue .Push (header , - int64 (header .Number .Uint64 ()))
727+ }
728+ } else {
729+ for _ , header := range request .Headers [from + accepted :] {
730+ taskQueue .Push (header , - int64 (header .Number .Uint64 ()))
731+ }
723732 }
724733 // Wake up Results
725734 if accepted > 0 {
0 commit comments