Modeldownload blijft eeuwig bezig bij een TLS-fout en blokkeert elke volgende download #2756

Open
opened 2026-11-02 23:47:00 +00:00 by brenno · 1 comment
Owner

Gevonden in de kritische review van 03-11-2026 (stabiliteit).

Wat er misgaat

Faalt de download van een whisper-model op TLS — een bedrijfsproxy die TLS onderschept, een verlopen certificaat, een captive portal — dan blijft de modelkaart voorgoed op "bezig". Elke volgende download, ook van een ander model, is daarna geweigerd tot de app opnieuw start. Het .part-bestand blijft liggen.

Oorzaak

lib/services/transcription/model_download_io.dart: _run draait unawaited (r. 62) en vangt alleen ModelDownloadException, SocketException, HttpException, TimeoutException en FileSystemException (r. 162–190). HandshakeException en CertificateException erven van TlsException, en die implementeert IOException, niet SocketException. Zo'n fout loopt _run uit als onafgehandelde asynchrone fout, en handle._fail wordt nooit aangeroepen.

TranscriptionModelManager.download (lib/state/transcription_model_provider.dart r. 256) wacht op handle.done, die dus nooit voltooit. Daardoor:

  • staat downloading: true voorgoed in de status;
  • wordt _active.remove(model.id) (r. 286) nooit bereikt, en weigert de wachter bovenaan download elke nieuwe poging (_active.isNotEmpty).

Hetzelfde geldt voor elke andere onverwachte worp in _run (bijvoorbeeld een ArgumentError uit Uri.resolve op een kapotte Location).

Voorstel

  • SocketException/HttpException vervangen door IOException (na FileSystemException, dat ook een IOException is), zodat TLS als netwerkfout telt.
  • Een laatste on Object-vangst, zodat done altijd afloopt en .part altijd opgeruimd wordt.

Wat overeind moet blijven

  • De bestaande foutsoorten en hun meldingen (geannuleerd, geweigerd, hash, schijf).
  • Hash-verificatie vóór de atomaire hernoeming.

Test

Een downloadtoets met een ModelFetch die een HandshakeException gooit: done faalt met networkFailed en .part is weg. Op de huidige code verloopt de toets op een time-out.

Gevonden in de kritische review van 03-11-2026 (stabiliteit). ## Wat er misgaat Faalt de download van een whisper-model op TLS — een bedrijfsproxy die TLS onderschept, een verlopen certificaat, een captive portal — dan blijft de modelkaart voorgoed op "bezig". Elke volgende download, ook van een ander model, is daarna geweigerd tot de app opnieuw start. Het `.part`-bestand blijft liggen. ## Oorzaak `lib/services/transcription/model_download_io.dart`: `_run` draait `unawaited` (r. 62) en vangt alleen `ModelDownloadException`, `SocketException`, `HttpException`, `TimeoutException` en `FileSystemException` (r. 162–190). `HandshakeException` en `CertificateException` erven van `TlsException`, en die implementeert `IOException`, niet `SocketException`. Zo'n fout loopt `_run` uit als onafgehandelde asynchrone fout, en `handle._fail` wordt nooit aangeroepen. `TranscriptionModelManager.download` (`lib/state/transcription_model_provider.dart` r. 256) wacht op `handle.done`, die dus nooit voltooit. Daardoor: - staat `downloading: true` voorgoed in de status; - wordt `_active.remove(model.id)` (r. 286) nooit bereikt, en weigert de wachter bovenaan `download` elke nieuwe poging (`_active.isNotEmpty`). Hetzelfde geldt voor elke andere onverwachte worp in `_run` (bijvoorbeeld een `ArgumentError` uit `Uri.resolve` op een kapotte `Location`). ## Voorstel - `SocketException`/`HttpException` vervangen door `IOException` (na `FileSystemException`, dat ook een `IOException` is), zodat TLS als netwerkfout telt. - Een laatste `on Object`-vangst, zodat `done` *altijd* afloopt en `.part` altijd opgeruimd wordt. ## Wat overeind moet blijven - De bestaande foutsoorten en hun meldingen (geannuleerd, geweigerd, hash, schijf). - Hash-verificatie vóór de atomaire hernoeming. ## Test Een downloadtoets met een `ModelFetch` die een `HandshakeException` gooit: `done` faalt met `networkFailed` en `.part` is weg. Op de huidige code verloopt de toets op een time-out.
Author
Owner

Opgepakt (kritische review 03-11-2026). Tak: fix/model-download-tls-2756. Verwachte reikwijdte: lib/services/transcription/model_download_io.dart, test/transcription/model_download_test.dart.

Opgepakt (kritische review 03-11-2026). Tak: fix/model-download-tls-2756. Verwachte reikwijdte: lib/services/transcription/model_download_io.dart, test/transcription/model_download_test.dart.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
LibreKAT/Ocideck#2756
No description provided.