diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2024-09-04 14:44:29 +0200 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2024-09-04 14:21:04 +0000 |
| commit | 0b816f26cf705be2dde67e140ef01ee136eea378 (patch) | |
| tree | 4c8c70ef027001756e2b9934279fc974c6f3e76e /pkg/manager | |
| parent | 9d47f20a1c5cfc0e89b8e37d0175d69be81ad9a9 (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/manager')
| -rw-r--r-- | pkg/manager/repro.go | 8 | ||||
| -rw-r--r-- | pkg/manager/repro_test.go | 9 |
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) } |
