eth/downloader: save the correct delivery time for state sync
This commit is contained in:
parent
68754f3931
commit
4b9c0ea76d
@ -34,13 +34,14 @@ import (
|
|||||||
// stateReq represents a batch of state fetch requests grouped together into
|
// stateReq represents a batch of state fetch requests grouped together into
|
||||||
// a single data retrieval network packet.
|
// a single data retrieval network packet.
|
||||||
type stateReq struct {
|
type stateReq struct {
|
||||||
nItems uint16 // Number of items requested for download (max is 384, so uint16 is sufficient)
|
nItems uint16 // Number of items requested for download (max is 384, so uint16 is sufficient)
|
||||||
tasks map[common.Hash]*stateTask // Download tasks to track previous attempts
|
tasks map[common.Hash]*stateTask // Download tasks to track previous attempts
|
||||||
timeout time.Duration // Maximum round trip time for this to complete
|
timeout time.Duration // Maximum round trip time for this to complete
|
||||||
timer *time.Timer // Timer to fire when the RTT timeout expires
|
timer *time.Timer // Timer to fire when the RTT timeout expires
|
||||||
peer *peerConnection // Peer that we're requesting from
|
peer *peerConnection // Peer that we're requesting from
|
||||||
response [][]byte // Response data of the peer (nil for timeouts)
|
delivered time.Time // Time when the packet was delivered (independent when we process it)
|
||||||
dropped bool // Flag whether the peer dropped off early
|
response [][]byte // Response data of the peer (nil for timeouts)
|
||||||
|
dropped bool // Flag whether the peer dropped off early
|
||||||
}
|
}
|
||||||
|
|
||||||
// timedOut returns if this request timed out.
|
// timedOut returns if this request timed out.
|
||||||
@ -148,6 +149,7 @@ func (d *Downloader) runStateSync(s *stateSync) *stateSync {
|
|||||||
// Finalize the request and queue up for processing
|
// Finalize the request and queue up for processing
|
||||||
req.timer.Stop()
|
req.timer.Stop()
|
||||||
req.response = pack.(*statePack).states
|
req.response = pack.(*statePack).states
|
||||||
|
req.delivered = time.Now()
|
||||||
|
|
||||||
finished = append(finished, req)
|
finished = append(finished, req)
|
||||||
delete(active, pack.PeerId())
|
delete(active, pack.PeerId())
|
||||||
@ -349,7 +351,6 @@ func (s *stateSync) loop() (err error) {
|
|||||||
return errCanceled
|
return errCanceled
|
||||||
|
|
||||||
case req := <-s.deliver:
|
case req := <-s.deliver:
|
||||||
deliveryTime := time.Now()
|
|
||||||
// Response, disconnect or timeout triggered, drop the peer if stalling
|
// Response, disconnect or timeout triggered, drop the peer if stalling
|
||||||
log.Trace("Received node data response", "peer", req.peer.id, "count", len(req.response), "dropped", req.dropped, "timeout", !req.dropped && req.timedOut())
|
log.Trace("Received node data response", "peer", req.peer.id, "count", len(req.response), "dropped", req.dropped, "timeout", !req.dropped && req.timedOut())
|
||||||
if req.nItems <= 2 && !req.dropped && req.timedOut() {
|
if req.nItems <= 2 && !req.dropped && req.timedOut() {
|
||||||
@ -376,7 +377,7 @@ func (s *stateSync) loop() (err error) {
|
|||||||
}
|
}
|
||||||
// Process all the received blobs and check for stale delivery
|
// Process all the received blobs and check for stale delivery
|
||||||
delivered, err := s.process(req)
|
delivered, err := s.process(req)
|
||||||
req.peer.SetNodeDataIdle(delivered, deliveryTime)
|
req.peer.SetNodeDataIdle(delivered, req.delivered)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Warn("Node data write error", "err", err)
|
log.Warn("Node data write error", "err", err)
|
||||||
return err
|
return err
|
||||||
|
Loading…
Reference in New Issue
Block a user