From ecca52b8bda248e156574bbdb36af980b6311b06 Mon Sep 17 00:00:00 2001 From: goon-foss Date: Thu, 27 Aug 2026 12:08:24 +0200 Subject: [PATCH] perf(sxyprn): wznawiaj reaper od granicy zamiast mielic potwierdzone zywe Po wznowieniu przerwanego przebiegu pierwsza porcja dala 498 zywych i ZERO martwych, przy sredniej 35%. Powod: przebieg idzie `ORDER BY id`, a poprzedni zdazyl sprawdzic 151 tys. pozycji. Martwe wypadly ze zbioru, ale 100 763 POTWIERDZONYCH JAKO ZYWE zostalo i skrypt sprawdzal je po raz drugi. To 73% pracy i tyle samo zbednych zadan do sxyprn, czyli dokladnie to, czego chcialem uniknac przy tym zrodle. Dolozony `--after-id`: pomija wszystko o id <= podanego. Granice bierze sie z bazy jako najwyzsze id wsrod juz oznaczonych (`max(id::text)::uuid`), sposob zapisany w komentarzu przy zapytaniu. Sprawdzone, ze granica jest wlasciwa: przed nia 0 martwych na 500, zaraz za nia 6 martwych na 10. Do zrobienia zostalo 37 391 zamiast 138 154. --- scripts/sxyprn_reap_dead.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/scripts/sxyprn_reap_dead.py b/scripts/sxyprn_reap_dead.py index 2dc6ad7..91a8f46 100644 --- a/scripts/sxyprn_reap_dead.py +++ b/scripts/sxyprn_reap_dead.py @@ -78,6 +78,8 @@ def _probe(page_url: str) -> str: def main(argv: list[str] | None = None) -> int: p = argparse.ArgumentParser() p.add_argument("--limit", type=int, default=0, help="ile źródeł sprawdzić (0 = wszystkie żywe)") + p.add_argument("--after-id", default=None, + help="pomin zrodla o id <= podanego (wznowienie przerwanego przebiegu)") p.add_argument("--dry-run", action="store_true", help="nie oznaczaj, tylko policz") a = p.parse_args(argv) @@ -87,9 +89,17 @@ def main(argv: list[str] | None = None) -> int: for noisy in ("httpx", "httpcore", "urllib3"): logging.getLogger(noisy).setLevel(logging.WARNING) + # Wznowienie bez mielenia od nowa: przebieg idzie ZAWSZE `ORDER BY id`, więc wszystko + # poniżej podanego id zostało już sprawdzone. Bez tego wznowienie po przerwaniu + # sprawdzało ponownie 100 tys. źródeł POTWIERDZONYCH jako żywe, czyli 73% pracy i + # tyle samo zbędnych żądań do sxyprn (2026-08-27). Granicę bierzesz z bazy: + # SELECT max(id::text)::uuid FROM playback_sources + # WHERE dead_reason = 'sxyprn-reap: Post Not Found'; + _po_id = f"AND id > '{a.after_id}'" if a.after_id else "" sql = f""" SELECT id, page_url FROM playback_sources WHERE origin = '{_ORIGIN}' AND dead_at IS NULL AND page_url IS NOT NULL + {_po_id} ORDER BY id """ if a.limit: