Skip to content

docs: add shutdown-order tests to the integration checklist - #707

Merged
lesnik512 merged 1 commit into
mainfrom
docs/shutdown-order-checklist
Oct 17, 2026
Merged

lesnik512 merged 1 commit into
mainfrom
docs/shutdown-order-checklist

Conversation

@lesnik512

Copy link
Copy Markdown
Member

Adds a checklist item to writing-integrations: test that shutdown hooks registered before and after setup_di can resolve APP dependencies and that APP finalizers run after them, over two lifespan cycles, including sub-routers, mounted apps or middleware where the framework has them. Where the framework can't give that order, a test pins the actual behavior and the usage page says so.

This is the bug that starlette, fastapi, litestar, faststream, taskiq, aiogram, celery and flask each had and fixed separately. The "Lifecycle rules" section already states the rule; this makes it a test requirement for new integrations.

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Details
Benchmark suite Current: e362d76 Previous: 796d1d7 Ratio
benchmarks/test_guard_by_type.py::test_g16_resolve_by_type 3328083.83577078 iter/sec (stddev: 1.3789961426468728e-8) 7372798.399471296 iter/sec (stddev: 3.62650598554965e-9) 2.22
benchmarks/test_guard_by_type.py::test_g17_resolve_by_type_large_registry 3248547.3308437127 iter/sec (stddev: 1.301445291627227e-8) 7090843.27498835 iter/sec (stddev: 6.978308539459101e-9) 2.18
benchmarks/test_guard_cold.py::test_g8_cold_first_resolve 15948.505465557568 iter/sec (stddev: 0.00005160729011081122) 32431.921827546612 iter/sec (stddev: 0.00003127773477475113) 2.03
benchmarks/test_guard_cold.py::test_g8b_cold_first_resolve_cached 12591.34746103437 iter/sec (stddev: 0.00014339974868795468) 26305.249044013835 iter/sec (stddev: 0.00016103870141411883) 2.09
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[1] 484.72590847290564 iter/sec (stddev: 0.00003206327372197167) 938.6061456058358 iter/sec (stddev: 0.000010379118271496751) 1.94
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[2] 469.53747557828274 iter/sec (stddev: 0.00004589785101633221) 920.9057533550372 iter/sec (stddev: 0.000014531904476522506) 1.96
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[4] 438.71966578454067 iter/sec (stddev: 0.0000500089590283497) 869.8819503744008 iter/sec (stddev: 0.0000230703110485245) 1.98
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[1] 11867.700066376441 iter/sec (stddev: 0.000009818157960104652) 26391.473970545856 iter/sec (stddev: 0.000005273216676922491) 2.22
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[2] 6515.725894480302 iter/sec (stddev: 0.0000292533404169582) 11771.054173390345 iter/sec (stddev: 0.000013181380395728042) 1.81
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[4] 3284.328236642249 iter/sec (stddev: 0.00004524209228957394) 6432.94939527733 iter/sec (stddev: 0.00002073535941746037) 1.96
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[1] 9625.09995068395 iter/sec (stddev: 0.000012213904294854613) 21101.000996227154 iter/sec (stddev: 0.000006392986313381337) 2.19
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[2] 4127.332897535239 iter/sec (stddev: 0.000037165909804482126) 9165.31548273976 iter/sec (stddev: 0.000026871765293572373) 2.22
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[4] 1995.0949924592785 iter/sec (stddev: 0.00004659232279940512) 4120.589745676914 iter/sec (stddev: 0.000020556532829378764) 2.07
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[1] 36374.063594933825 iter/sec (stddev: 0.000006826121143375996) 63121.18478245755 iter/sec (stddev: 0.0000016607299090743504) 1.74
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[2] 12250.228058402288 iter/sec (stddev: 0.0000645403657699118) 26371.852794083203 iter/sec (stddev: 0.000009274538878946582) 2.15
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[4] 5803.503526717936 iter/sec (stddev: 0.00003146995985856886) 11444.815436637611 iter/sec (stddev: 0.00001982202768039523) 1.97
benchmarks/test_guard_lifecycle.py::test_g6_build_child_container 1576525.0998341513 iter/sec (stddev: 4.606296827852123e-8) 3281535.391025776 iter/sec (stddev: 1.977270264503631e-8) 2.08
benchmarks/test_guard_lifecycle.py::test_g6b_build_child_container_auto_scope 1665556.4345084627 iter/sec (stddev: 2.1200140887840936e-8) 3733862.5959220864 iter/sec (stddev: 9.49832022790783e-9) 2.24
benchmarks/test_guard_lifecycle.py::test_g7_request_lifecycle_batch 3110.8680929644065 iter/sec (stddev: 0.000010642766616102202) 6919.5674603993175 iter/sec (stddev: 0.000006269892860260953) 2.22
benchmarks/test_guard_lifecycle.py::test_g7c_event_loop_floor_control 57909.51326703042 iter/sec (stddev: 0.0000019897052554841927) 118442.18752254656 iter/sec (stddev: 8.450119549815983e-7) 2.05
benchmarks/test_guard_lifecycle.py::test_g7b_request_cycle_sync 293209.55120730086 iter/sec (stddev: 5.611484875542857e-7) 866230.0434135109 iter/sec (stddev: 4.790068076057982e-8) 2.95
benchmarks/test_guard_lifecycle.py::test_g13_teardown_at_scale 57942.24252770016 iter/sec (stddev: 0.000004530956230937567) 137808.16399709598 iter/sec (stddev: 6.050930273822687e-7) 2.38
benchmarks/test_guard_lifecycle.py::test_g13b_teardown_at_scale_async_no_finalizers 590.3722204818099 iter/sec (stddev: 0.0010619349116171499) 1185.243332134372 iter/sec (stddev: 0.0012216001199847589) 2.01
benchmarks/test_guard_resolve.py::test_g1_transient_resolve 2120965.2215749878 iter/sec (stddev: 4.838924176700378e-8) 4297916.993026516 iter/sec (stddev: 1.9347939953554305e-8) 2.03
benchmarks/test_guard_resolve.py::test_g2_cached_resolve 3623935.514244975 iter/sec (stddev: 9.423188078140955e-9) 7113664.695410467 iter/sec (stddev: 4.03947048292229e-9) 1.96
benchmarks/test_guard_resolve.py::test_g3_deep_chain 801446.1454530373 iter/sec (stddev: 4.687023981718817e-8) 1631601.7103587475 iter/sec (stddev: 3.0235523112569035e-8) 2.04
benchmarks/test_guard_resolve.py::test_g4_wide_resolve 475143.9715932098 iter/sec (stddev: 4.066685511596947e-7) 949292.4970475482 iter/sec (stddev: 3.346421762541182e-7) 2.00
benchmarks/test_guard_resolve.py::test_g5_cross_scope 2006002.360269828 iter/sec (stddev: 3.4109405612642465e-8) 3925241.8071562117 iter/sec (stddev: 1.8753310542163203e-8) 1.96
benchmarks/test_guard_resolve.py::test_g9_context_resolve 1401909.4146429652 iter/sec (stddev: 1.53102660536963e-7) 2909564.6920150965 iter/sec (stddev: 1.323754147608128e-7) 2.08
benchmarks/test_guard_resolve.py::test_g12_override_active_resolve 828994.7547411663 iter/sec (stddev: 3.3807575296577596e-8) 1675569.947206955 iter/sec (stddev: 1.4255572872427938e-8) 2.02
benchmarks/test_guard_resolve.py::test_g18_alias_hop 3648747.3522012853 iter/sec (stddev: 8.523025322367646e-9) 7619537.591612742 iter/sec (stddev: 3.7202838505350956e-9) 2.09
benchmarks/test_guard_validate.py::test_g10_validate_deep_chain 31161.43336363541 iter/sec (stddev: 0.00021653693422841707) 77795.22926448792 iter/sec (stddev: 0.000010870829964214464) 2.50
benchmarks/test_guard_validate.py::test_g11_validate_wide 21235.125652734627 iter/sec (stddev: 0.00002350175143019527) 44766.03635445485 iter/sec (stddev: 0.000014002705513910401) 2.11

This comment was automatically generated by workflow using github-action-benchmark.

@lesnik512
lesnik512 merged commit 1fe9404 into main Oct 17, 2026
12 checks passed
@lesnik512
lesnik512 deleted the docs/shutdown-order-checklist branch October 17, 2026 14:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant