Commit 135d34a
committed
fix(models): stop CompletionsHTTPClient leaking its httpx client via atexit
CompletionsHTTPClient._client registered its per-instance httpx.AsyncClient
with atexit.register(self._cleanup_client, client), leaving a permanent strong
reference to the client and its connection pool in the process-global atexit
registry. Nothing ever called atexit.unregister, so neither close(), aclose(),
nor __del__ could release the client before interpreter exit. A long-running
deployment that creates many CompletionsHTTPClient instances therefore grew the
atexit registry and retained httpx clients without bound.
Register the cleanup callback against weakref.proxy(client) so the registry no
longer pins the client, mirroring the existing pattern in
bigquery_agent_analytics_plugin, and unregister the per-instance callback in
close()/aclose() once the client is explicitly closed. Tolerate a dead proxy in
_cleanup_client, and retain the fire-and-forget aclose() task in a module-level
set so it is not garbage collected while pending.
Add regression tests covering the register/unregister pairing and asserting the
client is releasable after close().
Signed-off-by: Anas Khan <83116240+anxkhn@users.noreply.github.com>1 parent 3127f36 commit 135d34a
2 files changed
Lines changed: 117 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
| 23 | + | |
23 | 24 | | |
24 | 25 | | |
25 | 26 | | |
| |||
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
| 32 | + | |
31 | 33 | | |
32 | 34 | | |
33 | 35 | | |
| |||
402 | 404 | | |
403 | 405 | | |
404 | 406 | | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
405 | 412 | | |
406 | 413 | | |
407 | 414 | | |
| |||
427 | 434 | | |
428 | 435 | | |
429 | 436 | | |
430 | | - | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
431 | 443 | | |
432 | 444 | | |
433 | 445 | | |
434 | 446 | | |
435 | 447 | | |
436 | | - | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
437 | 453 | | |
438 | 454 | | |
439 | 455 | | |
440 | | - | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
441 | 460 | | |
442 | 461 | | |
443 | 462 | | |
| |||
449 | 468 | | |
450 | 469 | | |
451 | 470 | | |
| 471 | + | |
452 | 472 | | |
453 | 473 | | |
454 | 474 | | |
455 | 475 | | |
| 476 | + | |
456 | 477 | | |
457 | 478 | | |
458 | 479 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
| 15 | + | |
| 16 | + | |
15 | 17 | | |
16 | 18 | | |
17 | 19 | | |
| 20 | + | |
18 | 21 | | |
19 | 22 | | |
20 | 23 | | |
| |||
829 | 832 | | |
830 | 833 | | |
831 | 834 | | |
| 835 | + | |
| 836 | + | |
| 837 | + | |
| 838 | + | |
| 839 | + | |
| 840 | + | |
| 841 | + | |
| 842 | + | |
| 843 | + | |
| 844 | + | |
| 845 | + | |
| 846 | + | |
| 847 | + | |
| 848 | + | |
| 849 | + | |
| 850 | + | |
| 851 | + | |
| 852 | + | |
| 853 | + | |
| 854 | + | |
| 855 | + | |
| 856 | + | |
| 857 | + | |
| 858 | + | |
| 859 | + | |
| 860 | + | |
| 861 | + | |
| 862 | + | |
| 863 | + | |
| 864 | + | |
| 865 | + | |
| 866 | + | |
| 867 | + | |
| 868 | + | |
| 869 | + | |
| 870 | + | |
| 871 | + | |
| 872 | + | |
| 873 | + | |
| 874 | + | |
| 875 | + | |
| 876 | + | |
| 877 | + | |
| 878 | + | |
| 879 | + | |
| 880 | + | |
| 881 | + | |
| 882 | + | |
| 883 | + | |
| 884 | + | |
| 885 | + | |
| 886 | + | |
| 887 | + | |
| 888 | + | |
| 889 | + | |
| 890 | + | |
| 891 | + | |
| 892 | + | |
| 893 | + | |
| 894 | + | |
| 895 | + | |
| 896 | + | |
| 897 | + | |
| 898 | + | |
| 899 | + | |
| 900 | + | |
| 901 | + | |
| 902 | + | |
| 903 | + | |
| 904 | + | |
| 905 | + | |
| 906 | + | |
| 907 | + | |
| 908 | + | |
| 909 | + | |
| 910 | + | |
| 911 | + | |
| 912 | + | |
| 913 | + | |
| 914 | + | |
| 915 | + | |
| 916 | + | |
| 917 | + | |
| 918 | + | |
| 919 | + | |
| 920 | + | |
| 921 | + | |
| 922 | + | |
| 923 | + | |
| 924 | + | |
0 commit comments