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.
31 lines
2.3 KiB
Markdown
31 lines
2.3 KiB
Markdown
# 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
|
||
- [x] `lib/hosters.js`: Byse-Parser erkennt account-level phrases (disk space / storage / quota / insufficient / account full) → setzt `err.accountError = true` statt `fileRejected`.
|
||
- [x] `lib/upload-manager.js` — `_isFileRejectedError`: generischen `lehnte Datei ab` Match entfernt. Explicit: `accountError === true` → früher out (ist NICHT file-rejected).
|
||
- [x] `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).
|
||
- [x] `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).
|
||
- [x] `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.
|