Skip to content

Instantly share code, notes, and snippets.

@CarstenG2
Created April 5, 2026 14:14
Show Gist options
  • Select an option

  • Save CarstenG2/2d0136d3e1d9b36c094a449f378d0745 to your computer and use it in GitHub Desktop.

Select an option

Save CarstenG2/2d0136d3e1d9b36c094a449f378d0745 to your computer and use it in GitHub Desktop.
Hoster Exponential Backoff - Design Doc

Exponential Backoff (implementiert)

Hoster mit wiederholten Fehlern bekommen progressive Sperre:

1st fail -> 5s, 2nd -> 10s, 3rd -> 20s, 4th -> 30s, 5th -> 60s, 6th -> 300s, 7th+ -> 3600s (max)

Success resettet consecutive_fails auf 0.

Schema-Erweiterung (hoster-Tabelle)

  • consecutive_fails INTEGER DEFAULT 0 -- Anzahl Fehler in Folge ohne Erfolg
  • backoff_until INTEGER DEFAULT 0 -- Unix-Timestamp bis wann der Hoster gesperrt ist

Zwei Filterstufen

Kontext Funktion Logik
Vordergrund-Scan (sourcesFilter) hoster_healthy(name) consecutive_fails == 0 -- streng, zeigt nur gesunde Hoster
BG-Precacher (Dispatch-Queries) backoff_until <= now in SQL Zeitbasiert -- probiert nach Ablauf nochmal
BG-Probe (sources.py) hoster_available(name, cooldown=0) Zeitbasiert wie Precacher

Vordergrund ist strenger: Hoster mit consecutive_fails > 0 werden dem User gar nicht angezeigt. BG-Precacher probiert nach Backoff-Ablauf nochmal -- ein Erfolg dort resettet den Counter und macht den Hoster auch im Vordergrund wieder sichtbar.

Tracking-Stellen

hoster_touch(name, success) wird aufgerufen in:

Datei Stelle Kontext
precacher.py _resolve_single() BG-Precacher Resolve OK/Fail
precacher.py _mediainfo_single() BG-Precacher Probe OK/Fail
sources.py sourcesResolve() Vordergrund-Klick, Autoplay, Trailer
sources.py _probe_single() BG-Probe nach Foreground-Scan

Netzwerk-Ausfall-Schutz

Problem: Bei Netzwerk-Ausfall schlagen alle Hoster gleichzeitig fehl -> alle im Backoff -> naechster Scan zeigt 0 Quellen obwohl kein Hoster defekt ist.

Loesung: _last_success_at Modul-Level-Timestamp in sourcecacheDB.py.

  • Wird bei jedem hoster_touch(success=True) auf now gesetzt
  • hoster_touch(success=False) prueft: wenn _last_success_at aelter als 30s, war wahrscheinlich das Netz down -> Fail wird NICHT gezaehlt (kein Backoff-Increment)
  • Sobald das Netz wieder da ist und ein Hoster Erfolg hat, laeuft alles normal weiter

Logging

  • [xShip-Backoff] name: N consecutive fails, backoff Xs -- bei 4+ consecutive fails
  • [sourcesFilter] N Quellen entfernt (Hoster fehlerhaft) -- Vordergrund-Filter
  • [BG-Probe] N Quellen uebersprungen (Hoster im Backoff) -- BG-Probe-Filter
  • Hoster-Stats am Ende jedes Precache-Zyklus zeigen backoff N fails
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment