diff --git a/app/services/qualys_service.py b/app/services/qualys_service.py index 5bb626e..af7b5ac 100644 --- a/app/services/qualys_service.py +++ b/app/services/qualys_service.py @@ -959,18 +959,25 @@ def compute_vuln_dashboard(db, triggered_by="manual", run_id=None): """)).fetchall() asset_count = len(rows) - # 5. Recuperer vulns par batch de 50 IPs (cache 10min via get_vuln_counts) + # 5. Recuperer vulns par batch de 50 IPs en parallele (cache 10min via get_vuln_counts) + # Une session par thread pour eviter les conflits SQLAlchemy + from app.database import SessionLocal ip_to_vuln = {} unique_ips = list({str(r.ip_address) for r in rows if r.ip_address and str(r.ip_address) != "None"}) - for i in range(0, len(unique_ips), 50): - batch = unique_ips[i:i+50] + batches = [unique_ips[i:i+50] for i in range(0, len(unique_ips), 50)] + def _fetch_vuln_batch(batch): + s = SessionLocal() try: - vmap = get_vuln_counts(db, ",".join(batch)) + return get_vuln_counts(s, ",".join(batch)) + except Exception: + return {} + finally: + s.close() + with ThreadPoolExecutor(max_workers=8) as ex: + for vmap in ex.map(_fetch_vuln_batch, batches): if vmap: ip_to_vuln.update(vmap) - except Exception: - pass # 6. Classifier + agreger en utilisant les associations API agg = {}