Skip to content

fix: add 30s timeout to SQLite semaphore to prevent deadlock hangs#31461

Open
HrushiYadav wants to merge 1 commit into
anomalyco:devfrom
HrushiYadav:fix/sqlite-lock-timeout
Open

fix: add 30s timeout to SQLite semaphore to prevent deadlock hangs#31461
HrushiYadav wants to merge 1 commit into
anomalyco:devfrom
HrushiYadav:fix/sqlite-lock-timeout

Conversation

@HrushiYadav

Copy link
Copy Markdown

Issue for this PR

Closes #29395

Type of change

  • Bug fix

What does this PR do?

The in-process Semaphore(1) guarding the single SQLite connection in sqlite.bun.ts blocks forever when the permit can't be acquired (deadlock, re-entrant lock, or concurrent instance contention). This adds a 30-second Effect.timeoutFail to both the regular query acquirer and the transaction acquirer so the hang surfaces as a clear SqlError instead of a silent futex wait with no timeout, no error, and no progress.

How did you verify your code works?

  • Traced the full boot sequence (InstanceStore.load -> boot -> fromDirectory -> bootstrap.run) and confirmed both the acquirer and transactionAcquirer are the only JS-level serialization points for SQLite access
  • Verified Effect.timeoutFail correctly interacts with semaphore.withPermits (timeout fires interruption, permit is not acquired, no leak)
  • Verified Effect.timeoutFail works inside Effect.uninterruptibleMask + restore(...) (the restore region makes semaphore.take interruptible so the timeout signal can reach it)
  • Confirmed SqlError with classifySqliteError matches the existing error handling path

Screenshots / recordings

N/A (backend change)

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

The in-process Semaphore(1) guarding the single SQLite connection has no
timeout, so any deadlock or re-entrant lock attempt causes the process to
hang forever with no error. Add a 30s timeout to both the regular query
acquirer and the transaction acquirer so contention surfaces as a clear
SqlError instead of a silent futex hang.

Closes anomalyco#29395
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.

Concurrent opencode run instances deadlock during init (futex, no timeout) — second overlapping instance hangs forever

1 participant