Skip to content

Commit 52562d1

Browse files
authored
Merge pull request #478 from Hritik14/velocity
Improve import time
2 parents 1ca9ece + e354f9a commit 52562d1

1 file changed

Lines changed: 28 additions & 33 deletions

File tree

vulnerabilities/import_runner.py

Lines changed: 28 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
from typing import Tuple
3232

3333
from django.core import serializers
34+
from django.db import transaction
3435

3536
from vulnerabilities import models
3637
from vulnerabilities.data_source import Advisory, DataSource
@@ -110,6 +111,7 @@ def get_vuln_pkg_refs(vulnerability, package):
110111
)
111112

112113

114+
@transaction.atomic
113115
def process_advisories(data_source: DataSource) -> None:
114116
bulk_create_vuln_pkg_refs = set()
115117
# Treat updated_advisories and added_advisories as same. Eventually
@@ -118,46 +120,39 @@ def process_advisories(data_source: DataSource) -> None:
118120
advisory_batches = chain(data_source.updated_advisories(), data_source.added_advisories())
119121
for batch in advisory_batches:
120122
for advisory in batch:
121-
try:
122-
vuln, vuln_created = _get_or_create_vulnerability(advisory)
123-
for vuln_ref in advisory.references:
124-
ref, _ = models.VulnerabilityReference.objects.get_or_create(
125-
vulnerability=vuln, reference_id=vuln_ref.reference_id, url=vuln_ref.url
126-
)
127-
128-
for score in vuln_ref.severities:
129-
models.VulnerabilitySeverity.objects.update_or_create(
130-
vulnerability=vuln,
131-
scoring_system=score.system.identifier,
132-
reference=ref,
133-
defaults={"value": str(score.value)},
134-
)
135-
136-
for aff_pkg_with_patched_pkg in advisory.affected_packages:
137-
vulnerable_package, _ = _get_or_create_package(
138-
aff_pkg_with_patched_pkg.vulnerable_package
139-
)
140-
patched_package = None
141-
if aff_pkg_with_patched_pkg.patched_package:
142-
patched_package, _ = _get_or_create_package(
143-
aff_pkg_with_patched_pkg.patched_package
144-
)
123+
vuln, vuln_created = _get_or_create_vulnerability(advisory)
124+
for vuln_ref in advisory.references:
125+
ref, _ = models.VulnerabilityReference.objects.get_or_create(
126+
vulnerability=vuln, reference_id=vuln_ref.reference_id, url=vuln_ref.url
127+
)
145128

146-
prv, _ = models.PackageRelatedVulnerability.objects.get_or_create(
129+
for score in vuln_ref.severities:
130+
models.VulnerabilitySeverity.objects.update_or_create(
147131
vulnerability=vuln,
148-
package=vulnerable_package,
132+
scoring_system=score.system.identifier,
133+
reference=ref,
134+
defaults={"value": str(score.value)},
149135
)
150136

151-
if patched_package:
152-
prv.patched_package = patched_package
153-
prv.save()
137+
for aff_pkg_with_patched_pkg in advisory.affected_packages:
138+
vulnerable_package, _ = _get_or_create_package(
139+
aff_pkg_with_patched_pkg.vulnerable_package
140+
)
141+
patched_package = None
142+
if aff_pkg_with_patched_pkg.patched_package:
143+
patched_package, _ = _get_or_create_package(
144+
aff_pkg_with_patched_pkg.patched_package
145+
)
154146

155-
except Exception:
156-
# TODO: store error but continue
157-
logger.error(
158-
f"Failed to process advisory: {advisory!r}:\n" + traceback.format_exc()
147+
prv, _ = models.PackageRelatedVulnerability.objects.get_or_create(
148+
vulnerability=vuln,
149+
package=vulnerable_package,
159150
)
160151

152+
if patched_package:
153+
prv.patched_package = patched_package
154+
prv.save()
155+
161156
models.PackageRelatedVulnerability.objects.bulk_create(
162157
[i.to_model_object() for i in bulk_create_vuln_pkg_refs]
163158
)

0 commit comments

Comments
 (0)