mirror of
https://github.com/octoleo/syncthing.git
synced 2025-01-03 15:17:25 +00:00
Fix events timeout errors
Resetting the timeout doesn't fully cut it, as it may timeout after we got an event and be delivered later. This should fix it well enough for the moment. https://github.com/golang/go/issues/11513
This commit is contained in:
parent
42dfa45d52
commit
feffc0416f
@ -182,12 +182,19 @@ func (s *Subscription) Poll(timeout time.Duration) (Event, error) {
|
||||
dl.Debugln("poll", timeout)
|
||||
}
|
||||
|
||||
s.timeout.Reset(timeout)
|
||||
if !s.timeout.Reset(timeout) {
|
||||
select {
|
||||
case <-s.timeout.C:
|
||||
default:
|
||||
}
|
||||
}
|
||||
|
||||
select {
|
||||
case e, ok := <-s.events:
|
||||
if !ok {
|
||||
return e, ErrClosed
|
||||
}
|
||||
s.timeout.Stop()
|
||||
return e, nil
|
||||
case <-s.timeout.C:
|
||||
return Event{}, ErrTimeout
|
||||
|
@ -14,7 +14,7 @@ import (
|
||||
"github.com/syncthing/syncthing/lib/events"
|
||||
)
|
||||
|
||||
var timeout = 100 * time.Millisecond
|
||||
const timeout = 100 * time.Millisecond
|
||||
|
||||
func TestNewLogger(t *testing.T) {
|
||||
l := events.NewLogger()
|
||||
@ -26,6 +26,7 @@ func TestNewLogger(t *testing.T) {
|
||||
func TestSubscriber(t *testing.T) {
|
||||
l := events.NewLogger()
|
||||
s := l.Subscribe(0)
|
||||
defer l.Unsubscribe(s)
|
||||
if s == nil {
|
||||
t.Fatal("Unexpected nil Subscription")
|
||||
}
|
||||
@ -34,6 +35,7 @@ func TestSubscriber(t *testing.T) {
|
||||
func TestTimeout(t *testing.T) {
|
||||
l := events.NewLogger()
|
||||
s := l.Subscribe(0)
|
||||
defer l.Unsubscribe(s)
|
||||
_, err := s.Poll(timeout)
|
||||
if err != events.ErrTimeout {
|
||||
t.Fatal("Unexpected non-Timeout error:", err)
|
||||
@ -45,6 +47,7 @@ func TestEventBeforeSubscribe(t *testing.T) {
|
||||
|
||||
l.Log(events.DeviceConnected, "foo")
|
||||
s := l.Subscribe(0)
|
||||
defer l.Unsubscribe(s)
|
||||
|
||||
_, err := s.Poll(timeout)
|
||||
if err != events.ErrTimeout {
|
||||
@ -56,6 +59,7 @@ func TestEventAfterSubscribe(t *testing.T) {
|
||||
l := events.NewLogger()
|
||||
|
||||
s := l.Subscribe(events.AllEvents)
|
||||
defer l.Unsubscribe(s)
|
||||
l.Log(events.DeviceConnected, "foo")
|
||||
|
||||
ev, err := s.Poll(timeout)
|
||||
@ -80,6 +84,7 @@ func TestEventAfterSubscribeIgnoreMask(t *testing.T) {
|
||||
l := events.NewLogger()
|
||||
|
||||
s := l.Subscribe(events.DeviceDisconnected)
|
||||
defer l.Unsubscribe(s)
|
||||
l.Log(events.DeviceConnected, "foo")
|
||||
|
||||
_, err := s.Poll(timeout)
|
||||
@ -91,7 +96,8 @@ func TestEventAfterSubscribeIgnoreMask(t *testing.T) {
|
||||
func TestBufferOverflow(t *testing.T) {
|
||||
l := events.NewLogger()
|
||||
|
||||
_ = l.Subscribe(events.AllEvents)
|
||||
s := l.Subscribe(events.AllEvents)
|
||||
defer l.Unsubscribe(s)
|
||||
|
||||
t0 := time.Now()
|
||||
for i := 0; i < events.BufferSize*2; i++ {
|
||||
@ -126,6 +132,7 @@ func TestIDs(t *testing.T) {
|
||||
l := events.NewLogger()
|
||||
|
||||
s := l.Subscribe(events.AllEvents)
|
||||
defer l.Unsubscribe(s)
|
||||
l.Log(events.DeviceConnected, "foo")
|
||||
l.Log(events.DeviceConnected, "bar")
|
||||
|
||||
@ -154,6 +161,7 @@ func TestBufferedSub(t *testing.T) {
|
||||
l := events.NewLogger()
|
||||
|
||||
s := l.Subscribe(events.AllEvents)
|
||||
defer l.Unsubscribe(s)
|
||||
bs := events.NewBufferedSubscription(s, 10*events.BufferSize)
|
||||
|
||||
go func() {
|
||||
|
Loading…
Reference in New Issue
Block a user