Multi-Hoster-Upload/tasks/todo.md
Administrator 17e9a419b2 fix(rotation): treat byse "disk space" as account-level, not file-rejected
Byse rejects uploads with status like "not enough disk space on your
account" when the account's storage is exhausted. The parser was
flagging every non-OK status as err.fileRejected=true, and the upload-
manager classifier additionally matched the generic "lehnte Datei ab"
prefix as file-rejected. Result: rotation was skipped on a full account
and every subsequent file failed on the same dead account.

- hosters.js: byse parser now distinguishes account-level phrases
  (disk space / storage / quota / insufficient / account full) and sets
  err.accountError=true for those. File-specific failures (Duplicate,
  wrong format, size) keep err.fileRejected=true.
- upload-manager.js: _isFileRejectedError no longer matches the generic
  "lehnte Datei ab" prefix and short-circuits when err.accountError is
  true. _shouldSkipRetryOnAccountError honors the flag and has added
  regex patterns as a safety net.
- Tests: 5 new unit tests covering disk-space/account-level/duplicate
  and the accountError-wins-over-fileRejected precedence.
2026-04-21 16:42:56 +02:00

2.3 KiB
Raw Permalink Blame History

Rotation-Bug: Byse "not enough disk space" wird als file-rejected klassifiziert

Problem

Log zeigt: Byse-Account ist voll ("not enough disk space on your account"), aber das System klassifiziert den Fehler als file-rejected und rotiert deshalb NICHT zum Fallback-Account. Jede nächste Datei landet beim selben vollen Account → endlose Fails.

Root Cause

  • lib/hosters.js:223-227 — Byse-Parser setzt err.fileRejected = true für JEDEN status-String der nicht ok/success/done ist.
  • lib/upload-manager.js:67_isFileRejectedError regex matcht generisch "lehnte Datei ab" → gilt für ALLE Byse-Errors unabhängig vom eigentlichen Grund.
  • Upload-manager flow: _isFileRejectedError → break retry → skip-rotation-file-rejected → return. Kein mark-failed, kein Fallback-Resolve. Account bleibt aktiv für die nächste Datei.

Fix

  • lib/hosters.js: Byse-Parser erkennt account-level phrases (disk space / storage / quota / insufficient / account full) → setzt err.accountError = true statt fileRejected.
  • lib/upload-manager.js_isFileRejectedError: generischen lehnte Datei ab Match entfernt. Explicit: accountError === true → früher out (ist NICHT file-rejected).
  • lib/upload-manager.js_shouldSkipRetryOnAccountError: honoriert err.accountError === true Flag. Patterns erweitert um disk-space/storage/quota/account-voll Phrasen (Safety-Net falls Flag mal fehlt).
  • tests/upload-manager.test.js: 5 neue Tests für die Klassifikation (disk-space ist account-level; Duplicate bleibt file-rejected; accountError gewinnt gegen fileRejected).
  • npm test — 76/76 grün.
  • Release als 3.1.4 (auf User-OK).

Expected Behavior nach Fix

Log-Pattern ab Fix:

[retries-exhausted] hoster=byse.sx ... lastError=Byse lehnte Datei ab: 0:0:0:not enough disk space...
[mark-failed] hoster=byse.sx accountId=byse.sx-1773722669098-qc45
[switchAccount] hoster=byse.sx → fallback byse.sx-XXXXX
[rotate] hoster=byse.sx → nächster Account

Bei Fast-Fail (über _shouldSkipRetryOnAccountError) entfällt der 5×3s Retry-Wait → rotation setzt sofort ein.

Review

Zwei-Schichten-Ansatz: Byse-Parser setzt explicit accountError Flag (richtige Stelle weil der Parser den status-String direkt sieht), Upload-Manager honoriert den Flag und hat parallel Regex-Safety-Net. Test deckt beide Pfade ab.