Skip to content

Commit c82cae6

Browse files
authored
feat: Make NVD data load faster by running in separate goroutines. (#4031)
This is also nice for local development to not have to wait as long to load in all the CVEs
1 parent cd92af5 commit c82cae6

File tree

1 file changed

+35
-15
lines changed

1 file changed

+35
-15
lines changed

vulnfeeds/vulns/vulns.go

Lines changed: 35 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import (
2727
"slices"
2828
"sort"
2929
"strings"
30+
"sync"
3031
"time"
3132

3233
"gopkg.in/yaml.v2"
@@ -785,27 +786,46 @@ func LoadAllCVEs(cvePath string) map[cves.CVEID]cves.Vulnerability {
785786
logger.Fatal("Failed to read dir", slog.String("path", cvePath), slog.Any("err", err))
786787
}
787788

788-
result := make(map[cves.CVEID]cves.Vulnerability)
789+
vulnsChan := make(chan cves.Vulnerability)
790+
var wg sync.WaitGroup
789791

790792
for _, entry := range dir {
791793
if !strings.HasSuffix(entry.Name(), ".json") {
792794
continue
793795
}
794-
file, err := os.Open(path.Join(cvePath, entry.Name()))
795-
if err != nil {
796-
logger.Fatal("Failed to open CVE JSON", slog.String("path", path.Join(cvePath, entry.Name())), slog.Any("err", err))
797-
}
798-
var nvdcve cves.CVEAPIJSON20Schema
799-
err = json.NewDecoder(file).Decode(&nvdcve)
800-
if err != nil {
801-
logger.Fatal("Failed to decode JSON", slog.String("file", file.Name()), slog.Any("err", err))
802-
}
803796

804-
for _, item := range nvdcve.Vulnerabilities {
805-
result[item.CVE.ID] = item
806-
}
807-
logger.Info("Loaded "+entry.Name(), slog.String("cve", entry.Name()))
808-
file.Close()
797+
wg.Add(1)
798+
go func(filename string) {
799+
defer wg.Done()
800+
filePath := path.Join(cvePath, filename)
801+
file, err := os.Open(filePath)
802+
if err != nil {
803+
logger.Error("Failed to open CVE JSON", slog.String("path", filePath), slog.Any("err", err))
804+
return
805+
}
806+
defer file.Close()
807+
808+
var nvdcve cves.CVEAPIJSON20Schema
809+
if err := json.NewDecoder(file).Decode(&nvdcve); err != nil {
810+
logger.Error("Failed to decode JSON", slog.String("file", filename), slog.Any("err", err))
811+
return
812+
}
813+
814+
for _, item := range nvdcve.Vulnerabilities {
815+
vulnsChan <- item
816+
}
817+
logger.Info("Loaded "+filename, slog.String("cve", filename))
818+
}(entry.Name())
819+
}
820+
821+
go func() {
822+
wg.Wait()
823+
close(vulnsChan)
824+
}()
825+
826+
result := make(map[cves.CVEID]cves.Vulnerability)
827+
for item := range vulnsChan {
828+
result[item.CVE.ID] = item
809829
}
810830

811831
return result

0 commit comments

Comments
 (0)