diff options
author | Jakob Borg <jakob@nym.se> | 2015-08-24 09:38:39 +0200 |
---|---|---|
committer | Jakob Borg <jakob@nym.se> | 2015-08-24 09:40:21 +0200 |
commit | feffc0416fc7a6267b1da7fab10164742fbc60c9 (patch) | |
tree | 31bfd2ca6a48be0127aa258e65d70748ac4de520 | |
parent | 42dfa45d529cbc031198432fb2c3324d08970553 (diff) |
Fix events timeout errorsv0.11.22
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
-rw-r--r-- | lib/events/events.go | 9 | ||||
-rw-r--r-- | lib/events/events_test.go | 12 |
2 files changed, 18 insertions, 3 deletions
diff --git a/lib/events/events.go b/lib/events/events.go index 78c1d692f..9f7c53522 100644 --- a/lib/events/events.go +++ b/lib/events/events.go @@ -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 diff --git a/lib/events/events_test.go b/lib/events/events_test.go index 982953d94..2f91dafea 100644 --- a/lib/events/events_test.go +++ b/lib/events/events_test.go @@ -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() { |