Skip to content

Commit f971d9d

Browse files
committed
Optimize package risk score calculation
Signed-off-by: Tushar Goel <tushar.goel.dav@gmail.com>
1 parent faf4d88 commit f971d9d

File tree

1 file changed

+25
-23
lines changed

1 file changed

+25
-23
lines changed

vulnerabilities/pipelines/v2_improvers/compute_package_risk.py

Lines changed: 25 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
# See https://aboutcode.org for more information about nexB OSS projects.
88
#
99
from aboutcode.pipeline import LoopProgress
10+
from django.db.models import Max
1011
from django.db.models import Prefetch
1112

1213
from vulnerabilities.models import AdvisoryExploit
@@ -15,7 +16,6 @@
1516
from vulnerabilities.models import AdvisoryV2
1617
from vulnerabilities.models import PackageV2
1718
from vulnerabilities.pipelines import VulnerableCodePipeline
18-
from vulnerabilities.risk import compute_package_risk_v2
1919
from vulnerabilities.risk import compute_vulnerability_risk_factors
2020

2121

@@ -130,45 +130,47 @@ def compute_and_store_vulnerability_risk_score(self):
130130
)
131131

132132
def compute_and_store_package_risk_score(self):
133-
affected_packages = (PackageV2.objects.filter(affected_in_impacts__isnull=False)).distinct()
133+
qs = (
134+
PackageV2.objects.filter(affected_in_impacts__advisory__risk_score__isnull=False)
135+
.annotate(computed_risk=Max("affected_in_impacts__advisory__risk_score"))
136+
.only("id")
137+
)
134138

135-
self.log(f"Calculating risk for {affected_packages.count():,d} affected package records")
139+
estimated = qs.count()
136140

137141
progress = LoopProgress(
138-
total_iterations=affected_packages.count(),
142+
total_iterations=estimated,
139143
logger=self.log,
140144
progress_step=5,
141145
)
142146

143-
updatables = []
144-
updated_package_count = 0
145-
batch_size = 1000
147+
self.log(f"Computing risk for {estimated:,d} packages")
146148

147-
for package in progress.iter(affected_packages.iterator(chunk_size=batch_size)):
148-
try:
149-
risk_score = compute_package_risk_v2(package)
150-
if not risk_score:
151-
continue
152-
package.risk_score = risk_score
153-
updatables.append(package)
154-
except Exception as e:
155-
self.log(f"Error computing risk score for package {package.purl}: {e}")
156-
continue
149+
batch = []
150+
batch_size = 5000
151+
updated = 0
157152

158-
if len(updatables) >= batch_size:
159-
updated_package_count += bulk_update(
153+
for pkg in progress.iter(qs.iterator(chunk_size=batch_size)):
154+
155+
pkg.risk_score = round(float(pkg.computed_risk), 1)
156+
batch.append(pkg)
157+
158+
if len(batch) >= batch_size:
159+
updated += bulk_update(
160160
model=PackageV2,
161-
items=updatables,
161+
items=batch,
162162
fields=["risk_score"],
163163
logger=self.log,
164164
)
165-
updated_package_count += bulk_update(
165+
batch.clear()
166+
167+
updated += bulk_update(
166168
model=PackageV2,
167-
items=updatables,
169+
items=batch,
168170
fields=["risk_score"],
169171
logger=self.log,
170172
)
171-
self.log(f"Successfully added risk score for {updated_package_count:,d} package")
173+
self.log(f"Successfully added risk score for {updated:,d} package")
172174

173175

174176
def bulk_update(model, items, fields, logger):

0 commit comments

Comments
 (0)