From fd1522abeedf5c710f07eafb8f0a9e2ed07ebab2 Mon Sep 17 00:00:00 2001 From: justin Date: Sun, 14 Jun 2026 21:26:38 -0500 Subject: [PATCH] mx_tag: per-call Resolver (dns Resolver not thread-safe -- was deadlocking) --- scripts/mx_tag_carriers.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/scripts/mx_tag_carriers.py b/scripts/mx_tag_carriers.py index cec97f1..d2ebaaa 100644 --- a/scripts/mx_tag_carriers.py +++ b/scripts/mx_tag_carriers.py @@ -32,15 +32,14 @@ DB_URL = os.getenv("DATABASE_URL", "") # Fast, bounded MX resolution (the shared verifier uses an 8s+6s lifetime which # is far too slow for bulk tagging across many dead domains). 3s, no A-fallback. -_resolver = dns.resolver.Resolver() -_resolver.lifetime = 3.0 -_resolver.timeout = 3.0 - - +# A dns.resolver.Resolver is NOT thread-safe, so each call uses its own. def classify(domain: str) -> str: + r = dns.resolver.Resolver() + r.lifetime = 3.0 + r.timeout = 3.0 try: - ans = _resolver.resolve(domain, "MX") - hosts = " ".join(str(r.exchange).rstrip(".") for r in ans).lower() + ans = r.resolve(domain, "MX") + hosts = " ".join(str(rr.exchange).rstrip(".") for rr in ans).lower() except Exception: return "no_mx" if "protection.outlook" in hosts or "outlook.com" in hosts or "office365" in hosts: