Unexplained Postgres connector-open timeouts on a memex portal pod — discriminate a pod stall from a store outage; the create path answered correctly

Cerrado
#6,136 4 comentarios 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
4/5
Tiempo estimado
3-5 días
Aptitud para principiantes
35/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
csharp, postgresql

Línea de trabajo

Start by reading the linked StoreUnreachableIsNotARefusal and ErrorPropagationAndWedges architecture docs, then inspect retained logs for the affected pod around the incident window and compare health-check telemetry from other memex pods. Check for adjacent platform-stall, thread-pool-delay, and GC lines to distinguish a pod stall from a store or network blip; confirm the top frame in PostgreSqlStorageAdapter.WriteAsyncCore without adding retries there. Done means the evidence supports or rules out a cause and is documented; the issue does not identify a confirmed cause or a code change.

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

Descripción

bug sev:M

What is failing

For roughly two minutes around this incident's window, one memex portal pod could not reach its Postgres store, and three independent fingerprints record the same event: this CreateNode (a Hosting/PlatformBuilds/_Inbox node) was answered Unavailable after a new pooled connector open timed out (~21 s, long past the 250/500/1000 ms retry ladder); the Postgres health check on the same pod reported Unhealthy with connect timeouts (incident Admin/_LogIncident/d19bccbdb548d19a); and the path:Hosting/PlatformBuilds query fan-in stalled on the same pod (incident Admin/_LogIncident/b1942b90104d63ed, filed as #6125). The create handler itself is not the defect — MeshExtensions.HandleCreateNodeRequest's terminal arm classified the fault exactly as designed (StoreReachability.IsStoreUnreachable → NodeCreationRejectionReason.Unavailable, the 2026-09-02 change behind #3050/#3051), so nothing was written and a retry with the same node id is meaningful. The open question is why the store was unreachable, which this evidence cannot establish on its own.

Probable cause

Low confidence; two live hypotheses. The stack fails in Npgsql.PoolingDataSource.OpenNewConnector → NpgsqlConnector.ConnectAsync — a TCP-level connect timeout while opening a new connector, which is neither pool-admission starvation (the #6125 pedestrian-walk defect waits on RentAsync; it does not time out opens) nor a query stall. Per An Unreachable Store Is Not a Refusal (§ "Unreachable does not mean the store was down"), the identical exception is produced when the calling process stalls, because the connect timeout is wall-clock and does not pause for GC; in the #3050/#3051 precedent, ~89 % of the pod's Npgsql timeouts fell within 100 ms of a .NET Runtime Platform stalled line, on a pod near its managed-heap limit. The alternative is a genuine store/network blip. Discriminators: (a) the affected pod's own Platform stalled / Thread Pool is exhibiting delays lines in the window, using the doc's adjacency method; (b) whether other pods' health checks stayed green — the health-check failures recorded so far are all from this same pod, which leans pod-local, but is not proof.

Impact

Judged from the numbers: a single occurrence on a single pod — one create attempt refused with a retryable Unavailable, nothing written, no duplicate risk (the classification fix is doing its job). The same window also produced the #6125 fan-in stall and an Unhealthy pod, so if the cause is the pod stalling it will recur and take the portal's writes and reads with it; that systemic risk is what the severity is for, not this one log line.

Where to look

  • The affected pod's retained logs for the incident window: .NET Runtime Platform stalled for / Thread Pool is exhibiting delays / GC lines, and Npgsql-timeout adjacency per the doc's method.
  • Health-check telemetry from the other memex pods over the same minutes — the cheap store-vs-pod discriminator.
  • MeshWeaver.Hosting.PostgreSql.PostgreSqlStorageAdapter.WriteAsyncCore (top frame) — confirm only; do not add retry at this layer (policy: retry once, then answer — see Error Propagation & Wedges).
  • Siblings in the same window: #6125 (fan-in stall, same pod), Admin/_LogIncident/d19bccbdb548d19a (health check Unhealthy, same pod, triaged separately), and #5315 (open provider-stall investigation). Not a duplicate of #3050/#3051 — that defect (a create answering the wrong thing) is fixed, and is precisely why this log reads the way it does.

Evidence
Fingerprint c7d0c1f63a74376e
Category MeshWeaver.Mesh.CreateNode
Severity Error
Exception NpgsqlException
Top frame MeshWeaver.Hosting.PostgreSql.PostgreSqlStorageAdapter.WriteAsyncCore(MeshNode node, JsonSerializerOptions options, CancellationToken ct, Nullable1 expectedVersion)`
Namespace memex
Pods memex-portal-deployment-6485bffdff-cgd5r
Occurrences 1
First seen 2026-10-05 08:44:45Z
Last seen 2026-10-05 08:44:45Z
Routing not determined — no configured route matches the category MeshWeaver.Mesh.CreateNode. This repository is the configured fallback, not a finding about who owns the fault; the category names the LOGGER, which may not be the subject.
Recent log lines
2026-10-05 08:44:45Z memex-portal-deployment-6485bffdff-cgd5r fail: MeshWeaver.Mesh.CreateNode[0]
      [CreateNode] STORE UNREACHABLE at Hosting/PlatformBuilds/_Inbox/3df7fd6432fe4ee2b15c5ac5a7833aca: NpgsqlException: The operation has timed out — the create was NOT attempted and nothing was written. The fault is the data store, not this create; the caller is answered Unavailable, so a retry with the same node id is meaningful.
      Npgsql.NpgsqlException (0x80004005): The operation has timed out
       ---> System.TimeoutException: The operation has timed out.
         at Npgsql.ThrowHelper.ThrowNpgsqlExceptionWithInnerTimeoutException(String message)
         at Npgsql.Util.NpgsqlTimeout.Check()
         at Npgsql.Util.NpgsqlTimeout.CheckAndGetTimeLeft()
         at Npgsql.Internal.NpgsqlConnector.ConnectAsync(NpgsqlTimeout timeout, CancellationToken cancellationToken)
         at Npgsql.Internal.NpgsqlConnector.RawOpen(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
         at Npgsql.Internal.NpgsqlConnector.<Open>g__OpenCore|209_0(NpgsqlConnector conn, String username, SslMode sslMode, GssEncryptionMode gssEncMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
         at Npgsql.Internal.NpgsqlConnector.Open(NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
         at Npgsql.PoolingDataSource.OpenNewConnector(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
         at Npgsql.PoolingDataSource.<Get>g__RentAsync|33_0(NpgsqlConnection conn, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
         at Npgsql.NpgsqlConnection.<Open>g__OpenAsync|42_0(Boolean async, CancellationToken cancellationToken)
         at Npgsql.NpgsqlDataSourceCommand.ExecuteReader(Boolean async, CommandBehavior behavior, CancellationToken cancellationToken)
         at Npgsql.NpgsqlCommand.ExecuteNonQuery(Boolean async, CancellationToken cancellationToken)
         at MeshWeaver.Hosting.Postgre…[truncated]

Opened automatically from Admin/_LogIncident/c7d0c1f63a74376e. Recurrences are folded into this issue rather than opening new ones.
It also stands for the whole log site 363fa716df7bbe02: other fingerprints of this site fold in here as comments rather than opening tickets of their own.

Lenguaje dominante
C#
Estrellas
12
Forks
5
Merge medio
5 h 15 min
PR fusionados (30 d)
980

Preparar el entorno

  • Sin Dockerfile ni archivo de Docker Compose
  • Tiene una plantilla de pull request
  • Sin guía de contribución

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 Systemorph/MeshWeaver

Todos los issues de Systemorph/MeshWeaver

Issues similares

Más issues de C#

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.