aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-09-04 14:44:29 +0200
committerAleksandr Nogikh <nogikh@google.com>2024-09-04 14:21:04 +0000
commit0b816f26cf705be2dde67e140ef01ee136eea378 (patch)
tree4c8c70ef027001756e2b9934279fc974c6f3e76e /pkg
parent9d47f20a1c5cfc0e89b8e37d0175d69be81ad9a9 (diff)
pkg/manager: properly handle NeedRepro() == false
It was processed incorrectly in the repro loop - we should have skipped that crash and looked for another one, but we actually ignored its return value.
Diffstat (limited to 'pkg')
-rw-r--r--pkg/manager/repro.go8
-rw-r--r--pkg/manager/repro_test.go9
2 files changed, 8 insertions, 9 deletions
diff --git a/pkg/manager/repro.go b/pkg/manager/repro.go
index 9858a4629..7a50f06ab 100644
--- a/pkg/manager/repro.go
+++ b/pkg/manager/repro.go
@@ -197,8 +197,12 @@ func (r *ReproLoop) Loop(ctx context.Context) {
case <-ctx.Done():
return
}
- if crash == nil || !r.mgr.NeedRepro(crash) {
- continue
+ if crash != nil && !r.mgr.NeedRepro(crash) {
+ crash = nil
+ // Now we might not need that many VMs.
+ r.mu.Lock()
+ r.adjustPoolSizeLocked()
+ r.mu.Unlock()
}
}
diff --git a/pkg/manager/repro_test.go b/pkg/manager/repro_test.go
index 80d224fd5..0149aafdb 100644
--- a/pkg/manager/repro_test.go
+++ b/pkg/manager/repro_test.go
@@ -119,19 +119,14 @@ func TestReproRWRace(t *testing.T) {
assert.True(t, mock.NeedRepro(nil))
called := <-mock.run
- called.ret <- &ReproResult{}
// Pretend that processRepro() is finished and
// we've written "repro.prog" to the disk.
mock.reproProgExist.Store(true)
assert.False(t, mock.NeedRepro(nil))
+ called.ret <- &ReproResult{}
assert.True(t, obj.CanReproMore())
- called2 := <-mock.run
- called2.ret <- &ReproResult{}
- assert.False(t, mock.NeedRepro(nil))
- assert.True(t, obj.CanReproMore())
-
- // Reproducers may be still running.
+ // The second repro process will never be started.
mock.onVMShutdown(t, obj)
}