[Robuustheid][P2] Afsluiten kan blijven hangen of stil mislukken (onbegrensde best-effort-stappen) #2631

Closed
opened 2026-10-28 16:31:47 +00:00 by brenno · 0 comments
Owner

Symptoom

Op het kruisje klikken doet soms niets, of het afsluiten duurt lang. De gebruiker sluit de app dan via Taakbeheer — wat weer het risico op een beschadigd instellingenbestand met zich meebrengt (#2628).

Oorzaak

Het native venster onderschept het sluiten (willClose-hook, lib/platform/native_window_io.dart:21-37) en laat de shell beslissen (AppShell._onWillClose/_handleClose, lib/widgets/app_shell.dart:475-508). Twee zwakke plekken:

  1. _destroy (regel 510-535) wacht onbegrensd op best-effort-stappen vóór quitApp():
    • closeLessonSession per OciServe-les — een netwerkaanroep;
    • stopRecordingBeforeQuit (lib/widgets/shell/recording_lifecycle.dart:64-68) — zonder time-out en zonder catch;
    • alleen leaveMeetingBeforeQuit heeft een time-out (5 s) en vangt fouten (meeting_lifecycle.dart:16-27).
      Gooit een stap, dan breekt _handleClose af, wordt _closeInProgress teruggezet, en blijft het venster zonder melding open.
  2. Sluiten vergt een vrije UI-isolate. Is die bezet (een synchrone gezichtsscan, een documentexport, een lange documentsync — #2619, #2629, #2621), dan wordt de klik pas verwerkt als dat klaar is. Voor de gebruiker is dat "hij reageert niet eens op sluiten".

Voorgestelde oplossing

  1. Elke best-effort-stap in _destroy hetzelfde behandelen als leaveMeetingBeforeQuit: timeout + catch + logregel, en quitApp() altijd bereiken. Netwerkstappen hooguit 2-3 s.
  2. Duurt afsluiten langer dan ~5 s: een dialoog "Afsluiten duurt lang — toch afsluiten?" (opgeslagen werk is dan al veilig; herstelbestanden blijven staan).
  3. Dit wordt pas echt robuust als de UI-isolate niet langdurig bezet raakt (#2619, #2629, #2621).

Toets

Widgettest: stopAll gooit → quitApp wordt toch aangeroepen; closeLessonSession hangt → na de time-out alsnog quitApp.

Onderdeel van de prestatie- en stabiliteitsinspectie van 28-10-2026 (EPIC #2637).

## Symptoom Op het kruisje klikken doet soms niets, of het afsluiten duurt lang. De gebruiker sluit de app dan via Taakbeheer — wat weer het risico op een beschadigd instellingenbestand met zich meebrengt (#2628). ## Oorzaak Het native venster onderschept het sluiten (`willClose`-hook, `lib/platform/native_window_io.dart:21-37`) en laat de shell beslissen (`AppShell._onWillClose`/`_handleClose`, `lib/widgets/app_shell.dart:475-508`). Twee zwakke plekken: 1. **`_destroy` (regel 510-535) wacht onbegrensd op best-effort-stappen** vóór `quitApp()`: - `closeLessonSession` per OciServe-les — een netwerkaanroep; - `stopRecordingBeforeQuit` (`lib/widgets/shell/recording_lifecycle.dart:64-68`) — **zonder time-out en zonder `catch`**; - alleen `leaveMeetingBeforeQuit` heeft een time-out (5 s) en vangt fouten (`meeting_lifecycle.dart:16-27`). Gooit een stap, dan breekt `_handleClose` af, wordt `_closeInProgress` teruggezet, en blijft het venster zonder melding open. 2. **Sluiten vergt een vrije UI-isolate.** Is die bezet (een synchrone gezichtsscan, een documentexport, een lange documentsync — #2619, #2629, #2621), dan wordt de klik pas verwerkt als dat klaar is. Voor de gebruiker is dat "hij reageert niet eens op sluiten". ## Voorgestelde oplossing 1. Elke best-effort-stap in `_destroy` hetzelfde behandelen als `leaveMeetingBeforeQuit`: `timeout` + `catch` + logregel, en `quitApp()` altijd bereiken. Netwerkstappen hooguit 2-3 s. 2. Duurt afsluiten langer dan ~5 s: een dialoog "Afsluiten duurt lang — toch afsluiten?" (opgeslagen werk is dan al veilig; herstelbestanden blijven staan). 3. Dit wordt pas echt robuust als de UI-isolate niet langdurig bezet raakt (#2619, #2629, #2621). ## Toets Widgettest: `stopAll` gooit → `quitApp` wordt toch aangeroepen; `closeLessonSession` hangt → na de time-out alsnog `quitApp`. Onderdeel van de prestatie- en stabiliteitsinspectie van 28-10-2026 (EPIC #2637).
brenno 2026-10-29 12:20:06 +00:00
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#2631
No description provided.