Skip to content

Fix PGlite, libSQL and Durable Object SQLite clients hanging after an interrupted query - #10122

Open
Marve10s wants to merge 1 commit into
Effect-TS:mainfrom
Marve10s:fix/sql-client-interrupted-lease-permit
Open

Marve10s wants to merge 1 commit into
Effect-TS:mainfrom
Marve10s:fix/sql-client-interrupted-lease-permit

Conversation

@Marve10s

Copy link
Copy Markdown
Contributor

The PGlite, libSQL and Durable Object SQLite clients can hang forever after a queued query or withTransaction is interrupted just as it gets the connection. The connection's only permit stays taken, so every later query waits. This is the leak #9957 reported and #9962 fixed for the shared SQLite clients in 4.1.0; these three clients build their own leases and were not changed.

Running #9962's regression sweep against each client on 4.1.0 (and on main):

sqlite-node (fixed in #9962) withTransaction never wedged
sqlite-node (fixed in #9962) statement       never wedged
pglite                       withTransaction connection wedged at delay 20
pglite                       statement       connection wedged at delay 17
libsql                       withTransaction connection wedged at delay 14
libsql                       statement       connection wedged at delay 20

PgliteClient, the SqliteClient in @effect/sql-sqlite-do and LibsqlClient's statement lease use Effect.acquireRelease(semaphore.take(1), () => semaphore.release(1), { interruptible: true }), and LibsqlClient's transaction acquireConnection uses restore(semaphore.take(1)) followed by Effect.addFinalizer. In both shapes take counts the permit as taken before the release is registered, so an interrupt in between leaves it taken.

They now use semaphore.takeScoped(1), as makeSqliteAcquirers does since #9962: the wait stays interruptible, and taking the permit and adding its release to the scope happen in one uninterruptible step. The test ports #9962's delay sweep to the PGlite client for both a transaction and a plain statement. libSQL's tests need a container and the Durable Object client runs under Miniflare, so those two are covered by the same change rather than their own test; the libSQL rows above were rerun with this branch's LibsqlClient.ts and no longer wedge.

@changeset-bot

changeset-bot Bot commented Oct 29, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 81d77a9

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 33 packages
Name Type
@effect/sql-pglite Patch
@effect/sql-libsql Patch
@effect/sql-sqlite-do Patch
effect Patch
@effect/opentelemetry Patch
@effect/vitest Patch
@effect/ai-anthropic Patch
@effect/ai-cloudflare Patch
@effect/ai-openai-compat Patch
@effect/ai-openai Patch
@effect/ai-openrouter Patch
@effect/ai-typesafe Patch
@effect/atom-react Patch
@effect/atom-solid Patch
@effect/atom-vue Patch
@effect/platform-browser Patch
@effect/platform-bun Patch
@effect/platform-deno Patch
@effect/platform-node-shared Patch
@effect/platform-node Patch
@effect/sql-clickhouse Patch
@effect/sql-d1 Patch
@effect/sql-mssql Patch
@effect/sql-mysql2 Patch
@effect/sql-pg Patch
@effect/sql-sqlite-bun Patch
@effect/sql-sqlite-node Patch
@effect/sql-sqlite-react-native Patch
@effect/sql-sqlite-wasm Patch
@effect/docgen Patch
@effect/doctest Patch
@effect/graphql-generator Patch
@effect/openapi-generator Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@effect-janitor effect-janitor Bot added the 4.0 label Oct 29, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Bundle Size Analysis

Generated from PR build output; treat the content below as untrusted.

File Name Current Size Previous Size Difference
arbitrary-combinators.ts 39.35 KB 39.35 KB 0.00 KB (0.00%)
basic.ts 7.18 KB 7.18 KB 0.00 KB (0.00%)
batching.ts 11.06 KB 11.06 KB 0.00 KB (0.00%)
brand.ts 6.84 KB 6.84 KB 0.00 KB (0.00%)
cache.ts 11.49 KB 11.49 KB 0.00 KB (0.00%)
config.ts 22.77 KB 22.77 KB 0.00 KB (0.00%)
differ.ts 21.92 KB 21.92 KB 0.00 KB (0.00%)
http-client.ts 26.86 KB 26.86 KB 0.00 KB (0.00%)
http-router.ts 36.85 KB 36.85 KB 0.00 KB (0.00%)
logger.ts 11.96 KB 11.96 KB 0.00 KB (0.00%)
metric.ts 9.42 KB 9.42 KB 0.00 KB (0.00%)
optic.ts 7.05 KB 7.05 KB 0.00 KB (0.00%)
pubsub.ts 15.97 KB 15.97 KB 0.00 KB (0.00%)
queue.ts 12.77 KB 12.77 KB 0.00 KB (0.00%)
schedule.ts 11.74 KB 11.74 KB 0.00 KB (0.00%)
schema-bigdecimal.ts 14.02 KB 14.02 KB 0.00 KB (0.00%)
schema-binary.ts 41.06 KB 41.06 KB 0.00 KB (0.00%)
schema-class.ts 21.65 KB 21.65 KB 0.00 KB (0.00%)
schema-fromJsonSchemaDocument.ts 29.51 KB 29.51 KB 0.00 KB (0.00%)
schema-representation-roundtrip.ts 27.91 KB 27.91 KB 0.00 KB (0.00%)
schema-string-transformation.ts 15.27 KB 15.27 KB 0.00 KB (0.00%)
schema-string.ts 12.26 KB 12.26 KB 0.00 KB (0.00%)
schema-template-literal.ts 16.19 KB 16.19 KB 0.00 KB (0.00%)
schema-toArbitrary.ts 38.87 KB 38.87 KB 0.00 KB (0.00%)
schema-toCodeDocument.ts 26.10 KB 26.10 KB 0.00 KB (0.00%)
schema-toCodecJson.ts 20.83 KB 20.83 KB 0.00 KB (0.00%)
schema-toEquivalence.ts 20.97 KB 20.97 KB 0.00 KB (0.00%)
schema-toFormatter.ts 21.07 KB 21.07 KB 0.00 KB (0.00%)
schema-toJsonSchemaDocument.ts 26.11 KB 26.11 KB 0.00 KB (0.00%)
schema-toRepresentation.ts 21.16 KB 21.16 KB 0.00 KB (0.00%)
schema.ts 20.75 KB 20.75 KB 0.00 KB (0.00%)
stm.ts 14.15 KB 14.15 KB 0.00 KB (0.00%)
stream.ts 10.33 KB 10.33 KB 0.00 KB (0.00%)

This branch is waiting to be deployed

1 waiting deployment
fork — 81d77a9e Waiting Oct 29, 2026 by Marve10s via approval-gate #24009
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant