aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/manager
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/manager')
-rw-r--r--pkg/manager/repro.go6
-rw-r--r--pkg/manager/repro_test.go22
2 files changed, 27 insertions, 1 deletions
diff --git a/pkg/manager/repro.go b/pkg/manager/repro.go
index 1531f3d8d..c9eb2f9a9 100644
--- a/pkg/manager/repro.go
+++ b/pkg/manager/repro.go
@@ -230,7 +230,11 @@ func (r *ReproLoop) Loop(ctx context.Context) {
r.mu.Unlock()
r.parallel <- struct{}{}
- r.pingQueue <- struct{}{}
+ // If the context is cancelled, no one is listening on pingQueue.
+ select {
+ case r.pingQueue <- struct{}{}:
+ default:
+ }
}()
}
}
diff --git a/pkg/manager/repro_test.go b/pkg/manager/repro_test.go
index def436e99..d66bee8d0 100644
--- a/pkg/manager/repro_test.go
+++ b/pkg/manager/repro_test.go
@@ -123,6 +123,28 @@ func TestReproRWRace(t *testing.T) {
mock.onVMShutdown(t, obj)
}
+func TestCancelRunningRepro(t *testing.T) {
+ mock := &reproMgrMock{
+ run: make(chan runCallback),
+ }
+ obj := NewReproLoop(mock, 1, false)
+ ctx, done := context.WithCancel(context.Background())
+ complete := make(chan struct{})
+ go func() {
+ obj.Loop(ctx)
+ close(complete)
+ }()
+
+ defer func() {
+ <-complete
+ }()
+
+ obj.Enqueue(&Crash{Report: &report.Report{Title: "A"}})
+ obj.Enqueue(&Crash{Report: &report.Report{Title: "B"}})
+ <-mock.run
+ done()
+}
+
type reproMgrMock struct {
reserved atomic.Int64
run chan runCallback