[PR #5350] Add timeout for file watcher subscribe to address hangs on Rosetta x86 emulation #11361

Closed
opened 2026-02-16 18:16:11 -05:00 by yindo · 0 comments
Owner

Original Pull Request: https://github.com/anomalyco/opencode/pull/5350

State: closed
Merged: No


Summary

  • Fixes file watcher hanging indefinitely on x86 emulation via Rosetta on macOS (parcel-bundler/watcher#159)
  • If timeout occurs, automatic detection of git branch switches and external file changes will not work. An error is logged when this happens.

Minimal Reproduction Steps

Environment

  • macOS with Apple Silicon (M1/M2/M3)
  • Docker Desktop with Rosetta emulation enabled
  • x86_64 Linux container running under Rosetta

Dockerfile

FROM --platform=linux/amd64 ubuntu:22.04

RUN apt-get update && apt-get install -y curl ca-certificates git && rm -rf /var/lib/apt/lists/*
RUN useradd -m -s /bin/bash testuser
RUN curl -fsSL https://opencode.ai/install | bash
RUN mv /root/.opencode/bin/opencode /usr/local/bin/opencode
RUN mkdir -p /work/repo && cd /work/repo && git init && echo '{"name":"test"}' > package.json && chown -R testuser:testuser /work/repo

WORKDIR /work/repo
USER testuser
CMD ["bash"]

Steps to Reproduce

# Build and start container
docker build --platform=linux/amd64 -t opencode-repro .
docker run --platform=linux/amd64 -d --name opencode-test opencode-repro sleep infinity

# Start opencode (first time - works)
docker exec -d opencode-test bash -c "opencode serve --port=4096 > /tmp/opencode.log 2>&1"
sleep 5

# Create a session
docker exec opencode-test curl -s -X POST http://localhost:4096/session -H 'Content-Type: application/json' -d '{}'

# Restart container
docker restart opencode-test
sleep 2

# Start opencode again (second time - HANGS)
docker exec -d opencode-test bash -c "opencode serve --port=4096 > /tmp/opencode.log 2>&1"
sleep 10

# This will timeout
docker exec opencode-test curl -s --max-time 10 http://localhost:4096/session
# Returns nothing - server is hung

Root Cause

@parcel/watcher's subscribe() function hangs under Rosetta x86_64 emulation. When inotify_init1() fails or behaves unexpectedly under Rosetta, the watcher's Backend::run blocks forever instead of propagating the error (see parcel-bundler/watcher#159).

This blocks the event loop, causing all subsequent async operations to hang - including file reads needed to load session data.

Verified

Environment Result
Native ARM64 Ubuntu container Works
x64 Ubuntu container under Rosetta Hangs
x64 container with timeout fix Works
**Original Pull Request:** https://github.com/anomalyco/opencode/pull/5350 **State:** closed **Merged:** No --- ## Summary - Fixes file watcher hanging indefinitely on x86 emulation via Rosetta on macOS (parcel-bundler/watcher#159) - If timeout occurs, automatic detection of git branch switches and external file changes will not work. An error is logged when this happens. ## Minimal Reproduction Steps ### Environment - macOS with Apple Silicon (M1/M2/M3) - Docker Desktop with Rosetta emulation enabled - x86_64 Linux container running under Rosetta ### Dockerfile ```dockerfile FROM --platform=linux/amd64 ubuntu:22.04 RUN apt-get update && apt-get install -y curl ca-certificates git && rm -rf /var/lib/apt/lists/* RUN useradd -m -s /bin/bash testuser RUN curl -fsSL https://opencode.ai/install | bash RUN mv /root/.opencode/bin/opencode /usr/local/bin/opencode RUN mkdir -p /work/repo && cd /work/repo && git init && echo '{"name":"test"}' > package.json && chown -R testuser:testuser /work/repo WORKDIR /work/repo USER testuser CMD ["bash"] ``` ### Steps to Reproduce ```bash # Build and start container docker build --platform=linux/amd64 -t opencode-repro . docker run --platform=linux/amd64 -d --name opencode-test opencode-repro sleep infinity # Start opencode (first time - works) docker exec -d opencode-test bash -c "opencode serve --port=4096 > /tmp/opencode.log 2>&1" sleep 5 # Create a session docker exec opencode-test curl -s -X POST http://localhost:4096/session -H 'Content-Type: application/json' -d '{}' # Restart container docker restart opencode-test sleep 2 # Start opencode again (second time - HANGS) docker exec -d opencode-test bash -c "opencode serve --port=4096 > /tmp/opencode.log 2>&1" sleep 10 # This will timeout docker exec opencode-test curl -s --max-time 10 http://localhost:4096/session # Returns nothing - server is hung ``` ### Root Cause `@parcel/watcher`'s `subscribe()` function hangs under Rosetta x86_64 emulation. When `inotify_init1()` fails or behaves unexpectedly under Rosetta, the watcher's `Backend::run` blocks forever instead of propagating the error (see [parcel-bundler/watcher#159](https://github.com/parcel-bundler/watcher/issues/159)). This blocks the event loop, causing all subsequent async operations to hang - including file reads needed to load session data. ### Verified | Environment | Result | |-------------|--------| | Native ARM64 Ubuntu container | ✅ Works | | x64 Ubuntu container under Rosetta | ❌ Hangs | | x64 container with timeout fix | ✅ Works |
yindo added the pull-request label 2026-02-16 18:16:11 -05:00
yindo closed this issue 2026-02-16 18:16:11 -05:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: anomalyco/opencode#11361