Skip to content

Postgres health check fails intermittently: TLS handshake to PostgreSQL times out on new connector open #5314

Closed

Description

@systemorph-com

What is failing

The PostgreSql health check on the memex-cloud portal pod reported Unhealthy: opening a new Npgsql connector stalled in TLS negotiation and the check's cancellation token fired at ~3.2s (TaskCanceledException inside SslStream.ForceAuthenticationAsync → NpgsqlConnector.NegotiateEncryption). The check reported Unhealthy once; there is no evidence the database itself stayed unreachable.

Probable cause

Medium-low confidence — a transient network/TLS handshake delay to the PostgreSQL host (pod network blip, DNS, or server-side SSL accept) exceeded the health check's timeout. The stack runs entirely through Npgsql's PoolingDataSource.OpenNewConnector, i.e. the first pool open in that window. It is not an application-code defect; the exception message ('A task was canceled') is the health check timing out mid-handshake.

Impact

Single occurrence on a single pod (memex-portal-deployment-7cc85f47c-nm2qp), no recurrence since. At most a momentary liveness-readiness blip; no user-facing failure is evidenced.

Where to look

  • HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync (AspNetCore.Diagnostics.HealthChecks, line 31) — health check entry point.
  • Npgsql connector open path: Npgsql.Internal.NpgsqlConnector.Open / NegotiateEncryption.
  • Consider raising the health check timeout or NpgsqlTimeout if Postgres TLS handshakes routinely exceed the current budget, and check pod→Postgres network/DNS at the timestamp.

Note: no application source file in our mesh is implicated — all frames are Npgsql / health-check library internals.


Evidence

