aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/subsystem/extractor.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/subsystem/extractor.go')
-rw-r--r--pkg/subsystem/extractor.go36
1 files changed, 23 insertions, 13 deletions
diff --git a/pkg/subsystem/extractor.go b/pkg/subsystem/extractor.go
index 338b7a4fc..996560a31 100644
--- a/pkg/subsystem/extractor.go
+++ b/pkg/subsystem/extractor.go
@@ -56,10 +56,13 @@ func (e *Extractor) Extract(crashes []*Crash) []*Subsystem {
// It can be the case that guilty paths point to several subsystems, but the reproducer
// can clearly point to one of them.
if len(fromRepro) > 0 {
+ // If we do not exclude parents, there'll always be a root subsystem in there
+ // and, as a result, subsystems reproducers will always replace all other ones.
+ withoutParents := removeParents(subsystems)
newSubsystems := []*Subsystem{}
for _, reproSubsystem := range fromRepro {
parents := reproSubsystem.ReachableParents()
- for _, subsystem := range subsystems {
+ for _, subsystem := range withoutParents {
if _, ok := parents[subsystem]; ok {
newSubsystems = append(newSubsystems, reproSubsystem)
break
@@ -71,21 +74,10 @@ func (e *Extractor) Extract(crashes []*Crash) []*Subsystem {
}
}
- // If there are both parents and children, remove parents.
- ignore := make(map[*Subsystem]struct{})
- for _, entry := range subsystems {
- for p := range entry.ReachableParents() {
- ignore[p] = struct{}{}
- }
- }
-
// And calculate counts.
counts := make(map[*Subsystem]int)
maxCount := 0
- for _, entry := range subsystems {
- if _, ok := ignore[entry]; ok {
- continue
- }
+ for _, entry := range removeParents(append(subsystems, fromRepro...)) {
counts[entry]++
if counts[entry] > maxCount {
maxCount = counts[entry]
@@ -102,3 +94,21 @@ func (e *Extractor) Extract(crashes []*Crash) []*Subsystem {
}
return ret
}
+
+func removeParents(subsystems []*Subsystem) []*Subsystem {
+ // If there are both parents and children, remove parents.
+ ignore := make(map[*Subsystem]struct{})
+ for _, entry := range subsystems {
+ for p := range entry.ReachableParents() {
+ ignore[p] = struct{}{}
+ }
+ }
+ var ret []*Subsystem
+ for _, entry := range subsystems {
+ if _, ok := ignore[entry]; ok {
+ continue
+ }
+ ret = append(ret, entry)
+ }
+ return ret
+}