diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2024-07-03 11:38:09 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2024-07-03 13:26:52 +0000 |
| commit | 663d86a211916b159bfe732e4cf9923c918b9004 (patch) | |
| tree | 56a1128e9d5cf7cee1438a9348f98ef510483406 | |
| parent | 780d1bc51844c9df9c4d09e57bdfdd3d1ff8ad28 (diff) | |
syz-manager: allow manager to only consult dashboard if it needs reproducers
This mode allows to run local manager that only "helps" main instances
by uncovering more coverage and extracting useful reproducers.
Otherwise it spends too much time reproducing all bugs that already
have reproducers.
| -rw-r--r-- | pkg/mgrconfig/config.go | 3 | ||||
| -rw-r--r-- | syz-manager/manager.go | 29 |
2 files changed, 22 insertions, 10 deletions
diff --git a/pkg/mgrconfig/config.go b/pkg/mgrconfig/config.go index 5b383249a..2a7153c7a 100644 --- a/pkg/mgrconfig/config.go +++ b/pkg/mgrconfig/config.go @@ -99,6 +99,9 @@ type Config struct { DashboardClient string `json:"dashboard_client,omitempty"` DashboardAddr string `json:"dashboard_addr,omitempty"` DashboardKey string `json:"dashboard_key,omitempty"` + // If set, only consult dashboard if it needs reproducers for crashes, + // but otherwise don't send any info to dashboard (default: false). + DashboardOnlyRepro bool `json:"dashboard_only_repro,omitempty"` // Location of the syzkaller checkout, syz-manager will look // for binaries in bin subdir (does not have to be syzkaller checkout as diff --git a/syz-manager/manager.go b/syz-manager/manager.go index d262466e1..58b578451 100644 --- a/syz-manager/manager.go +++ b/syz-manager/manager.go @@ -92,6 +92,9 @@ type Manager struct { coverFilter map[uint64]struct{} // includes only coverage PCs dash *dashapi.Dashboard + // This is specifically separated from dash, so that we can keep dash = nil when + // cfg.DashboardOnlyRepro is set, so that we don't accidentially use dash for anything. + dashRepro *dashapi.Dashboard mu sync.Mutex fuzzer atomic.Pointer[fuzzer.Fuzzer] @@ -258,10 +261,14 @@ func RunManager(cfg *mgrconfig.Config) { log.Logf(0, "serving rpc on tcp://%v", mgr.serv.Port) if cfg.DashboardAddr != "" { - mgr.dash, err = dashapi.New(cfg.DashboardClient, cfg.DashboardAddr, cfg.DashboardKey) + dash, err := dashapi.New(cfg.DashboardClient, cfg.DashboardAddr, cfg.DashboardKey) if err != nil { log.Fatalf("failed to create dashapi connection: %v", err) } + mgr.dashRepro = dash + if !cfg.DashboardOnlyRepro { + mgr.dash = dash + } } if !cfg.AssetStorage.IsEmpty() { @@ -1080,7 +1087,7 @@ func (mgr *Manager) saveCrash(crash *Crash) bool { writeOrRemove("tag", []byte(mgr.cfg.Tag)) writeOrRemove("report", crash.Report.Report) writeOrRemove("machineInfo", crash.MachineInfo) - return mgr.needLocalRepro(crash) + return mgr.needRepro(crash) } const maxReproAttempts = 3 @@ -1114,17 +1121,19 @@ func (mgr *Manager) needRepro(crash *Crash) bool { // Leak checking is very slow, don't bother reproducing other crashes on leak instance. return false } - if mgr.dash == nil { + if mgr.dashRepro == nil { return mgr.needLocalRepro(crash) } cid := &dashapi.CrashID{ - BuildID: mgr.cfg.Tag, - Title: crash.Title, - Corrupted: crash.Corrupted, - Suppressed: crash.Suppressed, - MayBeMissing: crash.Type == crash_pkg.MemoryLeak, // we did not send the original crash w/o repro - } - needRepro, err := mgr.dash.NeedRepro(cid) + BuildID: mgr.cfg.Tag, + Title: crash.Title, + Corrupted: crash.Corrupted, + Suppressed: crash.Suppressed, + // When cfg.DashboardOnlyRepro is enabled, we don't sent any reports to dashboard. + // We also don't send leak reports w/o reproducers to dashboard, so they may be missing. + MayBeMissing: mgr.dash == nil || crash.Type == crash_pkg.MemoryLeak, + } + needRepro, err := mgr.dashRepro.NeedRepro(cid) if err != nil { log.Logf(0, "dashboard.NeedRepro failed: %v", err) } |
