diff --git a/les/flowcontrol/control.go b/les/flowcontrol/control.go index 99090c80d1..717631975a 100644 --- a/les/flowcontrol/control.go +++ b/les/flowcontrol/control.go @@ -396,6 +396,28 @@ func (node *ServerNode) ReceivedReply(reqID, bv uint64) { } } +// ResumeFreeze cleans all pending requests and sets the buffer estimate to the +// reported value after resuming from a frozen state +func (node *ServerNode) ResumeFreeze(bv uint64) { + node.lock.Lock() + defer node.lock.Unlock() + + for reqID, _ := range node.pending { + delete(node.pending, reqID) + } + now := node.clock.Now() + node.recalcBLE(now) + if bv > node.params.BufLimit { + bv = node.params.BufLimit + } + node.bufEstimate = bv + node.bufRecharge = node.bufEstimate < node.params.BufLimit + node.lastTime = now + if node.log != nil { + node.log.add(now, fmt.Sprintf("unfreeze bv=%d sumCost=%d", bv, node.sumCost)) + } +} + // DumpLogs dumps the event log if logging is used func (node *ServerNode) DumpLogs() { node.lock.Lock() diff --git a/les/handler.go b/les/handler.go index a10104dc7d..59bfd81cd7 100644 --- a/les/handler.go +++ b/les/handler.go @@ -1098,6 +1098,7 @@ func (pm *ProtocolManager) handleMsg(p *peer) error { if err := msg.Decode(&bv); err != nil { return errResp(ErrDecode, "msg %v: %v", msg, err) } + p.fcServer.ResumeFreeze(bv) p.freezeServer(false) p.Log().Warn("Service resumed")