Fix free-threading crash from untraversed deferred references in suspended greenlets#511
Merged
Merged
Conversation
Contributor
Author
|
ping @jamadden for review. I will create a followup PR to fix some of the known memory leaks of greenlet but that depends on this PR. |
Contributor
|
Thanks for this! Today is the first time I've had a chance to look at it, and it LGTM. I can confirm it fixes the crashes on 3.15b2, both official from python.org and built locally (from MacPorts). I had a moment of panic due to a runtime linking error, but it turns out the needed symbol was only added in 3.15b2 and I was using 3.15b1. I'm happy to merge this and add some appropriate notes to CHANGES.rst. |
jamadden
added a commit
that referenced
this pull request
Jun 16, 2026
lthoangg
pushed a commit
to lthoangg/OpenAgentd
that referenced
this pull request
Jun 22, 2026
Bumps the python-minor-patch group with 18 updates: | Package | From | To | | --- | --- | --- | | [pydantic-settings](https://github.com/pydantic/pydantic-settings) | `2.13.1` | `2.14.2` | | [greenlet](https://github.com/python-greenlet/greenlet) | `3.4.0` | `3.5.2` | | [ddgs](https://github.com/deedy5/ddgs) | `9.13.0` | `9.14.4` | | [fastapi](https://github.com/fastapi/fastapi) | `0.135.3` | `0.138.0` | | [uvicorn](https://github.com/Kludex/uvicorn) | `0.44.0` | `0.49.0` | | [sse-starlette](https://github.com/sysid/sse-starlette) | `3.3.4` | `3.4.5` | | [opentelemetry-api](https://github.com/open-telemetry/opentelemetry-python) | `1.41.0` | `1.42.1` | | [opentelemetry-sdk](https://github.com/open-telemetry/opentelemetry-python) | `1.41.0` | `1.42.1` | | [python-multipart](https://github.com/Kludex/python-multipart) | `0.0.26` | `0.0.32` | | [mcp](https://github.com/modelcontextprotocol/python-sdk) | `1.27.0` | `1.28.0` | | [boto3](https://github.com/boto/boto3) | `1.43.0` | `1.43.34` | | [duckdb](https://github.com/duckdb/duckdb-python) | `1.5.2` | `1.5.4` | | [pytest](https://github.com/pytest-dev/pytest) | `9.0.2` | `9.1.1` | | [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) | `1.3.0` | `1.4.0` | | [respx](https://github.com/lundberg/respx) | `0.22.0` | `0.23.1` | | [ruff](https://github.com/astral-sh/ruff) | `0.15.8` | `0.15.18` | | [tiktoken](https://github.com/openai/tiktoken) | `0.12.0` | `0.13.0` | | [ty](https://github.com/astral-sh/ty) | `0.0.33` | `0.0.51` | Updates `pydantic-settings` from 2.13.1 to 2.14.2 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/pydantic/pydantic-settings/releases">pydantic-settings's releases</a>.</em></p> <blockquote> <h2>v2.14.2</h2> <h2>What's Changed</h2> <p>This is a security patch release.</p> <ul> <li>Prevent <code>NestedSecretsSettingsSource</code> from following symlinks outside <code>secrets_dir</code> by <a href="https://github.com/hramezani"><code>@hramezani</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/889">pydantic/pydantic-settings#889</a></li> <li>Prepare release 2.14.2 by <a href="https://github.com/hramezani"><code>@hramezani</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/890">pydantic/pydantic-settings#890</a></li> </ul> <h3>Security</h3> <p>Fixes <a href="https://github.com/pydantic/pydantic-settings/security/advisories/GHSA-4xgf-cpjx-pc3j">GHSA-4xgf-cpjx-pc3j</a>: <code>NestedSecretsSettingsSource</code> with <code>secrets_nested_subdir=True</code> could follow a symbolic link inside <code>secrets_dir</code> pointing outside it, reading out-of-tree files into settings values and bypassing the <code>secrets_dir_max_size</code> cap. Affected versions: <code>>= 2.12.0, < 2.14.2</code>.</p> <p><strong>Full Changelog</strong>: <a href="https://github.com/pydantic/pydantic-settings/compare/v2.14.1...v2.14.2">https://github.com/pydantic/pydantic-settings/compare/v2.14.1...v2.14.2</a></p> <h2>v2.14.1</h2> <h2>What's Changed</h2> <ul> <li>Bump the python-packages group with 4 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/850">pydantic/pydantic-settings#850</a></li> <li>Bump the python-packages group with 5 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/854">pydantic/pydantic-settings#854</a></li> <li>Bump the github-actions group with 3 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/853">pydantic/pydantic-settings#853</a></li> <li>Bump the python-packages group with 2 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/856">pydantic/pydantic-settings#856</a></li> <li>Fix field named <code>cls</code> conflicting with classmethod parameter by <a href="https://github.com/hramezani"><code>@hramezani</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/858">pydantic/pydantic-settings#858</a></li> <li>Prepare release 2.14.1 by <a href="https://github.com/hramezani"><code>@hramezani</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/859">pydantic/pydantic-settings#859</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/pydantic/pydantic-settings/compare/v2.14.0...v2.14.1">https://github.com/pydantic/pydantic-settings/compare/v2.14.0...v2.14.1</a></p> <h2>v2.14.0</h2> <h2>What's Changed</h2> <ul> <li>Fix parsing env vars into Optional Strict types by <a href="https://github.com/hramezani"><code>@hramezani</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/792">pydantic/pydantic-settings#792</a></li> <li>Fix RecursionError with mutually recursive models in CLI by <a href="https://github.com/hramezani"><code>@hramezani</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/794">pydantic/pydantic-settings#794</a></li> <li>Fix env_file from model_config ignored in CliApp.run() (<a href="https://redirect.github.com/pydantic/pydantic-settings/issues/795">#795</a>) by <a href="https://github.com/hramezani"><code>@hramezani</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/796">pydantic/pydantic-settings#796</a></li> <li>Update dependencies by <a href="https://github.com/hramezani"><code>@hramezani</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/798">pydantic/pydantic-settings#798</a></li> <li>Add Dependabot configuration by <a href="https://github.com/hramezani"><code>@hramezani</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/801">pydantic/pydantic-settings#801</a></li> <li>Bump samuelcolvin/check-python-version from 4.1 to 5 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/802">pydantic/pydantic-settings#802</a></li> <li>Bump actions/upload-artifact from 4 to 7 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/803">pydantic/pydantic-settings#803</a></li> <li>Bump actions/checkout from 4 to 6 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/804">pydantic/pydantic-settings#804</a></li> <li>Bump astral-sh/setup-uv from 5 to 7 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/805">pydantic/pydantic-settings#805</a></li> <li>Bump actions/setup-python from 5 to 6 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/806">pydantic/pydantic-settings#806</a></li> <li>Ignore chardet and group GitHub Actions in Dependabot by <a href="https://github.com/hramezani"><code>@hramezani</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/808">pydantic/pydantic-settings#808</a></li> <li>Bump actions/download-artifact from 4 to 8 in the github-actions group by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/809">pydantic/pydantic-settings#809</a></li> <li>Bump the python-packages group with 2 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/810">pydantic/pydantic-settings#810</a></li> <li>Support reading .env files from FIFOs (e.g. 1Password Environments) by <a href="https://github.com/JacobHayes"><code>@JacobHayes</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/776">pydantic/pydantic-settings#776</a></li> <li>Fix AliasChoices ignored when changing provider priority by <a href="https://github.com/hramezani"><code>@hramezani</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/813">pydantic/pydantic-settings#813</a></li> <li>fix: resolve KeyError in run_subcommand for underscore field names by <a href="https://github.com/bradykieffer"><code>@bradykieffer</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/799">pydantic/pydantic-settings#799</a></li> <li>Bump the python-packages group with 3 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/814">pydantic/pydantic-settings#814</a></li> <li>Fix <code>Literal[numeric Enum]</code> coercion for CLI and env vars by <a href="https://github.com/m9810223"><code>@m9810223</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/811">pydantic/pydantic-settings#811</a></li> <li>Fix nested discriminated unions not discovered by env/CLI providers by <a href="https://github.com/hramezani"><code>@hramezani</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/816">pydantic/pydantic-settings#816</a></li> <li>Bump the python-packages group with 3 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/820">pydantic/pydantic-settings#820</a></li> <li>CLI ensure env nested max split internally. by <a href="https://github.com/kschwab"><code>@kschwab</code></a> in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/821">pydantic/pydantic-settings#821</a></li> <li>Bump the python-packages group with 4 updates by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/pydantic/pydantic-settings/pull/824">pydantic/pydantic-settings#824</a></li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/pydantic/pydantic-settings/commit/d703bd717e5e07439fa89da2245eee6139413e9e"><code>d703bd7</code></a> Prepare release 2.14.2 (<a href="https://redirect.github.com/pydantic/pydantic-settings/issues/890">#890</a>)</li> <li><a href="https://github.com/pydantic/pydantic-settings/commit/e95c30bec8cfaee88ee275138c064aea97a25bdf"><code>e95c30b</code></a> Prepare release 2.14.1 (<a href="https://redirect.github.com/pydantic/pydantic-settings/issues/859">#859</a>)</li> <li><a href="https://github.com/pydantic/pydantic-settings/commit/0c8734581b6cf70a995afad603ac456631d00621"><code>0c87345</code></a> Fix field named <code>cls</code> conflicting with classmethod parameter (<a href="https://redirect.github.com/pydantic/pydantic-settings/issues/858">#858</a>)</li> <li><a href="https://github.com/pydantic/pydantic-settings/commit/7bd0072795a800065b42210b6dca90fc9b83daf7"><code>7bd0072</code></a> Bump the python-packages group with 2 updates (<a href="https://redirect.github.com/pydantic/pydantic-settings/issues/856">#856</a>)</li> <li><a href="https://github.com/pydantic/pydantic-settings/commit/b03e573d017ed48e1c2774a5e0b715db9766c76b"><code>b03e573</code></a> Bump the github-actions group with 3 updates (<a href="https://redirect.github.com/pydantic/pydantic-settings/issues/853">#853</a>)</li> <li><a href="https://github.com/pydantic/pydantic-settings/commit/eaa3b434938411ec8a3717ea646614561e713f51"><code>eaa3b43</code></a> Bump the python-packages group with 5 updates (<a href="https://redirect.github.com/pydantic/pydantic-settings/issues/854">#854</a>)</li> <li><a href="https://github.com/pydantic/pydantic-settings/commit/9f95615c24c6813c1d7d203576581a79cb6d9e8e"><code>9f95615</code></a> Bump the python-packages group with 4 updates (<a href="https://redirect.github.com/pydantic/pydantic-settings/issues/850">#850</a>)</li> <li><a href="https://github.com/pydantic/pydantic-settings/commit/8916beeecc6d0510e3d0532a0ed839937400ddc3"><code>8916bee</code></a> Prepare release 2.14.0 (<a href="https://redirect.github.com/pydantic/pydantic-settings/issues/848">#848</a>)</li> <li><a href="https://github.com/pydantic/pydantic-settings/commit/39e551c0910c85505b608ff85a103b2c9f7396c5"><code>39e551c</code></a> Fix CLI descriptions lost under <code>python -OO</code> by falling back to `json_schema_...</li> <li><a href="https://github.com/pydantic/pydantic-settings/commit/9ed7f48ea2c90f436a03b01f721fe6656c869b14"><code>9ed7f48</code></a> Bump the python-packages group with 4 updates (<a href="https://redirect.github.com/pydantic/pydantic-settings/issues/847">#847</a>)</li> <li>Additional commits viewable in <a href="https://github.com/pydantic/pydantic-settings/compare/v2.13.1...v2.14.2">compare view</a></li> </ul> </details> <br /> Updates `greenlet` from 3.4.0 to 3.5.2 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/python-greenlet/greenlet/blob/master/CHANGES.rst">greenlet's changelog</a>.</em></p> <blockquote> <h1>3.5.2 (2026-06-17)</h1> <ul> <li>The minimum supported version of Python 3.15 is now 3.15b2.</li> <li>Fix some garbage-collection related crashes on free-threaded Python 3.15. Thanks to Kumar Aditya in <code>PR [#511](https://github.com/python-greenlet/greenlet/issues/511) <https://github.com/python-greenlet/greenlet/pull/511></code>_.</li> <li>Improve garbage collection of greenlets. This mostly applies to Python 3.15. Thanks to Kumar Aditya in <code>PR [#512](https://github.com/python-greenlet/greenlet/issues/512) <https://github.com/python-greenlet/greenlet/pull/512></code>_.</li> </ul> <h1>3.5.1 (2026-05-20)</h1> <ul> <li>Add preliminary support for Python 3.15b1. This has not been reviewed by CPython core developers, but all tests pass. Binary wheels of this version won't work on earlier Python 3.15 builds and may not work on later 3.15 builds.</li> <li>Fix the discrepancy in the way the two <code>getcurrent</code> APIs behave during greenlet teardown. One API (the C API used by, e.g., gevent) raised a <code>RuntimeError</code>; the other (the Python <code>greenlet.getcurrent</code> API) returned <code>None</code>. This second way is incompatible with greenlet's type annotations, so <code>greenlet.getcurrent</code> now raises a <code>RuntimeError</code> as well.</li> </ul> <h1>3.5.0 (2026-04-27)</h1> <ul> <li> <p>Remove the <code>atexit</code> callback. This callback caused greenlet APIs to become unavailable far too soon during interpreter shutdown. Now they remain available while all <code>atexit</code> callbacks run. Sometime after <code>Py_IsFinalizing</code> becomes true, they may begin misbehaving. Because the order in which C extensions are finalized is undefined, C extensions that are sensitive to this need to check the results of that function before invoking greenlet APIs. As a convenience, <code>PyGreenlet_GetCurrent</code> sets an exception and returns <code>NULL</code> when this happens (and <code>greenlet.getcurrent</code> begins returning <code>None</code>); other greenlet C API functions have undefined behaviour. Methods invoked directly on pre-existing <code>greenlet.greenlet</code> objects will continue to function at least until the greenlet C extension has been garbage collected and finalized.</p> <p>See <code>PR 508 <https://github.com/python-greenlet/greenlet/pull/508></code>_.</p> </li> </ul> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/python-greenlet/greenlet/commit/0b64e9c851ae7bd8fc9b73d98031168237ee71db"><code>0b64e9c</code></a> Preparing release 3.5.2</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/3e28d276d01e74882f4cff1a4b54aed47153d617"><code>3e28d27</code></a> Add change note for <a href="https://redirect.github.com/python-greenlet/greenlet/issues/512">#512</a> [skip ci]</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/6563c5e909a84c037c3d03e46851cd3016525a35"><code>6563c5e</code></a> Merge pull request <a href="https://redirect.github.com/python-greenlet/greenlet/issues/512">#512</a> from kumaraditya303/ft-mem</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/ab6eff60766e8954d890eef064ee2e1dd7c8b262"><code>ab6eff6</code></a> add ignore for win 3.10</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/41f5349a0f1b69ce180c90acb9a4cf2c84d612e7"><code>41f5349</code></a> revert back to fails_leakcheck_on_py314_or_less</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/b0aac05734e9e41d4a592e0c913846990a9c7c24"><code>b0aac05</code></a> set fail-fast=false and if condition correctly</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/2f87f316613d401bbf1b1653595654654e572550"><code>2f87f31</code></a> rename to ignores_leakcheck_on_py314_or_less</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/28bbde3de939acefe8e9d72fb179115b81392a87"><code>28bbde3</code></a> add comments</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/35206b8dc536cfe92c09509432b4a301b5fede5f"><code>35206b8</code></a> fix test and restrict tp_is_gc < 3.15</li> <li><a href="https://github.com/python-greenlet/greenlet/commit/abdbab55b03334700fd264e523ac75926daba043"><code>abdbab5</code></a> fix gil enabled</li> <li>Additional commits viewable in <a href="https://github.com/python-greenlet/greenlet/compare/3.4.0...3.5.2">compare view</a></li> </ul> </details> <br /> Updates `ddgs` from 9.13.0 to 9.14.4 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/deedy5/ddgs/releases">ddgs's releases</a>.</em></p> <blockquote> <h2>v9.14.4</h2> <h2>What's Changed</h2> <ul> <li>fix(engines): update DuckDuckgo by <a href="https://github.com/deedy5"><code>@deedy5</code></a> in <a href="https://redirect.github.com/deedy5/ddgs/pull/465">deedy5/ddgs#465</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/deedy5/ddgs/compare/v9.14.3...v9.14.4">https://github.com/deedy5/ddgs/compare/v9.14.3...v9.14.4</a></p> <h2>v9.14.3</h2> <h2>What's Changed</h2> <ul> <li>feat(engines): add Startpage by <a href="https://github.com/deedy5"><code>@deedy5</code></a> in <a href="https://redirect.github.com/deedy5/ddgs/pull/464">deedy5/ddgs#464</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/deedy5/ddgs/compare/v9.14.2...v9.14.3">https://github.com/deedy5/ddgs/compare/v9.14.2...v9.14.3</a></p> <h2>v9.14.2</h2> <h2>What's Changed</h2> <ul> <li>refactor(ddgs): improve engine selection and error handling by <a href="https://github.com/deedy5"><code>@deedy5</code></a> in <a href="https://redirect.github.com/deedy5/ddgs/pull/456">deedy5/ddgs#456</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/deedy5/ddgs/compare/v9.14.1...v9.14.2">https://github.com/deedy5/ddgs/compare/v9.14.1...v9.14.2</a></p> <h2>v9.14.1</h2> <h2>What's Changed</h2> <ul> <li><a href="https://github.com/deedy5/ddgs/commit/6e4a50706509c52e3d5da7d4870fbf82bc0a342e">fix(engines): disable Google until fixed</a></li> <li><a href="https://github.com/deedy5/ddgs/commit/cb2abbb2006a30c67f5455ad9205306f7c571a7d">build(deps): bump primp to 1.2.3</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/deedy5/ddgs/compare/v9.14.0...v9.14.1">https://github.com/deedy5/ddgs/compare/v9.14.0...v9.14.1</a></p> <h2>v9.14.0</h2> <h2>What's Changed</h2> <ul> <li>feat(dht): add beta p2p distributed cache network by <a href="https://github.com/deedy5"><code>@deedy5</code></a> in <a href="https://redirect.github.com/deedy5/ddgs/pull/451">deedy5/ddgs#451</a></li> </ul> <h3>New Features</h3> <ul> <li>✅ DHT distributed peer-to-peer search result cache network (beta)</li> <li>Full libp2p Kademlia implementation</li> <li>Automatic peer discovery and bootstrap network</li> <li>Local cache with TTL eviction</li> <li>REST API endpoints via <code>ddgs[api]</code> extra</li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/deedy5/ddgs/compare/v9.13.1...v9.14.0">https://github.com/deedy5/ddgs/compare/v9.13.1...v9.14.0</a></p> <h2>v9.13.1</h2> <h2>What's Changed</h2> <ul> <li>fix(cli): handle deprecated -k flag and add bing to images backends by <a href="https://github.com/deedy5"><code>@deedy5</code></a> in <a href="https://redirect.github.com/deedy5/ddgs/pull/449">deedy5/ddgs#449</a></li> <li>fix(base): remove per-element strip in extract_results by <a href="https://github.com/deedy5"><code>@deedy5</code></a> in <a href="https://redirect.github.com/deedy5/ddgs/pull/450">deedy5/ddgs#450</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/deedy5/ddgs/compare/v9.13.0...v9.13.1">https://github.com/deedy5/ddgs/compare/v9.13.0...v9.13.1</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/deedy5/ddgs/commit/a4bf2f21827dc632296008068c5da00960f3cd05"><code>a4bf2f2</code></a> chore(release): bump version to 9.14.4</li> <li><a href="https://github.com/deedy5/ddgs/commit/4b2afc4ac75985788c6b78a4c2fae831a872f105"><code>4b2afc4</code></a> refactor(api_server): wrap fastapi_app import in try-except block</li> <li><a href="https://github.com/deedy5/ddgs/commit/21de33d67926d1db5e16d7c1ee179a36f9946a74"><code>21de33d</code></a> fix(engines): update DuckDuckgo</li> <li><a href="https://github.com/deedy5/ddgs/commit/7347d5837b663824904725bf24a3b51d658bda50"><code>7347d58</code></a> chore(release): bump version to 9.14.3</li> <li><a href="https://github.com/deedy5/ddgs/commit/97d993eb5c6b6b82e96e7e428ca1fd97c63259d1"><code>97d993e</code></a> feat(engines): add Startpage</li> <li><a href="https://github.com/deedy5/ddgs/commit/ad0f617d9bfdd34510f2b36185610eee94f98f18"><code>ad0f617</code></a> fix(engines): update Google useragents</li> <li><a href="https://github.com/deedy5/ddgs/commit/783308af96ed4c23dad4f21be7108f2ce48c4890"><code>783308a</code></a> chore(release): bump version to 9.14.2</li> <li><a href="https://github.com/deedy5/ddgs/commit/9d21fffd77e28ceff19caa7ba57cbd9e426ef228"><code>9d21fff</code></a> refactor(ddgs): improve engine selection and error handling</li> <li><a href="https://github.com/deedy5/ddgs/commit/d3194a3ab05454e354ac59c3d1ccc0189470e80a"><code>d3194a3</code></a> chore(release): bump version to v9.14.1</li> <li><a href="https://github.com/deedy5/ddgs/commit/cb2abbb2006a30c67f5455ad9205306f7c571a7d"><code>cb2abbb</code></a> build(deps): bump primp to 1.2.3</li> <li>Additional commits viewable in <a href="https://github.com/deedy5/ddgs/compare/v9.13.0...v9.14.4">compare view</a></li> </ul> </details> <br /> Updates `fastapi` from 0.135.3 to 0.138.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/fastapi/fastapi/releases">fastapi's releases</a>.</em></p> <blockquote> <h2>0.138.0</h2> <h3>Features</h3> <ul> <li>✨ Add support for <code>app.frontend("/", directory="dist")</code> and <code>router.frontend("/", directory="dist")</code>. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15800">#15800</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>. <ul> <li>Read the docs: <a href="https://fastapi.tiangolo.com/tutorial/frontend/">Frontend</a>.</li> </ul> </li> </ul> <h3>Docs</h3> <ul> <li>📝 Fix typo in release notes. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15807">#15807</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>📝 Add <code>app.frontend()</code> instructions to Agent Library Skill. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15805">#15805</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>📝 Update release notes link. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15802">#15802</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>✏️ Update white space characters in bigger apps. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15801">#15801</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>✏️ Fix grammar, typos, and broken links in docs. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15694">#15694</a> by <a href="https://github.com/YuriiMotov"><code>@YuriiMotov</code></a>.</li> </ul> <h3>Translations</h3> <ul> <li>🌐 Enable Hindi docs translations. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15554">#15554</a> by <a href="https://github.com/YuriiMotov"><code>@YuriiMotov</code></a>.</li> </ul> <h3>Internal</h3> <ul> <li>🐛 Fix failing test, update format for raised errors. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15804">#15804</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>👷 Fix test-alls-green. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15803">#15803</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🔧 Enable checking <code>release-notes.md</code> for typos. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15796">#15796</a> by <a href="https://github.com/YuriiMotov"><code>@YuriiMotov</code></a>.</li> <li>📝 Tweak wording about deploying to FastAPI Cloud. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15793">#15793</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🔨 Use <code>gpt-5.5</code> model in <code>translate.py</code>, specify <code>-chat</code> to avoid warnings. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15792">#15792</a> by <a href="https://github.com/YuriiMotov"><code>@YuriiMotov</code></a>.</li> </ul> <h2>0.137.2</h2> <h3>Features</h3> <ul> <li>✨ Add <code>iter_route_contexts()</code> for advanced use cases that used to use <code>router.routes</code> (e.g. Jupyverse). PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15785">#15785</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> </ul> <h3>Translations</h3> <ul> <li>🌐 Fix broken Markdown in Korean custom response docs. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15774">#15774</a> by <a href="https://github.com/kooqooo"><code>@kooqooo</code></a>.</li> <li>🌐 Update translations for fr (update-outdated). PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15761">#15761</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🌐 Update translations for zh-hant (update-outdated). PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15760">#15760</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🌐 Update translations for de (update-outdated). PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15759">#15759</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🌐 Update translations for ko (update-outdated). PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15757">#15757</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🌐 Update translations for uk (update-outdated). PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15756">#15756</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🌐 Update translations for zh (update-outdated). PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15755">#15755</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🌐 Update translations for tr (update-outdated). PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15754">#15754</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🌐 Update translations for pt (update-outdated). PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15753">#15753</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🌐 Update translations for es (update-outdated). PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15752">#15752</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🌐 Update translations for ja (update-outdated). PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15751">#15751</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🌐 Update translations for ru (update-outdated). PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15758">#15758</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> </ul> <h3>Internal</h3> <ul> <li>🔧 Update sponsors: add BairesDev. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15787">#15787</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> <li>🔨 Update sponsors script to simplify previews. PR <a href="https://redirect.github.com/fastapi/fastapi/pull/15786">#15786</a> by <a href="https://github.com/tiangolo"><code>@tiangolo</code></a>.</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/fastapi/fastapi/commit/4b83b0d409009c8de9df4070fe163838b1a700c7"><code>4b83b0d</code></a> 🔖 Release version 0.138.0 (<a href="https://redirect.github.com/fastapi/fastapi/issues/15808">#15808</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/041cb0cdfa2d0f705d14ed07c2c2e0f92ef5f32c"><code>041cb0c</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/10393846ede7a2947cec594d15a43f813001cab4"><code>1039384</code></a> 📝 Fix typo in release notes (<a href="https://redirect.github.com/fastapi/fastapi/issues/15807">#15807</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/0303491b69ff84a4632c0314e6db4df74f2f93f9"><code>0303491</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/190f6e2033c8b886b25027be284d8c8c1893f28c"><code>190f6e2</code></a> 📝 Add Frontend instructions to Agent Library Skill (<a href="https://redirect.github.com/fastapi/fastapi/issues/15805">#15805</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/17945e5ab7f25234340c152a40d232a98857e079"><code>17945e5</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/2260afaf433103c8104b34d256cf0b96b058823b"><code>2260afa</code></a> 🐛 Fix failing test, update format for raised errors (<a href="https://redirect.github.com/fastapi/fastapi/issues/15804">#15804</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/0cd5001d0ef80a07e2d775c5c75522391a3e06d7"><code>0cd5001</code></a> 📝 Update release notes</li> <li><a href="https://github.com/fastapi/fastapi/commit/7cb1ab6264bc03319832f553730b511192a0c0d3"><code>7cb1ab6</code></a> 👷 Fix test-alls-green (<a href="https://redirect.github.com/fastapi/fastapi/issues/15803">#15803</a>)</li> <li><a href="https://github.com/fastapi/fastapi/commit/9c7eceb00ff6e1d37980954418f7c9dab30a4cd5"><code>9c7eceb</code></a> 📝 Update release notes</li> <li>Additional commits viewable in <a href="https://github.com/fastapi/fastapi/compare/0.135.3...0.138.0">compare view</a></li> </ul> </details> <br /> Updates `uvicorn` from 0.44.0 to 0.49.0 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/Kludex/uvicorn/releases">uvicorn's releases</a>.</em></p> <blockquote> <h2>Version 0.49.0</h2> <h2>What's Changed</h2> <ul> <li>Bump httptools minimum version to 0.8.0 by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2962">Kludex/uvicorn#2962</a></li> <li>Consume duplicate forwarding headers in ProxyHeadersMiddleware (reverses the 0.48.0 behavior of ignoring them) by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2971">Kludex/uvicorn#2971</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/Kludex/uvicorn/compare/0.48.0...0.49.0">https://github.com/Kludex/uvicorn/compare/0.48.0...0.49.0</a></p> <h2>Version 0.48.0</h2> <h2>What's Changed</h2> <ul> <li>Default <code>ssl_ciphers</code> to <code>None</code> and use OpenSSL defaults by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2940">Kludex/uvicorn#2940</a></li> <li>Ignore duplicate forwarding headers in <code>ProxyHeadersMiddleware</code> by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2944">Kludex/uvicorn#2944</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/Kludex/uvicorn/compare/0.47.0...0.48.0">https://github.com/Kludex/uvicorn/compare/0.47.0...0.48.0</a></p> <h2>Version 0.47.0</h2> <h2>What's Changed</h2> <ul> <li>Eagerly import the ASGI app in the parent process by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2919">Kludex/uvicorn#2919</a></li> <li>Add <code>ssl_context_factory</code> for custom <code>SSLContext</code> configuration by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2920">Kludex/uvicorn#2920</a></li> <li>Treat <code>fd=0</code> as a valid file descriptor with reload/workers by <a href="https://github.com/eltoder"><code>@eltoder</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2927">Kludex/uvicorn#2927</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/Kludex/uvicorn/compare/0.46.0...0.47.0">https://github.com/Kludex/uvicorn/compare/0.46.0...0.47.0</a></p> <h2>Version 0.46.0</h2> <h2>What's Changed</h2> <ul> <li>Support <code>ws_max_size</code> in <code>wsproto</code> implementation by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2915">Kludex/uvicorn#2915</a></li> <li>Support <code>ws_ping_interval</code> and <code>ws_ping_timeout</code> in <code>wsproto</code> implementation by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2916">Kludex/uvicorn#2916</a></li> <li>Use <code>bytearray</code> for incoming WebSocket message buffer in websockets-sansio by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2917">Kludex/uvicorn#2917</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/Kludex/uvicorn/compare/0.45.0...0.46.0">https://github.com/Kludex/uvicorn/compare/0.45.0...0.46.0</a></p> <h2>Version 0.45.0</h2> <h2>What's Changed</h2> <ul> <li>Preserve forwarded client ports in proxy headers middleware by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2903">Kludex/uvicorn#2903</a></li> <li>Accept <code>os.PathLike</code> for <code>log_config</code> by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2905">Kludex/uvicorn#2905</a></li> <li>Accept <code>log_level</code> strings case-insensitively by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2907">Kludex/uvicorn#2907</a></li> <li>Raise helpful <code>ImportError</code> when PyYAML is missing for YAML log config by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2906">Kludex/uvicorn#2906</a></li> <li>Revert empty context for ASGI runs by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2911">Kludex/uvicorn#2911</a></li> <li>Add <code>--reset-contextvars</code> flag to isolate ASGI request context by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2912">Kludex/uvicorn#2912</a></li> <li>Revert "Emit <code>http.disconnect</code> on server shutdown for streaming responses" (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2829">#2829</a>) by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2913">Kludex/uvicorn#2913</a></li> </ul> <h2>New Contributors</h2> <ul> <li><a href="https://github.com/Krishnachaitanyakc"><code>@Krishnachaitanyakc</code></a> made their first contribution in <a href="https://redirect.github.com/Kludex/uvicorn/pull/2870">Kludex/uvicorn#2870</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/Kludex/uvicorn/compare/0.44.0...0.45.0">https://github.com/Kludex/uvicorn/compare/0.44.0...0.45.0</a></p> </blockquote> </details> <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/Kludex/uvicorn/blob/main/docs/release-notes.md">uvicorn's changelog</a>.</em></p> <blockquote> <h2>0.49.0 (June 3, 2026)</h2> <h3>Changed</h3> <ul> <li>Bump <code>httptools</code> minimum version to 0.8.0 (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2962">#2962</a>)</li> <li>Consume duplicate forwarding headers in <code>ProxyHeadersMiddleware</code> (reverses the 0.48.0 behavior of ignoring them) (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2971">#2971</a>)</li> </ul> <h2>0.48.0 (May 24, 2026)</h2> <h3>Changed</h3> <ul> <li>Default <code>ssl_ciphers</code> to <code>None</code> and use OpenSSL defaults (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2940">#2940</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Ignore duplicate forwarding headers in <code>ProxyHeadersMiddleware</code> (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2944">#2944</a>)</li> </ul> <h2>0.47.0 (May 14, 2026)</h2> <h3>Added</h3> <ul> <li>Add <code>ssl_context_factory</code> for custom <code>SSLContext</code> configuration (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2920">#2920</a>)</li> </ul> <h3>Changed</h3> <ul> <li>Eagerly import the ASGI app in the parent process (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2919">#2919</a>)</li> </ul> <h3>Fixed</h3> <ul> <li>Treat <code>fd=0</code> as a valid file descriptor with reload/workers (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2927">#2927</a>)</li> </ul> <h2>0.46.0 (April 23, 2026)</h2> <h3>Added</h3> <ul> <li>Support <code>ws_max_size</code> in <code>wsproto</code> implementation (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2915">#2915</a>)</li> <li>Support <code>ws_ping_interval</code> and <code>ws_ping_timeout</code> in <code>wsproto</code> implementation (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2916">#2916</a>)</li> </ul> <h3>Changed</h3> <ul> <li>Use <code>bytearray</code> for incoming WebSocket message buffer in <code>websockets-sansio</code> (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2917">#2917</a>)</li> </ul> <h2>0.45.0 (April 21, 2026)</h2> <h3>Added</h3> <ul> <li>Add <code>--reset-contextvars</code> flag to isolate ASGI request context (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2912">#2912</a>)</li> <li>Accept <code>os.PathLike</code> for <code>log_config</code> (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2905">#2905</a>)</li> <li>Accept <code>log_level</code> strings case-insensitively (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2907">#2907</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/Kludex/uvicorn/commit/3ef2e3e08e3d9ad9572800f8bc54f3eaed9eab0a"><code>3ef2e3e</code></a> Version 0.49.0 (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2973">#2973</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/eeb64b1d1c95a14096ed3313377c74b485f558fc"><code>eeb64b1</code></a> Consume duplicate forwarding headers in ProxyHeadersMiddleware (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2971">#2971</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/630f4aca14e79183617c71be714030842a1041c5"><code>630f4ac</code></a> Make the watchfiles reload tests deterministic (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2972">#2972</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/9154922e3730f7aba68ecc3ecbf536680ee8fd1c"><code>9154922</code></a> chore(deps): bump the github-actions group across 1 directory with 6 updates ...</li> <li><a href="https://github.com/Kludex/uvicorn/commit/739727a1d80e468d1e47e98bbd824ee9e3c9554b"><code>739727a</code></a> Migrate docs deploy from Cloudflare Pages to Workers (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2967">#2967</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/be4a240488d3fb678a11b8e8f83505266f5f1de7"><code>be4a240</code></a> Gate docs preview deploy on Cloudflare token presence (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2966">#2966</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/c489d7e10dfe653a2bba914feedf2a632a026e6f"><code>c489d7e</code></a> Bump httptools minimum version to 0.8.0 (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2962">#2962</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/9f547bd82ef52bcba206e04170b359bd6daa25b3"><code>9f547bd</code></a> Skip docs preview deploy for Dependabot PRs (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2961">#2961</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/44446b894e37ca76830d6aa83df4349795400ed4"><code>44446b8</code></a> Migrate documentation from MkDocs Material to Zensical (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2959">#2959</a>)</li> <li><a href="https://github.com/Kludex/uvicorn/commit/cfd659c4f18b526adce9c255c96707bab20af40c"><code>cfd659c</code></a> Bump pymdown-extensions to 10.21.3 (<a href="https://redirect.github.com/Kludex/uvicorn/issues/2958">#2958</a>)</li> <li>Additional commits viewable in <a href="https://github.com/Kludex/uvicorn/compare/0.44.0...0.49.0">compare view</a></li> </ul> </details> <br /> Updates `sse-starlette` from 3.3.4 to 3.4.5 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/sysid/sse-starlette/releases">sse-starlette's releases</a>.</em></p> <blockquote> <h2>v3.4.5</h2> <h2>What's Changed</h2> <ul> <li>chore(deps): bump ujson from 5.12.0 to 5.12.1 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/sysid/sse-starlette/pull/187">sysid/sse-starlette#187</a></li> <li>chore(deps): bump idna from 3.11 to 3.15 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/sysid/sse-starlette/pull/188">sysid/sse-starlette#188</a></li> <li>chore(deps): bump actions/download-artifact from 4 to 8 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/sysid/sse-starlette/pull/190">sysid/sse-starlette#190</a></li> <li>chore(deps): bump starlette from 0.50.0 to 1.0.1 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/sysid/sse-starlette/pull/193">sysid/sse-starlette#193</a></li> <li>chore(deps): bump twisted from 25.5.0 to 26.4.0rc2 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/sysid/sse-starlette/pull/194">sysid/sse-starlette#194</a></li> <li>chore(deps): bump cryptography from 46.0.7 to 48.0.1 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/sysid/sse-starlette/pull/196">sysid/sse-starlette#196</a></li> <li>chore(deps): bump msgpack from 1.1.2 to 1.2.1 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/sysid/sse-starlette/pull/197">sysid/sse-starlette#197</a></li> <li>chore(deps): bump ujson from 5.12.1 to 5.13.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/sysid/sse-starlette/pull/198">sysid/sse-starlette#198</a></li> <li>fix: test selection by <a href="https://github.com/sysid"><code>@sysid</code></a> in <a href="https://redirect.github.com/sysid/sse-starlette/pull/199">sysid/sse-starlette#199</a></li> <li>chore(deps): bump starlette from 1.0.1 to 1.3.1 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/sysid/sse-starlette/pull/195">sysid/sse-starlette#195</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/sysid/sse-starlette/compare/v3.4.4...v3.4.5">https://github.com/sysid/sse-starlette/compare/v3.4.4...v3.4.5</a></p> <h2>v3.4.4</h2> <p><strong>Full Changelog</strong>: <a href="https://github.com/sysid/sse-starlette/compare/v3.4.3...v3.4.4">https://github.com/sysid/sse-starlette/compare/v3.4.3...v3.4.4</a></p> <h2>v3.4.3</h2> <h2>What's Changed</h2> <ul> <li>chore(deps): bump granian from 2.6.0 to 2.7.4 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/sysid/sse-starlette/pull/185">sysid/sse-starlette#185</a></li> <li>chore(deps): bump urllib3 from 2.6.3 to 2.7.0 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/sysid/sse-starlette/pull/186">sysid/sse-starlette#186</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/sysid/sse-starlette/compare/v3.4.2...v3.4.3">https://github.com/sysid/sse-starlette/compare/v3.4.2...v3.4.3</a></p> <h2>v3.4.2</h2> <p><strong>Full Changelog</strong>: <a href="https://github.com/sysid/sse-starlette/compare/v3.4.1...v3.4.2">https://github.com/sysid/sse-starlette/compare/v3.4.1...v3.4.2</a></p> <h2>v3.4.1</h2> <h2>What's Changed</h2> <ul> <li>chore(deps): bump cryptography from 46.0.6 to 46.0.7 by <a href="https://github.com/dependabot"><code>@dependabot</code></a>[bot] in <a href="https://redirect.github.com/sysid/sse-starlette/pull/181">sysid/sse-starlette#181</a></li> <li>Chore/starlette sync by <a href="https://github.com/sysid"><code>@sysid</code></a> in <a href="https://redirect.github.com/sysid/sse-starlette/pull/184">sysid/sse-starlette#184</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/sysid/sse-starlette/compare/v3.3.4...v3.4.1">https://github.com/sysid/sse-starlette/compare/v3.3.4...v3.4.1</a></p> </blockquote> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/sysid/sse-starlette/commit/d45e48299bcaba9a7d17c5baa0ff4108cd534039"><code>d45e482</code></a> Bump version to 3.4.5</li> <li><a href="https://github.com/sysid/sse-starlette/commit/32fbde5a758e63353d67ba3444f5587649a183f0"><code>32fbde5</code></a> Merge pull request <a href="https://redirect.github.com/sysid/sse-starlette/issues/195">#195</a> from sysid/dependabot/uv/starlette-1.3.1</li> <li><a href="https://github.com/sysid/sse-starlette/commit/eba40087f468febb2816c088dc68584be35a48d2"><code>eba4008</code></a> Merge pull request <a href="https://redirect.github.com/sysid/sse-starlette/issues/199">#199</a> from sysid/fix/test-selection</li> <li><a href="https://github.com/sysid/sse-starlette/commit/8685f2fa4255b6da9e49545bee02abb3f489f50e"><code>8685f2f</code></a> fix: test selection</li> <li><a href="https://github.com/sysid/sse-starlette/commit/66c734a3e20af28e3e9af17e57eeed0aae34e5cd"><code>66c734a</code></a> Merge pull request <a href="https://redirect.github.com/sysid/sse-starlette/issues/198">#198</a> from sysid/dependabot/uv/ujson-5.13.0</li> <li><a href="https://github.com/sysid/sse-starlette/commit/fb928d3801bee784cf642124c17f54949eea85e3"><code>fb928d3</code></a> Merge pull request <a href="https://redirect.github.com/sysid/sse-starlette/issues/197">#197</a> from sysid/dependabot/uv/msgpack-1.2.1</li> <li><a href="https://github.com/sysid/sse-starlette/commit/cf620f4ca6663cbb5b074783fedf889b6a59c974"><code>cf620f4</code></a> Merge pull request <a href="https://redirect.github.com/sysid/sse-starlette/issues/196">#196</a> from sysid/dependabot/uv/cryptography-48.0.1</li> <li><a href="https://github.com/sysid/sse-starlette/commit/4a7cd516efd1e7ef6343d5bca0ddb00d3f966ef2"><code>4a7cd51</code></a> chore(deps): bump ujson from 5.12.1 to 5.13.0</li> <li><a href="https://github.com/sysid/sse-starlette/commit/6069864e99255a61f1edc2781e6b2a81b283fbbb"><code>6069864</code></a> chore(deps): bump msgpack from 1.1.2 to 1.2.1</li> <li><a href="https://github.com/sysid/sse-starlette/commit/9485e2be2c13970a834aa73ba4ed0c8d792639b5"><code>9485e2b</code></a> chore(deps): bump cryptography from 46.0.7 to 48.0.1</li> <li>Additional commits viewable in <a href="https://github.com/sysid/sse-starlette/compare/v3.3.4...v3.4.5">compare view</a></li> </ul> </details> <br /> Updates `opentelemetry-api` from 1.41.0 to 1.42.1 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-python/blob/main/CHANGELOG.md">opentelemetry-api's changelog</a>.</em></p> <blockquote> <h2>Version 1.42.1/0.63b1 (2026-05-21)</h2> <h3>Fixed</h3> <ul> <li>Preserve the random trace ID flag when creating child spans instead of always setting the random trace id bit depending on the available trace id generator. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5241">#5241</a>)</li> </ul> <h2>Version 1.42.0/0.63b0 (2026-05-19)</h2> <h3>Added</h3> <ul> <li><code>opentelemetry-api</code>, <code>opentelemetry-sdk</code>: add support for 'random-trace-id' flags in W3C traceparent header trace flags. Implementations of <code>IdGenerator</code> that do randomly generate the 56 least significant bits, should also implement a <code>is_trace_id_random</code> methods that returns <code>True</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4854">#4854</a>)</li> <li>logs: add exception support to Logger emit and LogRecord attributes (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4908">#4908</a>)</li> <li><code>opentelemetry-exporter-otlp-proto-grpc</code>: make retryable gRPC error codes configurable for gRPC exporters (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4917">#4917</a>)</li> <li><code>opentelemetry-sdk</code>: Add <code>create_logger_provider</code>/<code>configure_logger_provider</code> to declarative file configuration, enabling LoggerProvider instantiation from config files without reading env vars (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4990">#4990</a>)</li> <li><code>opentelemetry-exporter-otlp-json-common</code>: add 'opentelemetry-exporter-otlp-json-common' package for OTLP JSON exporters (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4996">#4996</a>)</li> <li><code>opentelemetry-sdk</code>: Add <code>service</code> resource detector support to declarative file configuration via <code>detection_development.detectors[].service</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5003">#5003</a>)</li> <li><code>opentelemetry-docker-tests</code>: add docker-tests coverage of <code>opentelemetry-exporter-otlp-proto-grpc</code> and <code>opentelemetry-exporter-otlp-proto-http</code> metrics export (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5030">#5030</a>)</li> <li>Add <code>registry</code> keyword argument to <code>PrometheusMetricReader</code> to allow passing a custom Prometheus registry (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5055">#5055</a>)</li> <li>Add WeaverLiveCheck test util (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5088">#5088</a>)</li> <li><code>opentelemetry-sdk</code>: add <code>load_entry_point</code> shared utility to declarative file configuration for loading plugins via entry points; refactor propagator loading to use it (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5093">#5093</a>)</li> <li><code>opentelemetry-sdk</code>: add sampler plugin loading to declarative file configuration via the <code>opentelemetry_sampler</code> entry point group, matching the spec's PluginComponentProvider mechanism (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5095">#5095</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/367e14d01104785ac28b1c66ac32b2082f864a12"><code>367e14d</code></a> Prepare release 1.42.1/0.63b1 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5243">#5243</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/fd8e50410b1788d34b36173dea58d8e38dcc80bc"><code>fd8e504</code></a> Preserve random trace ID flag for child spans (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5241">#5241</a>) (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5242">#5242</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/013045e3787654123b08530059759842312325ab"><code>013045e</code></a> [release/v1.42.x-0.63bx] Prepare release 1.42.0/0.63b0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5225">#5225</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/1731583b4e7bc6ec6a33345aa19706fc83acc8d5"><code>1731583</code></a> ci: Enable GitHub Merge Queue support (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5209">#5209</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/7fab34d4f49c1cd67df07fa53471c0ae6c269008"><code>7fab34d</code></a> fix(config): allow deflate for OTLP HTTP exporters (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5075">#5075</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/0b690d2139f68dd42d2425c920aec882698443fa"><code>0b690d2</code></a> ci: validate changelog fragment filenames (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5212">#5212</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/d4fabb4d6d79812a6d38dd900212f6a0fdb1866b"><code>d4fabb4</code></a> feat(config): exporter plugin loading via entry points for declarative config...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/e19d34600b177b97cf1d8320a77ff75133515012"><code>e19d346</code></a> feat(config): generic resource detector plugin loading for declarative config...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/1d69bd2eaa02715ecf3877a8f391678be58f2f57"><code>1d69bd2</code></a> sdk/metrics: copy attributes dict to prevent post-recording mutation (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5106">#5106</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/990a6112a124e53cc0e3f66871ce8f8d00955d15"><code>990a611</code></a> feat(config): propagator plugin loading via entry points for declarative conf...</li> <li>Additional commits viewable in <a href="https://github.com/open-telemetry/opentelemetry-python/compare/v1.41.0...v1.42.1">compare view</a></li> </ul> </details> <br /> Updates `opentelemetry-sdk` from 1.41.0 to 1.42.1 <details> <summary>Changelog</summary> <p><em>Sourced from <a href="https://github.com/open-telemetry/opentelemetry-python/blob/main/CHANGELOG.md">opentelemetry-sdk's changelog</a>.</em></p> <blockquote> <h2>Version 1.42.1/0.63b1 (2026-05-21)</h2> <h3>Fixed</h3> <ul> <li>Preserve the random trace ID flag when creating child spans instead of always setting the random trace id bit depending on the available trace id generator. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5241">#5241</a>)</li> </ul> <h2>Version 1.42.0/0.63b0 (2026-05-19)</h2> <h3>Added</h3> <ul> <li><code>opentelemetry-api</code>, <code>opentelemetry-sdk</code>: add support for 'random-trace-id' flags in W3C traceparent header trace flags. Implementations of <code>IdGenerator</code> that do randomly generate the 56 least significant bits, should also implement a <code>is_trace_id_random</code> methods that returns <code>True</code>. (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4854">#4854</a>)</li> <li>logs: add exception support to Logger emit and LogRecord attributes (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4908">#4908</a>)</li> <li><code>opentelemetry-exporter-otlp-proto-grpc</code>: make retryable gRPC error codes configurable for gRPC exporters (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4917">#4917</a>)</li> <li><code>opentelemetry-sdk</code>: Add <code>create_logger_provider</code>/<code>configure_logger_provider</code> to declarative file configuration, enabling LoggerProvider instantiation from config files without reading env vars (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4990">#4990</a>)</li> <li><code>opentelemetry-exporter-otlp-json-common</code>: add 'opentelemetry-exporter-otlp-json-common' package for OTLP JSON exporters (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/4996">#4996</a>)</li> <li><code>opentelemetry-sdk</code>: Add <code>service</code> resource detector support to declarative file configuration via <code>detection_development.detectors[].service</code> (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5003">#5003</a>)</li> <li><code>opentelemetry-docker-tests</code>: add docker-tests coverage of <code>opentelemetry-exporter-otlp-proto-grpc</code> and <code>opentelemetry-exporter-otlp-proto-http</code> metrics export (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5030">#5030</a>)</li> <li>Add <code>registry</code> keyword argument to <code>PrometheusMetricReader</code> to allow passing a custom Prometheus registry (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5055">#5055</a>)</li> <li>Add WeaverLiveCheck test util (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5088">#5088</a>)</li> <li><code>opentelemetry-sdk</code>: add <code>load_entry_point</code> shared utility to declarative file configuration for loading plugins via entry points; refactor propagator loading to use it (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5093">#5093</a>)</li> <li><code>opentelemetry-sdk</code>: add sampler plugin loading to declarative file configuration via the <code>opentelemetry_sampler</code> entry point group, matching the spec's PluginComponentProvider mechanism (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/pull/5095">#5095</a>)</li> </ul> <!-- raw HTML omitted --> </blockquote> <p>... (truncated)</p> </details> <details> <summary>Commits</summary> <ul> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/367e14d01104785ac28b1c66ac32b2082f864a12"><code>367e14d</code></a> Prepare release 1.42.1/0.63b1 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5243">#5243</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/fd8e50410b1788d34b36173dea58d8e38dcc80bc"><code>fd8e504</code></a> Preserve random trace ID flag for child spans (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5241">#5241</a>) (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5242">#5242</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/013045e3787654123b08530059759842312325ab"><code>013045e</code></a> [release/v1.42.x-0.63bx] Prepare release 1.42.0/0.63b0 (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5225">#5225</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/1731583b4e7bc6ec6a33345aa19706fc83acc8d5"><code>1731583</code></a> ci: Enable GitHub Merge Queue support (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5209">#5209</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/7fab34d4f49c1cd67df07fa53471c0ae6c269008"><code>7fab34d</code></a> fix(config): allow deflate for OTLP HTTP exporters (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5075">#5075</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/0b690d2139f68dd42d2425c920aec882698443fa"><code>0b690d2</code></a> ci: validate changelog fragment filenames (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5212">#5212</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/d4fabb4d6d79812a6d38dd900212f6a0fdb1866b"><code>d4fabb4</code></a> feat(config): exporter plugin loading via entry points for declarative config...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/e19d34600b177b97cf1d8320a77ff75133515012"><code>e19d346</code></a> feat(config): generic resource detector plugin loading for declarative config...</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/1d69bd2eaa02715ecf3877a8f391678be58f2f57"><code>1d69bd2</code></a> sdk/metrics: copy attributes dict to prevent post-recording mutation (<a href="https://redirect.github.com/open-telemetry/opentelemetry-python/issues/5106">#5106</a>)</li> <li><a href="https://github.com/open-telemetry/opentelemetry-python/commit/990a6112a124e53cc0e3f66871ce8f8d00955d15"><code>990a611</code></a> feat(config): propagator plugin loading via entry points for declarative conf...</li> <li>Additional commits viewable in <a href="https://github.com/open-telemetry/opentelemetry-python/compare/v1.41.0...v1.42.1">compare view</a></li> </ul> </details> <br /> Updates `python-multipart` from 0.0.26 to 0.0.32 <details> <summary>Release notes</summary> <p><em>Sourced from <a href="https://github.com/Kludex/python-multipart/releases">python-multipart's releases</a>.</em></p> <blockquote> <h2>Version 0.0.32</h2> <h2>What's Changed</h2> <ul> <li>Replace per-byte partial-boundary scan with rfind lookbehind by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/python-multipart/pull/300">Kludex/python-multipart#300</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/Kludex/python-multipart/compare/0.0.31...0.0.32">https://github.com/Kludex/python-multipart/compare/0.0.31...0.0.32</a></p> <h2>Version 0.0.31</h2> <h2>What's Changed</h2> <ul> <li>Speed up multipart header parsing and callback dispatch by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/python-multipart/pull/295">Kludex/python-multipart#295</a></li> <li>Bound header field name size before validating by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/python-multipart/pull/296">Kludex/python-multipart#296</a></li> <li>Validate Content-Length is non-negative in parse_form by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/python-multipart/pull/297">Kludex/python-multipart#297</a></li> </ul> <p><strong>Full Changelog</strong>: <a href="https://github.com/Kludex/python-multipart/compare/0.0.30...0.0.31">https://github.com/Kludex/python-multipart/compare/0.0.30...0.0.31</a></p> <h2>Version 0.0.30</h2> <h2>What's Changed</h2> <ul> <li>Treat only <code>&</code> as the urlencoded field separator by <a href="https://github.com/Kludex"><code>@Kludex</code></a> in <a href="https://redirect.github.com/Kludex/python-multipart/pull/290">Kludex/python-multipart#290</a></li> <li>Ignore RFC 2231 extended parameters in <code>pa…
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Hi — I'm a CPython core developer working on free-threading and maintainer of asyncio.
This PR fixes the crash on free-threading caused by deference reference counted objects not traversed by greenlet during GC traversal.
In free-threading, some of the refs to objects held by the interpreter uses a special reference type called "deferred reference". Such references are used on some objects like functions and classes to reduce reference contention on the objects and they must be traversed by the free-threaded GC so that it doesn't free these objects prematurely.
Greenlet currently crashes on free-threading because greenlets hold suspended frames which on free-threading can contain objects with deferred reference count. The suspended frames needs to be GC traversed so that the GC doesn't free objects early causing a crash at runtime exit.
In 3.15+, I exposed
_PyGC_VisitStackRefand_PyGC_VisitFrameStackin python/cpython#150767 which is used in this PR so that suspended frames of greenlets can be traversed by the GC. This fixes the crash and as a side effect also fixes the "A Cycle Of Greenlets Is A Leak" because suspended frames are now traversed so they can now be collected by the GC instead of being leaked. I have added tests on 3.15+ to ensure that suspended frames are gc collected and finalizers of locals are triggered properly.