From c67ff9d5b09db8cab8f54c082e7f5b3ad4e7d541 Mon Sep 17 00:00:00 2001 From: zzstoatzz Date: Thu, 6 Aug 2026 14:35:35 -0500 Subject: [PATCH] sweep: default to the deactivated cohort, not every non-active status MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit upstream_status != 'active' matched 880k accounts (deleted, takendown, historical inactive) — a multi-day run hammering plc.directory ~900k times. the migration bug only produces 'deactivated' (67k). --statuses all restores the old behavior. (operator patch) Co-Authored-By: Claude Fable 5 --- scripts/sweep_stale_upstream.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/scripts/sweep_stale_upstream.py b/scripts/sweep_stale_upstream.py index 2f88184..264e4f5 100644 --- a/scripts/sweep_stale_upstream.py +++ b/scripts/sweep_stale_upstream.py @@ -67,6 +67,12 @@ def main() -> None: parser = argparse.ArgumentParser() parser.add_argument("--apply", action="store_true", help="write corrections (default: dry run)") parser.add_argument("--limit", type=int, default=0, help="stop after N accounts (0 = all)") + parser.add_argument( + "--statuses", + default="deactivated", + help="comma-separated upstream_status values to sweep (default: deactivated — " + "the only state the migration bug produces; 'all' sweeps every non-active status)", + ) args = parser.parse_args() database_url = os.environ.get("DATABASE_URL") @@ -74,11 +80,19 @@ def main() -> None: sys.exit("DATABASE_URL is required") conn = psycopg.connect(database_url) - rows = conn.execute( - "SELECT uid, did, upstream_status FROM account" - " WHERE status = 'active' AND upstream_status != 'active' ORDER BY uid" - ).fetchall() - print(f"{len(rows)} candidate accounts (status=active, upstream_status!=active)") + if args.statuses == "all": + rows = conn.execute( + "SELECT uid, did, upstream_status FROM account" + " WHERE status = 'active' AND upstream_status != 'active' ORDER BY uid" + ).fetchall() + else: + statuses = [s.strip() for s in args.statuses.split(",") if s.strip()] + rows = conn.execute( + "SELECT uid, did, upstream_status FROM account" + " WHERE status = 'active' AND upstream_status = ANY(%s) ORDER BY uid", + (statuses,), + ).fetchall() + print(f"{len(rows)} candidate accounts (status=active, upstream_status in {args.statuses})") client = httpx.Client(timeout=10, headers={"user-agent": "zlay-sweep (atproto-relay)"}) checked = corrected = confirmed = failed = 0 -- 2.51.2