mirror of
https://github.com/fluencelabs/tendermint
synced 2025-04-25 06:42:16 +00:00
Fixes #3457 The topic of the issue is that : write a BlockRequest int requestsCh channel will create an timer at the same time that stop the peer 15s later if no block have been received . But pop a BlockRequest from requestsCh and send it out may delay more than 15s later. So that the peer will be stopped for error("send nothing to us"). Extracting requestsCh into its own goroutine can make sure that every BlockRequest been handled timely. Instead of the requestsCh handling, we should probably pull the didProcessCh handling in a separate go routine since this is the one "starving" the other channel handlers. I believe the way it is right now, we still have issues with high delays in errorsCh handling that might cause sending requests to invalid/ disconnected peers.
80 lines
1.3 KiB
Go
80 lines
1.3 KiB
Go
package common
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
"time"
|
|
|
|
// make govet noshadow happy...
|
|
|
|
asrt "github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
type thCounter struct {
|
|
input chan struct{}
|
|
mtx sync.Mutex
|
|
count int
|
|
}
|
|
|
|
func (c *thCounter) Increment() {
|
|
c.mtx.Lock()
|
|
c.count++
|
|
c.mtx.Unlock()
|
|
}
|
|
|
|
func (c *thCounter) Count() int {
|
|
c.mtx.Lock()
|
|
val := c.count
|
|
c.mtx.Unlock()
|
|
return val
|
|
}
|
|
|
|
// Read should run in a go-routine and
|
|
// updates count by one every time a packet comes in
|
|
func (c *thCounter) Read() {
|
|
for range c.input {
|
|
c.Increment()
|
|
}
|
|
}
|
|
|
|
func TestThrottle(test *testing.T) {
|
|
assert := asrt.New(test)
|
|
|
|
ms := 50
|
|
delay := time.Duration(ms) * time.Millisecond
|
|
longwait := time.Duration(2) * delay
|
|
t := NewThrottleTimer("foo", delay)
|
|
|
|
// start at 0
|
|
c := &thCounter{input: t.Ch}
|
|
assert.Equal(0, c.Count())
|
|
go c.Read()
|
|
|
|
// waiting does nothing
|
|
time.Sleep(longwait)
|
|
assert.Equal(0, c.Count())
|
|
|
|
// send one event adds one
|
|
t.Set()
|
|
time.Sleep(longwait)
|
|
assert.Equal(1, c.Count())
|
|
|
|
// send a burst adds one
|
|
for i := 0; i < 5; i++ {
|
|
t.Set()
|
|
}
|
|
time.Sleep(longwait)
|
|
assert.Equal(2, c.Count())
|
|
|
|
// send 12, over 2 delay sections, adds 3
|
|
short := time.Duration(ms/5) * time.Millisecond
|
|
for i := 0; i < 13; i++ {
|
|
t.Set()
|
|
time.Sleep(short)
|
|
}
|
|
time.Sleep(longwait)
|
|
assert.Equal(5, c.Count())
|
|
|
|
close(t.Ch)
|
|
}
|