Skip to content

Commit c8ef2fa

Browse files
committed
shutdown limiters on ticker shutdown
1 parent d82f64f commit c8ef2fa

2 files changed

Lines changed: 34 additions & 0 deletions

File tree

operation.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ func (op *Operation) run(ch chan<- int64) {
9595
select {
9696
case <-stopCh:
9797
return
98+
case <-op.Ticker.doneCh:
99+
return
98100
case limitCh <- batch:
99101
todo -= batch
100102
todo += op.avail.Swap(0)

ticker_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package bwlimit
22

33
import (
44
"bytes"
5+
"io"
56
"testing"
67
"testing/synctest"
78
"time"
@@ -27,3 +28,34 @@ func TestTicker_NewTicker_NewLimiter(t *testing.T) {
2728
}
2829
})
2930
}
31+
32+
func TestTicker_Stop_unblocksLimitedOperation(t *testing.T) {
33+
synctest.Test(t, func(t *testing.T) {
34+
ticker := NewTicker()
35+
l := ticker.NewLimiter(1000)
36+
defer l.Stop()
37+
38+
ticker.Stop()
39+
40+
done := make(chan struct{})
41+
var n int
42+
var err error
43+
go func() {
44+
n, err = l.Reads.io(bytes.NewReader(make([]byte, 1)).Read, make([]byte, 1))
45+
close(done)
46+
}()
47+
48+
select {
49+
case <-done:
50+
case <-time.After(10 * time.Second):
51+
t.Fatal("read stalled after ticker stop")
52+
}
53+
54+
if n != 0 {
55+
t.Fatalf("got n=%d, want 0", n)
56+
}
57+
if err != io.EOF {
58+
t.Fatalf("got err=%v, want %v", err, io.EOF)
59+
}
60+
})
61+
}

0 commit comments

Comments
 (0)