Fingerprint b2cc907bf65c0478
Category Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService
Severity Error
Exception System.Threading.Tasks.TaskCanceledException
Top frame HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken)
Namespace memex-cloud
Pods memex-portal-deployment-7cc85f47c-nm2qp
Occurrences 1
First seen 2026-09-22 13:42:03Z
Last seen 2026-09-22 13:42:03Z
Routing not determined — no configured route matches the category Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService. 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-09-22 13:42:03Z memex-portal-deployment-7cc85f47c-nm2qp fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
      Health check PostgreSql with status Unhealthy completed after 3194.7498ms with message 'A task was canceled.'
      System.Threading.Tasks.TaskCanceledException: A task was canceled.
         at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
         at Npgsql.Internal.NpgsqlConnector.NegotiateEncryption(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
         at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
         at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore…[truncated]

Opened automatically from Admin/_LogIncident/b2cc907bf65c0478. Recurrences are folded into this issue rather than opening new ones.

Activity

  1. added
    bugSomething isn't working
    sev:LLow - cosmetic, rare edge case, or developer-only
    on Sep 22, 2026
  2. systemorph-com commented on Sep 22, 2026

    @systemorph-com
    ContributorAuthor

    Still occurring: 1 more since the last update (2 total).

    • Last seen: 2026-09-22 13:47:08Z
    • Pods: memex-portal-deployment-7cc85f47c-nm2qp
    Recent log lines
    2026-09-22 13:42:03Z memex-portal-deployment-7cc85f47c-nm2qp fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 3194.7498ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.NegotiateEncryption(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore…[truncated]
    2026-09-22 13:47:08Z memex-portal-deployment-7cc85f47c-nm2qp fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 3458.8585ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.NegotiateEncryption(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore…[truncated]
    
  3. systemorph-com commented on Sep 22, 2026

    @systemorph-com
    ContributorAuthor

    Still occurring: 1 more since the last update (3 total).

    • Last seen: 2026-09-22 14:42:39Z
    • Pods: memex-portal-deployment-7cc85f47c-nm2qp, memex-portal-deployment-5c444645f8-8pdzb
    Recent log lines
    2026-09-22 13:42:03Z memex-portal-deployment-7cc85f47c-nm2qp fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 3194.7498ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.NegotiateEncryption(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore…[truncated]
    2026-09-22 13:47:08Z memex-portal-deployment-7cc85f47c-nm2qp fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 3458.8585ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.NegotiateEncryption(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore…[truncated]
    2026-09-22 14:42:39Z memex-portal-deployment-5c444645f8-8pdzb fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 12373.7704ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.NegotiateEncryption(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCor…[truncated]
    
  4. rbuergi commented on Sep 23, 2026

    @rbuergi
    Contributor

    Triage 2026-09-23: #5347 folded in. Root cause NOT established, left open with the post-roll check named

    #5347 is closed as a duplicate of this issue. It is the same handshake, cancelled two frames deeper, on the same pod, two minutes after this issue's third sample (details there). The burst is therefore four samples on two pods of two different ReplicaSets, 2026-09-22 13:42–14:44Z:

    time (Z) pod check duration at cancel
    13:42:03 7cc85f47c-nm2qp 3194 ms
    13:47:08 7cc85f47c-nm2qp 3459 ms
    14:42:39 5c444645f8-8pdzb 12374 ms
    14:44:41 5c444645f8-8pdzb 6456 ms

    What the readings say

    1. The cancellation comes from the health-check CALLER, not from a Postgres or Npgsql timeout. The durations spread from 3.2 s to 12.4 s. A fixed connection or command timeout would cut at one value. The token that fired is the /health request's own token. Which caller held it is not recorded. The only kubelet reader of /health is the startup probe (deploy/helm/values.yaml probes.startup, 5 s timeout). After a pod has started, the other readers are external: the synthetic probe and Sample. A 12.4 s cancel does not fit a 5 s kubelet timeout unless the server was slow to see the client disconnect.
    2. The handshake needs thread-pool time, and the window overlaps a documented starvation day. SslStream's async handshake resumes on the shared ThreadPool. fix(compiler): keep NodeType compiles off the silo's shared ThreadPool #5327 (merged 2026-09-22 20:27Z as ec191c2b61) measured runtime NodeType compiles saturating that pool. Its evidence puts memex-cloud mid-roll for most of 2026-09-22, with thread-shortage [ROUTE] crossings logged during rolls. Four ReplicaSets served inside this issue's two-hour window (5c89c7f5f9, 7cc85f47c, 69dd75bf49, 5c444645f8), so this burst sits inside that roll period.
    3. But I could not put a starvation sample on either of THESE pods. I read the thread-shortage samples from the routing issues Routing pool starved of slots by ThreadPool contention during a 3-minute burst on portal pods #5226/Routing pool saturates under ThreadPool starvation — dispatch legs stall waiting for pool slots on portal pods #5249/Memory-stream queue dequeue fails with SiloUnavailableException when the silo hosting the memorystreamqueue grain goes down — recurring across all memory-3..N queues on memex #5250/Portal silos hit RoutingGrain back-pressure from ThreadPool starvation during route dispatch bursts #5262/CompileWatcher never advances latestReleasePath after a successful compile, and its re-cut path treats a 10s bounded wait as release-missing #5263/RoutingGrain pool saturates fleet-wide under ThreadPool starvation; pre-subscribe wait dominates slot occupancy on starved silos #5291/Memory stream queue dequeue intermittently exceeds 30s response deadline (symptom of cluster-wide Orleans call timeouts) #5298/Memory stream queue grain dequeue calls time out after 30s on memex, stalling stream message delivery (memory-7) #5301/RoutingGrain saturation gauge shows transient ThreadPool starvation on one pod — new-format sample of the #1172 fingerprint family #5307 (waiting for a pool slot ≥ 45). They name 5bb495d47b-jntbn (10:56Z), 5c89c7f5f9-sddb5 (12:39–12:59Z), 7f4f9b7689-d67t5 and 5c99d79997-xs87x (17:35Z). None of them is 7cc85f47c-nm2qp or 5c444645f8-8pdzb. Starvation is therefore consistent with this issue, not shown for it. A slow Postgres TLS accept or a network blip is not excluded.

    Why this stays open, and the check that decides it

    memex.meshweaver.cloud now runs 39f49494eb (/api/version), which contains #5327 (git merge-base --is-ancestor ec191c2b61 39f49494eb passes). memex.systemorph.com runs 3da3423c4b, which does not. The deciding reading is whether this fingerprint (b2cc907bf65c0478, or c9defbf7ce85d8f9) recurs on memex-cloud during its NEXT roll on a #5327-carrying image:

    Silence alone does not decide it, because the incident pipeline has been dark for hours before (see #1174, 2026-09-19). The control instance that folds recurrences (memex.systemorph.com) was answering 503 to its MCP when this was written, so I could not take a Logs reading.

    What I deliberately did NOT do

    I did not raise the health check's timeout or Npgsql's Timeout, which the bot's "where to look" suggests. That would hide a stall, not explain it (see AProbeMustAnswerInsideItsOwnTimeout).

    A separate observation, not acted on: a check cancelled by its caller is logged as Unhealthy at Error level. That makes a slow or disconnecting reader indistinguishable from a database fault in the incident stream. Whether a caller-cancelled check should classify differently is a logging-policy question for the health-check owner, and it would not change this issue's root cause.

  5. systemorph-com commented on Sep 23, 2026

    @systemorph-com
    ContributorAuthor

    Still occurring: 1 more since the last update (4 total).

    • Last seen: 2026-09-23 13:31:03Z
    • Pods: memex-portal-deployment-7cc85f47c-nm2qp, memex-portal-deployment-5c444645f8-8pdzb, memex-portal-deployment-5f95fb94dc-pkhnc
    Recent log lines
    2026-09-22 13:47:08Z memex-portal-deployment-7cc85f47c-nm2qp fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 3458.8585ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.NegotiateEncryption(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore…[truncated]
    2026-09-22 14:42:39Z memex-portal-deployment-5c444645f8-8pdzb fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 12373.7704ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.NegotiateEncryption(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCor…[truncated]
    2026-09-23 13:31:03Z memex-portal-deployment-5f95fb94dc-pkhnc fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 3936.1583ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at Npgsql.Internal.NpgsqlWriteBuffer.Flush(Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 37
    
  6. systemorph-com commented on Sep 23, 2026

    @systemorph-com
    ContributorAuthor

    Still occurring: 4 more since the last update (8 total).

    • Last seen: 2026-09-23 17:43:43Z
    • Pods: memex-portal-deployment-7cc85f47c-nm2qp, memex-portal-deployment-5c444645f8-8pdzb, memex-portal-deployment-5f95fb94dc-pkhnc, memex-portal-deployment-777677694-p6hbn, memex-portal-deployment-6688fb9488-8dn96
    Recent log lines
    2026-09-23 13:35:33Z memex-portal-deployment-5f95fb94dc-pkhnc fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 37.1536ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at Npgsql.Internal.NpgsqlWriteBuffer.Flush(Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 37
    2026-09-23 14:26:30Z memex-portal-deployment-777677694-p6hbn fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 985.1306ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at Npgsql.Internal.NpgsqlWriteBuffer.Flush(Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 37
    2026-09-23 17:43:43Z memex-portal-deployment-6688fb9488-8dn96 fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 14351.6533ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at Npgsql.Internal.NpgsqlWriteBuffer.Flush(Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 37
    
  7. rbuergi commented on Sep 23, 2026

    @rbuergi
    Contributor

    Post-#5327 reading. The 04:37Z comment named the check that decides this issue: does the fingerprint recur on a roll of an image carrying #5327? It did. The 2026-09-23 samples are:

    time (Z) pod cancel after
    13:31:03 5f95fb94dc-pkhnc 3936 ms
    13:35:33 5f95fb94dc-pkhnc 37 ms
    17:43 777677694-p6hbn, 6688fb9488-8dn96 (bot summary)

    Each lands in a window where the same pods logged the query fan-in stall:

    So #5327 alone did not remove it. The co-occurrence still points at process-side contention during a roll rather than at Postgres. The 37 ms cancel says so too: that is the caller giving up, not a TLS timeout.

    The per-read backlog being fixed for #5315/#5344 (core #5615, Plugins#2337) is Npgsql-side work on the same pods. Whether it also accounts for the slow handshakes is not established. A handshake needs a ThreadPool continuation, not a pg-read slot, so the link would be indirect at best.

    Leaving this open, sev:L. The next reading has the same shape as before: after a roll carrying both halves, does b2cc907bf65c0478 recur, and on the same pod and minute as a QueryProviderStalledException? I took no Logs reading; the control instance was unreachable this session.

  8. systemorph-com commented on Sep 23, 2026

    @systemorph-com
    ContributorAuthor

    Still occurring: 1 more since the last update (9 total).

    • Last seen: 2026-09-23 18:37:09Z
    • Pods: memex-portal-deployment-7cc85f47c-nm2qp, memex-portal-deployment-5c444645f8-8pdzb, memex-portal-deployment-5f95fb94dc-pkhnc, memex-portal-deployment-777677694-p6hbn, memex-portal-deployment-6688fb9488-8dn96, memex-portal-deployment-6f497dc9b-j9vq8
    Recent log lines
    2026-09-23 14:26:30Z memex-portal-deployment-777677694-p6hbn fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 985.1306ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at Npgsql.Internal.NpgsqlWriteBuffer.Flush(Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 37
    2026-09-23 17:43:43Z memex-portal-deployment-6688fb9488-8dn96 fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 14351.6533ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at Npgsql.Internal.NpgsqlWriteBuffer.Flush(Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 37
    2026-09-23 18:37:09Z memex-portal-deployment-6f497dc9b-j9vq8 fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 3331.1644ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at Npgsql.Internal.NpgsqlWriteBuffer.Flush(Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 37
    
  9. rbuergi commented on Sep 24, 2026

    @rbuergi
    Contributor

    Root cause: the fail: line is the caller's abandonment, folded into Unhealthy by Aspire's check. Fix in MeshWeaver.Plugins#2344

    Mechanism (read from the shipped binaries, not assumed):

    • The PostgreSql check is registered by Aspire.Npgsql 13.4.6 (AddNpgsqlDataSource). It is new NpgSqlHealthCheck(new NpgSqlHealthCheckOptions(sp.GetRequiredService<NpgsqlDataSource>())), with no tags and no timeout.
      • It uses the app's pooled data source, so the "new physical connection per probe" hypothesis is excluded.
      • A handshake still happens whenever the pool has no idle connector, since ConnectionIdleLifetime = 30 prunes idle ones.
    • HealthChecks.NpgSql 9.0.0 CheckHealthAsync wraps OpenAsync and ExecuteScalarAsync in one catch (Exception ex) => new HealthCheckResult(FailureStatus, ex.Message, ex). The caller's OperationCanceledException is included in that catch.
    • MapHealthChecks passes HttpContext.RequestAborted. DefaultHealthCheckService (10.0.11) propagates a caller cancellation (catch (OperationCanceledException) when (!cancellationToken.IsCancellationRequested) only converts a registration timeout). It logs every Unhealthy entry at Error, and that entry is event [103] in this issue.
    • So any /health reader that stops waiting turns into "PostgreSql Unhealthy … A task was canceled", with whatever frame the connector was in (SslStream handshake, NpgsqlWriteBuffer.Flush). That explains the 37 ms to 12.4 s spread: it measures when the check started relative to the caller's deadline, not Postgres.

    Fix (MeshWeaver.Plugins#2344):

    • The portal disables Aspire's check (DisableHealthChecks = true on both the Azure and the password path).
    • It registers PostgreSqlHealthCheck under the same name: SELECT 1 on the same pooled source.
    • When the caller has left, the check propagates a cancellation. Kestrel then logs the aborted request at Debug.
    • A failure while the caller waits is still Unhealthy and still logged.
    • PostgreSqlHealthCheckCancellationTest drives the real HealthCheckService against a socket that answers the SSLRequest with S and stalls in the TLS handshake. It passes.
    • Negative control: with the cancellation clauses removed, the test fails with No exception was thrown because an Unhealthy report comes back.
    • Doc: core docs(health): a caller that gives up is not a failed check (#5314) #5644 (AProbeMustAnswerInsideItsOwnTimeout, "A caller that gives up is not a failed check").

    Not established / not changed:

    Post-roll check: fingerprint b2cc907bf65c0478 stops recurring on an image carrying #2344. If an Unhealthy PostgreSql line appears after that, it is a real failure seen by a waiting caller.

  10. rbuergi commented on Sep 24, 2026

    @rbuergi
    Contributor

    MeshWeaver.Plugins#2344 merged (d28f0ab067, 2026-09-24 07:52Z). It carries a review-driven guard that the host registers exactly one PostgreSql check with Aspire's disabled on both data-source branches, because a duplicate name would take /health down entirely. Doc #5644 merged (6844133af7). Leaving this open for the post-roll reading: on an image carrying d28f0ab067, b2cc907bf65c0478 should stop folding. A PostgreSql Unhealthy line after that is a real failure seen by a caller that was still waiting.

  11. systemorph-com commented on Sep 26, 2026

    @systemorph-com
    ContributorAuthor

    Still occurring: 1 more since the last update (10 total).

    • Last seen: 2026-09-24 07:06:54Z
    • Pods: memex-portal-deployment-7cc85f47c-nm2qp, memex-portal-deployment-5c444645f8-8pdzb, memex-portal-deployment-5f95fb94dc-pkhnc, memex-portal-deployment-777677694-p6hbn, memex-portal-deployment-6688fb9488-8dn96, memex-portal-deployment-6f497dc9b-j9vq8, memex-portal-deployment-75cd8dc74c-pckmh
    Recent log lines
    2026-09-23 17:43:43Z memex-portal-deployment-6688fb9488-8dn96 fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 14351.6533ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at Npgsql.Internal.NpgsqlWriteBuffer.Flush(Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 37
    2026-09-23 18:37:09Z memex-portal-deployment-6f497dc9b-j9vq8 fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 3331.1644ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at Npgsql.Internal.NpgsqlWriteBuffer.Flush(Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 37
    2026-09-24 07:06:54Z memex-portal-deployment-75cd8dc74c-pckmh fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 215.7778ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.NegotiateEncryption(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.…[truncated]
    
  12. systemorph-com commented on Sep 26, 2026

    @systemorph-com
    ContributorAuthor

    Still occurring: 1 more since the last update (11 total).

    • Last seen: 2026-09-24 08:13:02Z
    • Pods: memex-portal-deployment-7cc85f47c-nm2qp, memex-portal-deployment-5c444645f8-8pdzb, memex-portal-deployment-5f95fb94dc-pkhnc, memex-portal-deployment-777677694-p6hbn, memex-portal-deployment-6688fb9488-8dn96, memex-portal-deployment-6f497dc9b-j9vq8, memex-portal-deployment-75cd8dc74c-pckmh, memex-portal-deployment-7b6649594-wtnwm
    Recent log lines
    2026-09-23 18:37:09Z memex-portal-deployment-6f497dc9b-j9vq8 fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 3331.1644ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at Npgsql.Internal.NpgsqlWriteBuffer.Flush(Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 37
    2026-09-24 07:06:54Z memex-portal-deployment-75cd8dc74c-pckmh fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 215.7778ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](Boolean receiveFirst, Byte[] reAuthenticationData, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.NegotiateEncryption(SslMode sslMode, NpgsqlTimeout timeout, Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.…[truncated]
    2026-09-24 08:13:02Z memex-portal-deployment-7b6649594-wtnwm fail: Microsoft.Extensions.Diagnostics.HealthChecks.DefaultHealthCheckService[103]
          Health check PostgreSql with status Unhealthy completed after 5311.3459ms with message 'A task was canceled.'
          System.Threading.Tasks.TaskCanceledException: A task was canceled.
             at Npgsql.Internal.NpgsqlWriteBuffer.Flush(Boolean async, CancellationToken cancellationToken)
             at Npgsql.Internal.NpgsqlConnector.SetupEncryption(SslMode sslMode, GssEncryptionMode gssEncryptionMode, 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 HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 31
             at HealthChecks.NpgSql.NpgSqlHealthCheck.CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken) in /home/runner/work/AspNetCore.Diagnostics.HealthChecks/AspNetCore.Diagnostics.HealthChecks/src/HealthChecks.NpgSql/NpgSqlHealthCheck.cs:line 37
    
  13. rbuergi commented on Oct 8, 2026

    @rbuergi
    Contributor

    Closing as fixed by MeshWeaver.Plugins#2344 (merged 2026-09-24 07:52Z). src/Memex.Portal.Distributed/PostgreSqlHealthCheck.cs now passes a caller's cancellation on as a cancellation instead of reporting Unhealthy, and Aspire's own check is disabled (pinned by PostgreSqlHealthCheckCancellationTest). The last sighting of b2cc907bf65c0478 was 2026-09-24 08:13Z, about 20 minutes after the merge and before any image carrying it could have rolled; none in the two weeks since. A PostgreSql Unhealthy line seen by a caller that was still waiting is a real failure, tracked in #5722.

    sev:L sweep, Claude Opus 5.5 (agent session).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingsev:LLow - cosmetic, rare edge case, or developer-only

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions