les/flowcontrol: fixed locking scheme
This commit is contained in:
parent
ca73dea3b9
commit
a0c6649960
|
@ -99,7 +99,7 @@ type ServerNode struct {
|
|||
params *ServerParams
|
||||
sumCost uint64 // sum of req costs sent to this server
|
||||
pending map[uint64]uint64 // value = sumCost after sending the given req
|
||||
lock sync.Mutex
|
||||
lock sync.RWMutex
|
||||
}
|
||||
|
||||
func NewServerNode(params *ServerParams) *ServerNode {
|
||||
|
@ -135,8 +135,8 @@ func (peer *ServerNode) canSend(maxCost uint64) uint64 {
|
|||
}
|
||||
|
||||
func (peer *ServerNode) CanSend(maxCost uint64) uint64 {
|
||||
peer.lock.Lock()
|
||||
defer peer.lock.Unlock()
|
||||
peer.lock.RLock()
|
||||
defer peer.lock.RUnlock()
|
||||
|
||||
return peer.canSend(maxCost)
|
||||
}
|
||||
|
@ -148,7 +148,10 @@ func (peer *ServerNode) SendRequest(reqID, maxCost uint64) {
|
|||
|
||||
peer.recalcBLE(getTime())
|
||||
for peer.bufEstimate < maxCost {
|
||||
time.Sleep(time.Duration(peer.canSend(maxCost)))
|
||||
wait := time.Duration(peer.canSend(maxCost))
|
||||
peer.lock.Unlock()
|
||||
time.Sleep(wait)
|
||||
peer.lock.Lock()
|
||||
peer.recalcBLE(getTime())
|
||||
}
|
||||
peer.bufEstimate -= maxCost
|
||||
|
|
Loading…
Reference in New Issue