Unexplained Postgres connector-open timeouts on a memex portal pod — discriminate a pod stall from a store outage; the create path answered correctly
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 35/100
- Issue type
- Bug
- Clarity
- Mostly clear
- Activity status
- Active
- Tech stack
- csharp, postgresql
- Domain
- backend, databases, observability
Research direction
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.
Written by the indexing model from the issue text.
Description
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.
- Dominant language
- C#
- Stars
- 12
- Forks
- 5
- Avg merge
- 4h 1m
- Merged PRs (30d)
- 979
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- No contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from Systemorph/MeshWeaver
-
area:search documentation
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Systemorph/MeshWeaver#6030 ·
Maintainers usually reply within 1 day
-
ApiTokenService.RevokeToken posts its revocation SaveMeshNodeRequest from the mesh (router) hub instead of a node-operation hubPossibly taken A pull request linked to this issue is open or already merged. Openbug sev:M
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
Systemorph/MeshWeaver#6026 · 3 comments ·
Maintainers usually reply within 1 day
-
area:hosting bug sev:M
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
Systemorph/MeshWeaver#6019 · 1 comment ·
Maintainers usually reply within 1 day
-
bug sev:L
Difficulty 1/5 1-3 hours Newbie friendliness 76/100
Systemorph/MeshWeaver#6011 · 1 comment ·
Maintainers usually reply within 1 day
-
bug sev:B
Difficulty 4/5 3-5 days Newbie friendliness 12/100
Systemorph/MeshWeaver#6343 ·
Maintainers usually reply within 1 day
All issues in Systemorph/MeshWeaver
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
PCL-Community/PCL-CE#3658 ·
Maintainers usually reply within 1 day
-
Deploy & Patch-issues opprettes ikke: create-pnd-issues.yml har feilet hver uke siden 2025-09-08Open
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
Altinn/altinn-auth#4359 ·
Maintainers usually reply within 1 day
-
アプリ: チャット 優先: 中 提案
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
yksr-melt/Meltype#243 · 1 comment ·
Maintainers usually reply within 1 day
-
type/automation type/tech-debt
Difficulty 1/5 Under an hour Newbie friendliness 72/100
Maintainers usually reply within 1 day
-
no-stack-trace
Difficulty 2/5 1-3 hours Newbie friendliness 83/100
Maintainers usually reply within 1 day