aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2023-04-11 11:05:18 +0200
committerAleksandr Nogikh <wp32pw@gmail.com>2023-04-13 13:39:53 +0200
commit3cfcaa1bed770dce1e4d55a41c168a9a56f931a5 (patch)
treed62e3c6e4a94fb8b8a69ad76b574f6777099c894
parent82d5e53ec0af57823952183e2e2603ce2462fb66 (diff)
pkg/subsystem: optionally disable monthly reports
For some subsystems (e.g. `kernel`) such reports just don't make much sense, since there are too many incorrectly classified bugs in there. Make it possible to exclude such subsystems from periodic reminders.
-rw-r--r--dashboard/app/app_test.go7
-rw-r--r--dashboard/app/reporting_lists.go6
-rw-r--r--dashboard/app/subsystem_test.go34
-rw-r--r--pkg/subsystem/entities.go2
-rw-r--r--pkg/subsystem/linux/rules.go7
-rw-r--r--pkg/subsystem/linux/subsystems.go1
-rw-r--r--pkg/subsystem/lists/linux.go1
-rw-r--r--tools/syz-query-subsystems/generator.go13
8 files changed, 67 insertions, 4 deletions
diff --git a/dashboard/app/app_test.go b/dashboard/app/app_test.go
index 01dd30321..7745df988 100644
--- a/dashboard/app/app_test.go
+++ b/dashboard/app/app_test.go
@@ -524,6 +524,13 @@ var testSubsystems = []*subsystem.Subsystem{
Lists: []string{"subsystemB@list.com"},
Maintainers: []string{"subsystemB@person.com"},
},
+ {
+ Name: "subsystemC",
+ PathRules: []subsystem.PathRule{{IncludeRegexp: `c\.c`}},
+ Lists: []string{"subsystemC@list.com"},
+ Maintainers: []string{"subsystemC@person.com"},
+ NoReminders: true,
+ },
}
const (
diff --git a/dashboard/app/reporting_lists.go b/dashboard/app/reporting_lists.go
index a82598d16..8f3332338 100644
--- a/dashboard/app/reporting_lists.go
+++ b/dashboard/app/reporting_lists.go
@@ -48,6 +48,9 @@ func reportingPollBugLists(c context.Context, typ string) []*dashapi.BugListRepo
return rawSubsystems[i].Name < rawSubsystems[j].Name
})
for _, entry := range rawSubsystems {
+ if entry.NoReminders {
+ continue
+ }
for _, dbReport := range registry.get(ns, entry.Name) {
if stateEntry.Sent >= reporting.DailyLimit {
break
@@ -86,6 +89,9 @@ func handleSubsystemReports(w http.ResponseWriter, r *http.Request) {
reporting := nsConfig.ReportingByName(rConfig.SourceReporting)
var subsystems []*Subsystem
for _, entry := range nsConfig.Subsystems.Service.List() {
+ if entry.NoReminders {
+ continue
+ }
subsystems = append(subsystems, registry.get(ns, entry.Name))
}
// Poll subsystems in a round-robin manner.
diff --git a/dashboard/app/subsystem_test.go b/dashboard/app/subsystem_test.go
index 2ce3980d7..80dd7863c 100644
--- a/dashboard/app/subsystem_test.go
+++ b/dashboard/app/subsystem_test.go
@@ -572,3 +572,37 @@ syzbot engineers can be reached at syzkaller@googlegroups.com.
c.expectNE(reply.Sender, secondReply.Sender)
c.expectTrue(strings.Contains(secondReply.Body, `7 Yes WARNING: has repro 6`))
}
+
+func TestSubsystemRemindersNoReport(t *testing.T) {
+ c := NewCtx(t)
+ defer c.Close()
+
+ client := c.makeClient(clientSubsystemRemind, keySubsystemRemind, true)
+ build := testBuild(1)
+ client.UploadBuild(build)
+
+ cFirst := testCrash(build, 1)
+ cFirst.Title = `WARNING: c first`
+ cFirst.GuiltyFiles = []string{"c.c"}
+ client.ReportCrash(cFirst)
+ client.pollEmailBug()
+ c.advanceTime(time.Hour)
+
+ cSecond := testCrash(build, 1)
+ cSecond.Title = `WARNING: c second`
+ cSecond.GuiltyFiles = []string{"c.c"}
+ client.ReportCrash(cSecond)
+ client.pollEmailBug()
+ c.advanceTime(time.Hour)
+
+ // Report them again.
+ c.advanceTime(time.Hour * 24 * 14)
+ client.ReportCrash(cFirst)
+ client.ReportCrash(cSecond)
+
+ _, err := c.GET("/cron/subsystem_reports")
+ c.expectOK(err)
+
+ // Expect no reminders for subsystemC.
+ client.expectNoEmail()
+}
diff --git a/pkg/subsystem/entities.go b/pkg/subsystem/entities.go
index 457e57a3e..338447ad4 100644
--- a/pkg/subsystem/entities.go
+++ b/pkg/subsystem/entities.go
@@ -10,6 +10,8 @@ type Subsystem struct {
Lists []string
Maintainers []string
Parents []*Subsystem
+ // If NoReminders is set to true, there should be no monthly reports for the subsystem.
+ NoReminders bool
}
// ReachableParents returns the set of subsystems reachable from the current one.
diff --git a/pkg/subsystem/linux/rules.go b/pkg/subsystem/linux/rules.go
index 3f2149af2..d44451692 100644
--- a/pkg/subsystem/linux/rules.go
+++ b/pkg/subsystem/linux/rules.go
@@ -12,6 +12,8 @@ type customRules struct {
// These subsystems need to be extracted even without mailing lists.
// Key is the subsystem name, value is the list of raw names in MAINTAINERS.
extraSubsystems map[string][]string
+ // For these subsystems we do not generate monthly reminders.
+ noReminders map[string]struct{}
}
var (
@@ -88,5 +90,10 @@ var (
"kernfs": {"KERNFS"},
"udf": {"UDF FILESYSTEM"},
},
+ noReminders: map[string]struct{}{
+ // Many misclassified bugs end up in `kernel`, so there's no sense
+ // in generating monthly reports for it.
+ "kernel": {},
+ },
}
)
diff --git a/pkg/subsystem/linux/subsystems.go b/pkg/subsystem/linux/subsystems.go
index 880b1fcaf..1d1d84ed2 100644
--- a/pkg/subsystem/linux/subsystems.go
+++ b/pkg/subsystem/linux/subsystems.go
@@ -130,6 +130,7 @@ func (ctx *linuxCtx) applyExtraRules(list []*subsystem.Subsystem) {
}
for _, entry := range list {
entry.Syscalls = ctx.extraRules.subsystemCalls[entry.Name]
+ _, entry.NoReminders = ctx.extraRules.noReminders[entry.Name]
}
}
diff --git a/pkg/subsystem/lists/linux.go b/pkg/subsystem/lists/linux.go
index c097c16ca..7716b0c20 100644
--- a/pkg/subsystem/lists/linux.go
+++ b/pkg/subsystem/lists/linux.go
@@ -2149,6 +2149,7 @@ func subsystems_linux() []*Subsystem {
{IncludeRegexp: "^net/vmw_vsock/vmci_transport[^/]*$"},
{IncludeRegexp: "axp[128]"},
},
+ NoReminders: true,
}
kernfs = Subsystem{
diff --git a/tools/syz-query-subsystems/generator.go b/tools/syz-query-subsystems/generator.go
index 9b93a8151..d738be0f0 100644
--- a/tools/syz-query-subsystems/generator.go
+++ b/tools/syz-query-subsystems/generator.go
@@ -45,10 +45,11 @@ func generateSubsystemsFile(name string, list []*subsystem.Subsystem, commitInfo
}
sort.Strings(parents)
subsystem := &templateSubsystem{
- VarName: varName,
- Name: serializer.WriteString(entry.Name),
- PathRules: serializer.WriteString(entry.PathRules),
- Parents: parents,
+ VarName: varName,
+ Name: serializer.WriteString(entry.Name),
+ PathRules: serializer.WriteString(entry.PathRules),
+ Parents: parents,
+ NoReminders: entry.NoReminders,
}
// Some of the records are mostly empty.
if len(entry.Maintainers) > 0 {
@@ -118,6 +119,7 @@ type templateSubsystem struct {
Lists string
Maintainers string
Parents []string
+ NoReminders bool
}
type templateVars struct {
@@ -167,6 +169,9 @@ var {{range $i, $item := .List}}
Parents: []*Subsystem{ {{range .Parents}} &{{.}}, {{end}} },
{{- end}}
PathRules: {{.PathRules}},
+{{- if .NoReminders}}
+ NoReminders: true,
+{{- end}}
}
{{end}}