Skip to content

fix(extensions): force UTF-8 worker stdio to prevent deadlock on non-UTF-8 Windows locales#216

Closed
Lorchie wants to merge 1 commit into
devfrom
fix/extension-worker-utf8-deadlock
Closed

fix(extensions): force UTF-8 worker stdio to prevent deadlock on non-UTF-8 Windows locales#216
Lorchie wants to merge 1 commit into
devfrom
fix/extension-worker-utf8-deadlock

Conversation

@Lorchie

@Lorchie Lorchie commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator

Contexte

Corrige #214 — la génération 3D se bloque indéfiniment sur Windows en locale non-UTF-8 (japonais/cp932, chinois, coréen). La barre de progression s'arrête vers 80 %, le worker consomme 0 % CPU et ne se termine jamais.

Cause racine

Dans api/services/extension_process.py, le worker était lancé avec subprocess.Popen(..., text=True) sans encoding= explicite. Les pipes étaient donc décodés avec l'encodage système (cp932 au Japon). Le worker émet de l'UTF-8 → UnicodeDecodeError dès qu'un octet non-cp932 arrive → le thread lecteur _stderr_loop meurt → le buffer stderr se remplit → le worker se bloque dans tqdm. Blocage silencieux et permanent.

Correction

  • _build_env() : ajout de PYTHONUTF8=1 pour que le worker émette de l'UTF-8 indépendamment de la locale.
  • Popen (démarrage worker) et subprocess.run (install de module) : encoding="utf-8", errors="replace" en remplacement de text=True. errors="replace" garantit que les threads lecteurs (_read_loop / _stderr_loop) ne peuvent plus mourir sur un octet indécodable.

Impact

Tous les utilisateurs Windows en locale non-UTF-8. Aucun changement de comportement sur les locales UTF-8. Suite de tests verte (pre-push).

…UTF-8 Windows locales

The extension worker was launched with text=True but no explicit encoding, so
pipes were decoded with the system locale (cp932 on Japanese Windows). The worker
emits UTF-8, so a UnicodeDecodeError killed the stderr reader thread, the stderr
buffer filled up, and the worker blocked inside tqdm - a silent, permanent hang
around 80% progress with 0% CPU.

- _build_env(): set PYTHONUTF8=1 so the worker emits UTF-8 regardless of locale
- Popen/subprocess.run: use encoding="utf-8", errors="replace" so reader threads
  can never die on undecodable bytes

Affects all non-UTF-8 Windows locales (Japan, China, Korea, ...).

Fixes #214
@Lorchie Lorchie changed the base branch from main to dev July 9, 2026 22:43
@Lorchie Lorchie closed this Jul 9, 2026
@Lorchie Lorchie deleted the fix/extension-worker-utf8-deadlock branch July 9, 2026 22:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant