Skip to content

Commit bb5c006

Browse files
committed
Do not keep new advisories in memory while importing
Signed-off-by: Keshav Priyadarshi <git@keshav.space>
1 parent 3ea12c3 commit bb5c006

File tree

2 files changed

+29
-26
lines changed

2 files changed

+29
-26
lines changed

vulnerabilities/pipelines/__init__.py

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,15 @@
1010
import logging
1111
from datetime import datetime
1212
from datetime import timezone
13-
from traceback import format_exc as traceback_format_exc
1413
from typing import Iterable
1514

1615
from aboutcode.pipeline import BasePipeline
1716
from aboutcode.pipeline import LoopProgress
1817

1918
from vulnerabilities.importer import AdvisoryData
2019
from vulnerabilities.improver import MAX_CONFIDENCE
21-
from vulnerabilities.pipes.importer import import_advisory
22-
from vulnerabilities.pipes.importer import insert_advisory
20+
from vulnerabilities.models import Advisory
21+
from vulnerabilities.pipes import advisory
2322
from vulnerabilities.utils import classproperty
2423

2524
module_logger = logging.getLogger(__name__)
@@ -83,38 +82,40 @@ def advisories_count(self) -> int:
8382
raise NotImplementedError
8483

8584
def collect_and_store_advisories(self):
86-
self.new_advisories = []
87-
8885
collected_advisory_count = 0
8986
progress = LoopProgress(total_iterations=self.advisories_count(), logger=self.log)
9087
for advisory in progress.iter(self.collect_advisories()):
91-
new_advisory = insert_advisory(
88+
if _obj := advisory.insert_advisory(
9289
advisory=advisory,
9390
pipeline_name=self.qualified_name,
9491
logger=self.log,
95-
)
96-
if new_advisory:
97-
self.new_advisories.append(new_advisory)
98-
collected_advisory_count += 1
92+
):
93+
collected_advisory_count += 1
9994

10095
self.log(f"Successfully collected {collected_advisory_count:,d} advisories")
10196

10297
def import_new_advisories(self):
103-
new_advisories_count = len(self.new_advisories)
98+
new_advisories = Advisory.objects.filter(
99+
created_by=self.qualified_name,
100+
date_imported__isnull=True,
101+
)
102+
103+
new_advisories_count = new_advisories.count()
104+
105+
self.log(f"Importing {new_advisories_count:,d} new advisories")
104106

105107
imported_advisory_count = 0
106108
progress = LoopProgress(total_iterations=new_advisories_count, logger=self.log)
107-
for advisory in progress.iter(self.new_advisories):
109+
for advisory in progress.iter(new_advisories.paginated()):
108110
self.import_advisory(advisory=advisory)
109-
imported_advisory_count += 1
111+
if advisory.date_imported:
112+
imported_advisory_count += 1
110113

111114
self.log(f"Successfully imported {imported_advisory_count:,d} new advisories")
112115

113-
def import_advisory(self, advisory) -> None:
114-
if advisory.date_imported:
115-
return
116+
def import_advisory(self, advisory: Advisory) -> int:
116117
try:
117-
import_advisory(
118+
advisory.import_advisory(
118119
advisory=advisory,
119120
pipeline_name=self.qualified_name,
120121
confidence=self.advisory_confidence,
Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,28 +26,30 @@
2626
from vulnerabilities.models import Weakness
2727

2828

29-
def insert_advisory(advisory: AdvisoryData, pipeline_name: str, logger: Callable):
29+
def insert_advisory(advisory: AdvisoryData, pipeline_name: str, logger: Callable = None):
30+
obj = None
3031
try:
31-
obj, created = Advisory.objects.get_or_create(
32+
obj, _ = Advisory.objects.get_or_create(
3233
aliases=advisory.aliases,
3334
summary=advisory.summary,
3435
affected_packages=[pkg.to_dict() for pkg in advisory.affected_packages],
3536
references=[ref.to_dict() for ref in advisory.references],
3637
date_published=advisory.date_published,
3738
weaknesses=advisory.weaknesses,
39+
url=advisory.url,
3840
defaults={
3941
"created_by": pipeline_name,
4042
"date_collected": datetime.now(timezone.utc),
4143
},
42-
url=advisory.url,
4344
)
44-
if created:
45-
return obj
4645
except Exception as e:
47-
logger(
48-
f"Error while processing {advisory!r} with aliases {advisory.aliases!r}: {e!r} \n {traceback_format_exc()}",
49-
level=logging.ERROR,
50-
)
46+
if logger:
47+
logger(
48+
f"Error while processing {advisory!r} with aliases {advisory.aliases!r}: {e!r} \n {traceback_format_exc()}",
49+
level=logging.ERROR,
50+
)
51+
52+
return obj
5153

5254

5355
@transaction.atomic

0 commit comments

Comments
 (0)