Repository navigation
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: Webhook inbox delivery answers a bare 500 on a fan-in stall instead of 503, and is starved by the known pedestrian-walk pg-read head-of-line blocking #6125 (fan-in stall, same pod),
Admin/_LogIncident/d19bccbdb548d19a(health check Unhealthy, same pod, triaged separately), and MessageHubGrain activations fault when query providers stall past the 15s fan-in bound (access/entitlements queries unavailable) #5315 (open provider-stall investigation). Not a duplicate of Node creation fails when PostgreSQL connector open times out in PostgreSqlStorageAdapter #3050/Node creation fails when PostgreSQL is unreachable — connection timeouts opening new connectors in PostgreSqlStorageAdapter #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.
Activity
systemorph commentedon Oct 5, 2026
Still occurring: 1 more since the last update (2 total).
memex-portal-deployment-6485bffdff-cgd5r,memex-portal-deployment-6cfcf78898-gkkdvRecent log lines
systemorph commentedon Oct 5, 2026
Still occurring: 1 more since the last update (2 total).
memex-portal-deployment-6485bffdff-cgd5r,memex-portal-deployment-6cfcf78898-gkkdvRecent log lines
systemorph commentedon Oct 5, 2026
Still occurring: 1 more since the last update (3 total).
memex-portal-deployment-6485bffdff-cgd5r,memex-portal-deployment-6cfcf78898-gkkdvRecent log lines
systemorph commentedon Oct 5, 2026
Still occurring: 1 more since the last update (3 total).
memex-portal-deployment-6485bffdff-cgd5r,memex-portal-deployment-6cfcf78898-gkkdvRecent log lines
rbuergi commentedon Oct 7, 2026
Consolidation: #6133 folded in here. It was the PostgreSQL health-check fingerprint of this same event (incident
Admin/_LogIncident/d19bccbdb548d19a, which this body already names as the sibling). Evidence it carried:Memex.Portal.Distributed.PostgreSqlHealthCheck.CheckHealthAsync(PostgreSqlHealthCheck.cs:54) failed twice, at 2026-10-05 08:44:57Z and 08:45:12Z, onmemex-portal-deployment-6485bffdff-cgd5r. Each timeNpgsqlConnector.ConnectAsynccould not open a NEW connector within the 15 s connect timeout (Failed to connect to <host>:5432/The operation has timed out). Its reading was that the failure being on the connect path (not on pool acquisition) points at DB-side or connect-path saturation rather than pool starvation alone. That is a hypothesis, not established.rbuergi commentedon Oct 8, 2026
Closing as a duplicate of #5800 (stalls on a GC-thrash pod; the root is the heap retention).
Evidence. Every occurrence of this issue was read against its pod's
[LIVENESS]heartbeat with governedLogsactions on memex.systemorph.com (Ops/Actions/verify-stallsplit-{cgd5r,gkkdv}-20261005*-hb). In every one:So the stall is the pod barely running managed code, not the provider or the database. That includes the Npgsql connector-open timeouts, whose TLS connect cannot finish in time on such a pod.
Full table: #5315 (comment).
The fix is the retention/OOM driver: core #6261 + Systemorph/MeshWeaver.Plugins#3109, not yet rolled. #5800 closes on a post-roll window with no GC-thrash band and no stalls. A recurrence on a pod with GC under 10 % is a different defect and belongs on #5315.