Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

sql-pg: pool is not closed when the "SELECT 1" readiness probe fails in PgClient.make

Cerrado Apto para principiantes
#8,424 1 comentario 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
78/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
postgresql, typescript
Área
database

Línea de trabajo

Comienza en packages/sql/pg/src/PgClient.ts, en PgClient.make, y sigue la creación del pool, la adquisición de SELECT 1 y el finalizador de liberación. Verifica la ruta de error de la readiness probe y asegúrate de que el pool construido se cierre allí, preservando el comportamiento de limpieza existente tras una adquisición exitosa.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

3.0

Package

@effect/sql-pg 0.53.0 (the same structure is present in the v4 sources at packages/sql/pg/src/PgClient.ts).

Description

In PgClient.make, the pg.Pool is constructed before the acquisition effect:

const pool = new Pg.Pool({ ... })
pool.on("error", () => {})

yield* Effect.acquireRelease(
  Effect.tryPromise({
    try: () => pool.query("SELECT 1"),
    catch: (cause) => new SqlError({ ... })
  }),
  () => Effect.promise(() => pool.end()).pipe(...)
).pipe(...)

Per Effect.acquireRelease semantics, the release finalizer is registered only after a successful acquire — so when the SELECT 1 readiness probe fails, pool.end() is never called and the already-constructed pool object is orphaned.

Impact

Small in practice (pg pools are lazy — a pool that never acquired a client holds no sockets or timers, so the orphaned object is garbage-collectable), but:

  • callers that retry a failed layer build (e.g. a self-healing wrapper around ManagedRuntime that replaces the runtime after a failed build) accumulate pool instances across attempts,
  • the pool.end() finalizer signals the intent to always release the pool, so a failed probe silently violating that contract is surprising.

Suggested fix

End the pool when the probe fails, e.g.:

Effect.acquireRelease(
  Effect.tryPromise({
    try: () => pool.query("SELECT 1"),
    catch: (cause) => new SqlError({ ... })
  }).pipe(Effect.tapErrorCause(() => Effect.promise(() => pool.end()))),
  () => ...
)

or construct the pool inside the acquire effect.

Lenguaje dominante
TypeScript
Estrellas
16.7k
Forks
808
Merge medio
11 h 28 min
PR fusionados (30 d)
490

Preparar el entorno

Este proyecto no incluye contenedor de desarrollo, Dockerfile ni guía de contribución, así que la configuración corre por tu cuenta: empieza por su README y consulta nuestra guía para la primera contribución para los pasos generales.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de Effect-TS/effect

Todos los issues de Effect-TS/effect

Issues similares

Más issues de TypeScript

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.