[Prestaties][P0] Voer presentatievalidatie en parsing buiten de UI-isolate uit #875

Closed
opened 2026-07-26 09:06:29 +00:00 by brenno · 2 comments
Owner

Probleem

PresentationImportService.prepare en de importers hebben een asynchrone API, maar formaatvalidatie, ZIP-decodering, XML-parsing, IWA/Snappy-decompressie, reconstructie en classificatie draaien synchroon op de aanroepende isolate. De UI roept deze route rechtstreeks aan. Voortgangscallbacks veranderen dat niet: tijdens een zware stap krijgt Flutter geen gelegenheid om frames of invoer te verwerken.

Risico

Bij middelgrote, complexe of vijandige presentaties reageert de interface secondenlang niet. De gebruiker kan niet betrouwbaar annuleren en kan het verschil tussen lang werk en een vastgelopen import niet zien.

Voorgestelde aanpak

  • Verplaats CPU- en geheugenintensieve validatie/import naar een worker-isolate.
  • Definieer een serialiseerbaar opdracht-, resultaat-, fout- en voortgangscontract.
  • Voeg coöperatieve annulering toe tussen begrensde werkeenheden.
  • Houd deckbouw/UI-keuzes op de passende laag; stuur alleen noodzakelijke data over de isolategrens.
  • Combineer dit met het centrale resourcebudget uit de gekoppelde securitybevinding.

Acceptatiecriteria

  • De UI blijft aantoonbaar responsief tijdens import van een representatief groot deck.
  • Voortgang blijft geordend en eindigt precies één keer in succes, fout of annulering.
  • Annuleren stopt het werk binnen een gedocumenteerde maximale tijd en schrijft geen gedeeltelijke uitvoer.
  • Bestaande ImportFailure-redenen en per-dia-resultaten blijven behouden.
  • Desktop en web hebben een expliciet en getest uitvoeringspad.

Verificatie

Draai make check, een prestatietest op een groot deck en een widget/integratietest die tijdens import invoer en annulering verwerkt.

Herkomst

Verplaatst en tegen de actuele OciDeck-port herijkt vanuit Keiko #2.

## Probleem `PresentationImportService.prepare` en de importers hebben een asynchrone API, maar formaatvalidatie, ZIP-decodering, XML-parsing, IWA/Snappy-decompressie, reconstructie en classificatie draaien synchroon op de aanroepende isolate. De UI roept deze route rechtstreeks aan. Voortgangscallbacks veranderen dat niet: tijdens een zware stap krijgt Flutter geen gelegenheid om frames of invoer te verwerken. ## Risico Bij middelgrote, complexe of vijandige presentaties reageert de interface secondenlang niet. De gebruiker kan niet betrouwbaar annuleren en kan het verschil tussen lang werk en een vastgelopen import niet zien. ## Voorgestelde aanpak - Verplaats CPU- en geheugenintensieve validatie/import naar een worker-isolate. - Definieer een serialiseerbaar opdracht-, resultaat-, fout- en voortgangscontract. - Voeg coöperatieve annulering toe tussen begrensde werkeenheden. - Houd deckbouw/UI-keuzes op de passende laag; stuur alleen noodzakelijke data over de isolategrens. - Combineer dit met het centrale resourcebudget uit de gekoppelde securitybevinding. ## Acceptatiecriteria - De UI blijft aantoonbaar responsief tijdens import van een representatief groot deck. - Voortgang blijft geordend en eindigt precies één keer in succes, fout of annulering. - Annuleren stopt het werk binnen een gedocumenteerde maximale tijd en schrijft geen gedeeltelijke uitvoer. - Bestaande `ImportFailure`-redenen en per-dia-resultaten blijven behouden. - Desktop en web hebben een expliciet en getest uitvoeringspad. ## Verificatie Draai `make check`, een prestatietest op een groot deck en een widget/integratietest die tijdens import invoer en annulering verwerkt. ## Herkomst Verplaatst en tegen de actuele OciDeck-port herijkt vanuit [Keiko #2](https://pawprint.vigilis.online/brenno/Keiko/issues/2).
Author
Owner

Opgepakt. Tak: fix/875-import-off-isolate (schone worktree vanaf main). Reikwijdte: nieuw serialiseerbaar import-taakcontract + gedeelde parse-kern (lib/services/import/pipeline/import_task.dart), platform-gesplitste isolate-runner (import_runner{,_io,_web}.dart, Isolate.spawn+kill op desktop, in-process met coöperatieve annulering + yields op web), herbedrading van PresentationImportService.prepare en de bulk-runner, en een klein annuleerbaar voortgangsvenster voor de enkelvoudige import. Deckbouw blijft op de hoofd-isolate (WebAssetStore + l10n-translate). Tests: responsiviteit op groot deck, voortgang-exact-één, annuleren binnen grens zonder gedeeltelijke uitvoer, expliciet web-pad, regressie op failures en per-dia-resultaten.

Opgepakt. Tak: fix/875-import-off-isolate (schone worktree vanaf main). Reikwijdte: nieuw serialiseerbaar import-taakcontract + gedeelde parse-kern (lib/services/import/pipeline/import_task.dart), platform-gesplitste isolate-runner (import_runner{,_io,_web}.dart, Isolate.spawn+kill op desktop, in-process met coöperatieve annulering + yields op web), herbedrading van PresentationImportService.prepare en de bulk-runner, en een klein annuleerbaar voortgangsvenster voor de enkelvoudige import. Deckbouw blijft op de hoofd-isolate (WebAssetStore + l10n-translate). Tests: responsiviteit op groot deck, voortgang-exact-één, annuleren binnen grens zonder gedeeltelijke uitvoer, expliciet web-pad, regressie op failures en per-dia-resultaten.
Author
Owner

Opgelost en op main via PR #902 (merge b897eef9). De import draait nu buiten de UI-isolate: een serialiseerbaar taakcontract + gedeelde parse-kern, een worker-isolate op desktop (kill bij annuleren) en een in-process pad met yields op web. Alleen de deckbouw blijft op de hoofd-isolate (WebAssetStore + l10n). Annuleren stopt binnen een gedocumenteerde tijd zonder gedeeltelijke uitvoer, met een klein annuleerbaar voortgangsvenster voor de enkelvoudige import en midden-in-bestand-stoppen voor de wachtrij. ImportBudget kreeg de maxDuration-deadline uit #874. make check volledig groen (6720 tests, dekking 86,6%). Alle acceptatiecriteria afgedekt met tests.

Opgelost en op main via PR #902 (merge b897eef9). De import draait nu buiten de UI-isolate: een serialiseerbaar taakcontract + gedeelde parse-kern, een worker-isolate op desktop (kill bij annuleren) en een in-process pad met yields op web. Alleen de deckbouw blijft op de hoofd-isolate (WebAssetStore + l10n). Annuleren stopt binnen een gedocumenteerde tijd zonder gedeeltelijke uitvoer, met een klein annuleerbaar voortgangsvenster voor de enkelvoudige import en midden-in-bestand-stoppen voor de wachtrij. ImportBudget kreeg de maxDuration-deadline uit #874. make check volledig groen (6720 tests, dekking 86,6%). Alle acceptatiecriteria afgedekt met tests.
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#875
No description provided.