Skip to content

Commit 35d0776

Browse files
committed
Make marking pipeline efficient
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent c4f516c commit 35d0776

2 files changed

Lines changed: 23 additions & 34 deletions

File tree

vulnerabilities/pipelines/v2_improvers/mark_unfurl_version_range.py

Lines changed: 18 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -36,26 +36,9 @@ class MarkUnfurlVersionRangePipeline(VulnerableCodePipeline):
3636

3737
@classmethod
3838
def steps(cls):
39-
return (
40-
cls.mark_all_impacts_unfurled_successfully,
41-
cls.mark_all_impacts_unfurl_attempted,
42-
)
43-
44-
def mark_all_impacts_unfurled_successfully(self):
45-
impacted_packages = ImpactedPackage.objects.all()
46-
while True:
47-
advisory_ids = list(
48-
latest_advisories_with_all_impacts_unfurled_successfully(
49-
impacted_packages=impacted_packages
50-
)[:100]
51-
)
52-
53-
if not advisory_ids:
54-
break
55-
56-
complete_advisories_import(advisory_ids=advisory_ids, success=True)
39+
return (cls.mark_all_impacts_unfurled,)
5740

58-
def mark_all_impacts_unfurl_attempted(self):
41+
def mark_all_impacts_unfurled(self):
5942
impacted_packages = ImpactedPackage.objects.all()
6043
advisories_qs = latest_advisories_with_all_impacts_unfurled_attempted(
6144
impacted_packages=impacted_packages
@@ -64,18 +47,26 @@ def mark_all_impacts_unfurl_attempted(self):
6447
batch_size = 100
6548
batch = []
6649

50+
successful_qs = latest_advisories_with_all_impacts_unfurled_successfully(
51+
impacted_packages=impacted_packages,
52+
)
53+
6754
for advisory_id in advisories_qs.iterator(chunk_size=100):
6855
batch.append(advisory_id)
6956

7057
if len(batch) >= batch_size:
58+
successful_ids = set(successful_qs.filter(id__in=list(batch)))
59+
7160
complete_advisories_import(
72-
advisory_ids=list(batch),
61+
advisory_ids=list(batch), successful_advisory_ids=successful_ids
7362
)
7463
batch.clear()
7564

7665
if batch:
66+
successful_ids = set(successful_qs.filter(id__in=list(batch)))
67+
7768
complete_advisories_import(
78-
advisory_ids=list(batch),
69+
advisory_ids=list(batch), successful_advisory_ids=successful_ids
7970
)
8071

8172

@@ -121,15 +112,17 @@ def latest_advisories_with_all_impacts_unfurled_attempted(
121112

122113

123114
@transaction.atomic
124-
def complete_advisories_import(advisory_ids, success=False):
115+
def complete_advisories_import(advisory_ids, successful_advisory_ids=[]):
125116
if not advisory_ids:
126117
return
127118

128119
AdvisoryV2.objects.filter(id__in=advisory_ids).update(_all_impacts_unfurled=True)
129120

130-
if success:
131-
AdvisoryV2.objects.filter(id__in=advisory_ids).update(
132-
_all_impacts_unfurled_successfully=True
121+
if successful_advisory_ids:
122+
AdvisoryV2.objects.filter(
123+
id__in=successful_advisory_ids,
124+
).update(
125+
_all_impacts_unfurled_successfully=True,
133126
)
134127

135128
affecting_package_ids = set(

vulnerabilities/tests/pipelines/v2_improvers/test_mark_all_impacts_unfurled.py

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,11 @@ def test_marks_only_fully_successful_advisories(
8282

8383
pipeline = MarkUnfurlVersionRangePipeline()
8484

85-
pipeline.mark_all_impacts_unfurled_successfully()
85+
pipeline.mark_all_impacts_unfurled()
8686

8787
mock_complete_advisories_import.assert_called_once_with(
88-
advisory_ids=[advisory_a.id],
89-
success=True,
88+
advisory_ids=[advisory_a.id, advisory_b.id],
89+
successful_advisory_ids={advisory_a.id},
9090
)
9191

9292

@@ -149,11 +149,7 @@ def test_marks_only_fully_attempted_advisories(
149149

150150
pipeline = MarkUnfurlVersionRangePipeline()
151151

152-
pipeline.mark_all_impacts_unfurl_attempted()
153-
154-
mock_complete_advisories_import.assert_called_once_with(
155-
advisory_ids=[advisory_a.id],
156-
)
152+
pipeline.mark_all_impacts_unfurled()
157153

158154
ids = latest_advisories_with_all_impacts_unfurled_attempted(
159155
impacted_packages=ImpactedPackage.objects.all()
@@ -201,7 +197,7 @@ def test_attempted_advisories_are_chunked_in_batches_of_100(
201197

202198
pipeline = MarkUnfurlVersionRangePipeline()
203199

204-
pipeline.mark_all_impacts_unfurl_attempted()
200+
pipeline.mark_all_impacts_unfurled()
205201

206202
assert mock_complete_advisories_import.call_count == 3
207203

0 commit comments

Comments
 (0)