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.
This commit is contained in:
goon-foss 2026-08-27 12:08:24 +02:00
parent 9219c94c5a
commit ecca52b8bd

View file

@ -78,6 +78,8 @@ def _probe(page_url: str) -> str:
def main(argv: list[str] | None = None) -> int: def main(argv: list[str] | None = None) -> int:
p = argparse.ArgumentParser() p = argparse.ArgumentParser()
p.add_argument("--limit", type=int, default=0, help="ile źródeł sprawdzić (0 = wszystkie żywe)") 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") p.add_argument("--dry-run", action="store_true", help="nie oznaczaj, tylko policz")
a = p.parse_args(argv) a = p.parse_args(argv)
@ -87,9 +89,17 @@ def main(argv: list[str] | None = None) -> int:
for noisy in ("httpx", "httpcore", "urllib3"): for noisy in ("httpx", "httpcore", "urllib3"):
logging.getLogger(noisy).setLevel(logging.WARNING) 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""" sql = f"""
SELECT id, page_url FROM playback_sources SELECT id, page_url FROM playback_sources
WHERE origin = '{_ORIGIN}' AND dead_at IS NULL AND page_url IS NOT NULL WHERE origin = '{_ORIGIN}' AND dead_at IS NULL AND page_url IS NOT NULL
{_po_id}
ORDER BY id ORDER BY id
""" """
if a.limit: if a.limit: