• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

pomerium / pomerium / 21760916942
44%

Build:
DEFAULT BRANCH: main
Ran 06 Feb 2026 06:22PM UTC
Jobs 1
Files 661
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

06 Feb 2026 06:10PM UTC coverage: 44.539% (+0.1%) from 44.404%
21760916942

push

github

web-flow
fix(grpc): deadlock in CachedOutboundGRPClientConn.Get() on config change (#6101)

## Summary

`CachedOutboundGRPClientConn.Get()` deadlocks when called a second time
with
different options but the same (still-alive) context.

The bug was introduced in #6078. When `Get()` needs to replace an
existing
connection, it calls `stopCleanup()` (the return value of
`context.AfterFunc`)
to cancel the scheduled cleanup. If the original context is still alive,
`stopCleanup()` succeeds — meaning the AfterFunc will never fire and
`close(done)` never happens. The subsequent `<-cache.done` then blocks
forever.

This deadlocks the authorize service on the first config change after
startup,
because `newAuthorizeStateFromConfig` is called with the long-lived app
context
from both `New()` and `OnConfigChange()`. The deadlock prevents
`a.ssh.OnConfigChange(cfg)` from executing, so the SSH policy indexer
never
receives config updates with tunnel route policies — resulting in empty
authorized routes in the SSH TUI.

**Fix:** check the return value of `stopCleanup()`: if `true` (AfterFunc
was
prevented from running), close the connection directly; if `false`
(AfterFunc
already started), wait for it to finish.

## Related issues

- #6078

## User Explanation

Fixes a bug where SSH tunnel routes would not appear in the TUI after
upgrading
to a version containing #6078. The authorize service would silently
deadlock on
the first configuration change, preventing route policy updates from
reaching
the SSH subsystem.

## Checklist

- [x] reference any related issues
- [x] updated unit tests
- [ ] add appropriate label (`enhancement`, `bug`, `breaking`,
`dependencies`, `ci`)
- [ ] ready for review

7 of 7 new or added lines in 1 file covered. (100.0%)

9 existing lines in 3 files now uncovered.

31544 of 70823 relevant lines covered (44.54%)

115.36 hits per line

Uncovered Existing Lines

Lines Coverage ∆ File
2
90.91
0.0% pkg/fanout/receive.go
3
51.43
-0.19% internal/databroker/server_clustered_follower.go
4
78.89
1.67% pkg/storage/postgres/backend.go
Jobs
ID Job ID Ran Files Coverage
1 21760916942.1 06 Feb 2026 06:22PM UTC 661
44.54
GitHub Action Run
Source Files on build 21760916942
  • Tree
  • List 661
  • Changed 13
  • Source Changed 1
  • Coverage Changed 13
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #21760916942
  • e029e366 on github
  • Prev Build on main (#21731611705)
  • Next Build on main (#21836011090)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc