kshitijk4poor
a3d33fe22f
fix(copilot): single-flight the token exchange and close abandoned responses
...
Follow-up to the off-loop move: once the credential-pool handlers run on
worker threads, the dashboard's periodic /api/credentials/pool polls can
overlap, and during a DNS outage each poll would have started its own
exchange and abandoned its own hung resolver thread.
- Per-fingerprint threading.Lock around the exchange: concurrent callers
wait on the one in-flight attempt, then hit the positive or negative
cache (bounded worker count, no duplicate network calls).
- _urlopen_bounded: when the hard cap fires and the abandoned worker later
succeeds, close the HTTPResponse instead of leaking the socket.
- Tests (none shipped with the original PR): hard cap + late-close,
single-flight success and failure paths, and the pool endpoint running
off-loop / keeping the loop responsive under a 200 ms blocking read.
2026-09-03 01:57:09 +05:30
..
2026-08-23 17:45:47 -05:00
2026-09-03 01:43:22 +05:30
2026-09-02 00:44:19 -07:00
2026-09-02 06:36:16 -07:00
2026-08-26 00:54:36 -07:00
2026-08-24 15:54:23 +05:30
2026-09-02 20:16:14 +05:30
2026-08-26 07:28:10 -07:00
2026-08-24 21:21:34 -07:00
2026-08-31 01:04:11 -07:00
2026-09-02 10:55:57 -07:00
2026-09-03 01:57:09 +05:30
2026-09-02 12:11:15 -05:00
2026-09-01 14:11:55 +05:30
2026-08-28 11:54:33 +05:30
2026-09-02 07:01:23 -07:00
2026-09-02 09:57:39 -07:00
2026-08-20 19:56:01 -07:00
2026-09-02 16:57:21 +05:30
2026-09-02 00:06:01 -07:00
2026-09-02 10:33:43 -07:00
2026-08-30 04:53:39 -07:00
2026-09-02 16:57:21 +05:30
2026-09-03 01:33:18 +05:30
2026-09-02 06:47:55 -07:00
2026-08-19 12:41:45 -05:00
2026-09-01 10:56:49 -07:00
2026-09-01 09:28:01 -07:00
2026-08-24 15:37:22 +05:30
2026-08-31 09:56:43 -07:00
2026-08-31 12:36:33 -07:00
2026-08-24 03:21:07 -07:00
2026-08-24 03:21:07 -07:00
2026-08-23 17:01:31 -07:00
2026-08-31 20:43:36 -05:00
2026-08-30 01:20:27 -07:00
2026-08-30 01:20:27 -07:00
2026-08-17 16:34:02 -07:00
2026-08-20 04:54:14 -07:00
2026-09-01 08:36:03 -07:00
2026-08-26 18:23:33 -07:00
2026-09-02 00:44:19 -07:00
2026-08-26 18:23:33 -07:00
2026-08-31 10:05:13 -07:00
2026-08-28 05:45:00 -07:00
2026-08-28 12:20:40 -07:00
2026-09-02 06:19:03 -07:00
2026-09-01 00:35:29 +05:30
2026-08-31 09:56:43 -07:00
2026-08-27 13:48:51 -07:00
2026-08-25 10:54:42 +10:00
2026-08-31 07:28:22 -07:00
2026-08-31 09:56:04 -07:00
2026-09-02 07:26:52 -07:00
2026-08-29 18:34:35 -07:00
2026-08-31 10:00:38 -07:00
2026-09-01 09:28:01 -07:00
2026-09-01 09:28:01 -07:00
2026-08-23 18:27:21 -07:00
2026-09-01 09:28:01 -07:00
2026-09-01 09:28:01 -07:00
2026-08-31 10:00:55 -07:00
2026-08-31 10:53:18 -07:00
2026-08-31 10:53:18 -07:00
2026-09-01 11:25:10 -07:00
2026-08-28 12:36:15 -07:00
2026-08-27 07:52:26 -07:00
2026-08-27 07:52:26 -07:00
2026-08-17 02:40:59 -07:00
2026-09-01 10:52:42 -07:00
2026-08-16 23:26:10 -07:00
2026-08-23 13:34:32 +05:30
2026-08-29 18:23:07 -07:00
2026-08-31 12:22:17 -07:00
2026-08-20 11:37:01 +05:30
2026-08-31 10:03:34 -07:00
2026-08-17 15:12:53 -05:00
2026-08-17 16:39:47 -07:00
2026-08-16 20:43:13 -07:00
2026-08-31 05:56:18 -07:00
2026-08-31 11:23:48 -07:00
2026-08-31 09:56:04 -07:00
2026-08-25 23:15:49 -07:00
2026-08-31 09:56:54 -07:00
2026-08-21 21:53:11 +05:30
2026-09-02 07:26:52 -07:00
2026-09-02 04:15:02 -07:00
2026-08-31 09:56:43 -07:00
2026-09-02 16:57:21 +05:30
2026-08-22 04:02:29 +05:30
2026-08-22 14:33:20 +05:30
2026-08-23 18:25:12 -07:00
2026-08-23 20:01:41 -07:00
2026-08-23 18:25:12 -07:00
2026-08-27 07:52:26 -07:00
2026-08-31 09:58:40 -07:00
2026-08-29 18:23:07 -07:00
2026-08-27 11:26:57 +05:30
2026-09-02 06:17:47 -07:00
2026-08-24 04:01:53 -07:00
2026-08-23 17:43:39 -07:00
2026-08-31 09:56:43 -07:00