)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c502a8e91dfcf84a8dc928e2ec831c72f56a17c7","unresolved":true,"context_lines":[{"line_number":21,"context_line":"migration, build instance etc) are tacked separatly via"},{"line_number":22,"context_line":"future.add_done_callback."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Live migratioh and resize/cold migration operations are distributed"},{"line_number":25,"context_line":"with multiple RPC requests on source and destination host so tasks"},{"line_number":26,"context_line":"are tracked and mark completed via multiple RPC methods."},{"line_number":27,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"fc077482_1fba2fee","line":24,"range":{"start_line":24,"start_character":5,"end_line":24,"end_character":14},"updated":"2026-07-23 22:14:19.000000000","message":"migration","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"56b6653c712602c195b7b31d00934202f9039dd5","unresolved":false,"context_lines":[{"line_number":21,"context_line":"migration, build instance etc) are tacked separatly via"},{"line_number":22,"context_line":"future.add_done_callback."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Live migratioh and resize/cold migration operations are distributed"},{"line_number":25,"context_line":"with multiple RPC requests on source and destination host so tasks"},{"line_number":26,"context_line":"are tracked and mark completed via multiple RPC methods."},{"line_number":27,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"d0f49c5c_1306b938","line":24,"range":{"start_line":24,"start_character":5,"end_line":24,"end_character":14},"in_reply_to":"fc077482_1fba2fee","updated":"2026-07-25 04:02:50.000000000","message":"Done","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d03f01c1bad4114052ea1ce05d514e33cbdaa84a","unresolved":true,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"2. Long running background tasks. Long running background tasks"},{"line_number":20,"context_line":"which runs on a different thread than RPC (for example, live"},{"line_number":21,"context_line":"migration, build instance etc) are tacked separatly via"},{"line_number":22,"context_line":"future.add_done_callback."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Live migration and resize/cold migration operations are distributed"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"4dd801b5_c1509f58","line":21,"range":{"start_line":21,"start_character":35,"end_line":21,"end_character":51},"updated":"2026-07-31 13:48:08.000000000","message":"\"tracked separately\"","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"12105a8e1706c65bb8a41d9ec442fba2a4fd791b","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"2. Long running background tasks. Long running background tasks"},{"line_number":20,"context_line":"which runs on a different thread than RPC (for example, live"},{"line_number":21,"context_line":"migration, build instance etc) are tacked separatly via"},{"line_number":22,"context_line":"future.add_done_callback."},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Live migration and resize/cold migration operations are distributed"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"1aba54f6_05054ba8","line":21,"range":{"start_line":21,"start_character":35,"end_line":21,"end_character":51},"in_reply_to":"4dd801b5_c1509f58","updated":"2026-07-31 18:28:08.000000000","message":"Done","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"861ccccf5a8f02750be4c035a1ee43e1bfd71693","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"8ed228ef_7bb01751","updated":"2026-07-07 18:29:45.000000000","message":"seems like unit test running eventlet mode failing for monkey patch thread.join() raise timeout \n\nft1.29: nova.tests.unit.test_service.ServiceTestCase.test_run_manager_graceful_shutdown_warns_on_timeouttesttools.testresult.real._StringException: pythonlogging:\u0027\u0027: {{{2026-07-07 15:14:34,788 WARNING [oslo_policy.policy] Policy Rules [\u0027os_compute_api:extensions\u0027, \u0027os_compute_api:os-floating-ip-pools\u0027, \u0027os_compute_api:os-quota-sets:defaults\u0027, \u0027os_compute_api:os-availability-zone:list\u0027, \u0027os_compute_api:limits\u0027, \u0027project_manager_api\u0027, \u0027project_member_api\u0027, \u0027project_reader_api\u0027, \u0027service_api\u0027, \u0027project_manager_or_admin\u0027, \u0027project_member_or_admin\u0027, \u0027project_reader_or_admin\u0027, \u0027service_or_admin\u0027, \u0027os_compute_api:limits:other_project\u0027, \u0027os_compute_api:os-lock-server:unlock:unlock_override\u0027, \u0027os_compute_api:servers:create:zero_disk_flavor\u0027, \u0027compute:servers:resize:cross_cell\u0027, \u0027os_compute_api:os-shelve:unshelve_to_host\u0027] specified in policy files are the same as the defaults provided by the service. You can remove these rules from policy files which will make maintenance easier. You can detect these redundant rules by ``oslopolicy-list-redundant`` tool also.}}}\n\nTraceback (most recent call last):\n  File \"/usr/lib/python3.13/unittest/mock.py\", line 1426, in patched\n    return func(*newargs, **newkeywargs)\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/tests/unit/test_service.py\", line 429, in test_run_manager_graceful_shutdown_warns_on_timeout\n    serv._run_manager_graceful_shutdown()\n    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^\n  File \"/home/zuul/src/opendev.org/openstack/nova/nova/service.py\", line 409, in _run_manager_graceful_shutdown\n    shutdown_thread.join(timeout)\n    ~~~~~~~~~~~~~~~~~~~~^^^^^^^^^\n  File \"/usr/lib/python3.13/threading.py\", line 1094, in join\n    self._handle.join(timeout)\n    ~~~~~~~~~~~~~~~~~^^^^^^^^^\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/py313/lib/python3.13/site-packages/eventlet/green/thread.py\", line 74, in join\n    return with_timeout(timeout, self._greenthread.wait)\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/py313/lib/python3.13/site-packages/eventlet/timeout.py\", line 148, in with_timeout\n    return function(*args, **kwds)\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/py313/lib/python3.13/site-packages/eventlet/greenthread.py\", line 232, in wait\n    return self._exit_event.wait()\n           ~~~~~~~~~~~~~~~~~~~~~^^\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/py313/lib/python3.13/site-packages/eventlet/event.py\", line 124, in wait\n    result \u003d hub.switch()\n  File \"/home/zuul/src/opendev.org/openstack/nova/.tox/py313/lib/python3.13/site-packages/eventlet/hubs/hub.py\", line 310, in switch\n    return self.greenlet.switch()\n           ~~~~~~~~~~~~~~~~~~~~^^\neventlet.timeout.Timeout: 1 second","commit_id":"ff5d5311c7c181d0f2faef53c52e78b8795d4ceb"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"e6b7e7a4bd223e2e465af06b2d453c4d53556bc7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"22870f47_2de694a2","updated":"2026-07-08 21:36:20.000000000","message":"recheck sdk job post failure and server error in graceful shutdown job","commit_id":"dadce06e31e67b7cd68883f026ed1eb504cf4c79"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ec95782e10f187e048e9ac823d7da46e38cd288d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"a15fb6f6_e48714f6","updated":"2026-07-10 18:34:57.000000000","message":"recheck another run in case any other timing issue","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"eb3246a3a720c4fc859b7dfecf97ebe19863e22b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"4b2c3071_4a20a9bb","updated":"2026-07-28 22:37:54.000000000","message":"This looks pretty OK to me. Need to review the next patches.","commit_id":"6098b2daa24a90b1408a947828b5d0380099f891"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"20895d5b86602a2aa9aaff5bcf0ab7cf8b193291","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"6201bb58_9d07ead9","updated":"2026-07-30 02:23:03.000000000","message":"Updates look good, will review the next patches.","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"e0af42c702e79bd6422c3226977c726b9c62be1d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"17bbbb49_1a43852d","updated":"2026-07-30 03:45:08.000000000","message":"recheck ssh timeout in test_image_defined_boot_from_volume","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"12105a8e1706c65bb8a41d9ec442fba2a4fd791b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"eadfaefa_65eab9bf","updated":"2026-07-31 18:28:08.000000000","message":"thanks for review, replied inline","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"948b2908d95a850e6f66e7f014be2be086ec214d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"d9415cec_82b1a61d","updated":"2026-08-04 21:52:28.000000000","message":"Didn\u0027t get to the rest of the tests like I planned today, but committing a comment I did get to.","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b833769406c10b8136b9c946eb3a34cc258aa800","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"4412da1d_d409fa96","updated":"2026-08-05 15:26:17.000000000","message":"This is a whole lot of stuff to have in a single patch. Feels like maybe we could have split this up into some setup, and then compute, conductor, scheduler patches or something. Probably not worth splitting now, but just sayin\u0027.","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4a0757799d630492a61df6063c0d473d3d0eeea0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"001db020_1634403f","updated":"2026-08-03 17:19:57.000000000","message":"changes look good thanks, gmaan. I still have to go through the tests but left a typo comment.","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3b3329adaa024639cac097f4a774ef94098a27fb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3dfcec88_64d2e1bf","updated":"2026-08-03 17:30:01.000000000","message":"recheck unrelated unit fail to get the coverage report","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"5cf8dbbac7705e9bbec14cf6be1470e5eb507cef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"8607b7f1_b01368c4","in_reply_to":"001db020_1634403f","updated":"2026-08-04 17:09:16.000000000","message":"Thanks. ack, will wait in case you have anything in tests to fix/add.","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ea9d7b982ed921c1cc1fb55b2f5d5b17bdd5e0ea","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"cbbeddba_837bb465","in_reply_to":"4412da1d_d409fa96","updated":"2026-08-06 03:46:39.000000000","message":"yeah, initially i thought of separating it with sync vs async tracking model but end up doing in same.","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ac5e332efa39d25cda15172e8ebfff75f29f5632","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"5e819234_a0948129","updated":"2026-08-06 17:09:47.000000000","message":"A couple more comments but this is looking good I think. I really like the generic intercept helper and I think that makes it all much cleaner than reproducing that in each test.","commit_id":"65962d01d7f43a8087920bb1d8f1991ec4c7dfb1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"b4c19b8ab1f771a29057ba7827f4d005bedd6983","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"2942b601_7131054e","updated":"2026-08-06 15:50:14.000000000","message":"recheck some infra/mirror issue","commit_id":"65962d01d7f43a8087920bb1d8f1991ec4c7dfb1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d4cd628ee29187cd3349bfe593ec91dc0c9b002d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"bb1bcd85_2e9a5c57","updated":"2026-08-06 19:46:22.000000000","message":"recheck ssh timeout in TestVolumeBootPattern","commit_id":"65962d01d7f43a8087920bb1d8f1991ec4c7dfb1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5cbfaebe761cf8cad601144ccc68e9e50e3d5e05","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"24fafa33_c46399fa","updated":"2026-08-10 15:30:06.000000000","message":"Question inline about the fixture docstring. Otherwise I think I\u0027m good. I haven\u0027t actually tested this locally.. I assume I should because we don\u0027t have any whitebox tests (or do we)?","commit_id":"9b33a271a7dc30b834314cf85c2cf5b28bc3b6b6"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"eab4e0c23896e5b70c9054da71141ead6a467f80","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"60cc7954_4e2dd9f4","in_reply_to":"24fafa33_c46399fa","updated":"2026-08-10 16:52:32.000000000","message":"We do not have whitebox test for it, but we do have nova-graceful-shutdown job with gate hook. That runs the difference operations during shutdown and check that shutdown waits for those operations to complete. \n\n- https://github.com/openstack/nova/tree/master/roles/run-graceful-shutdown-tests\n\nThat tests the graceful shutdown as close to production (not exact task tracking things but overall use case). This file shows all scenario, that job testing, please let me know if anything else to add/modify there?- https://github.com/openstack/nova/blob/master/roles/run-graceful-shutdown-tests/tasks/main.yaml","commit_id":"9b33a271a7dc30b834314cf85c2cf5b28bc3b6b6"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7e64a67f93a99772ac452379fcd21ece3cb75e14","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"d0400524_883a42b1","updated":"2026-08-12 13:58:45.000000000","message":"I have tested this and experienced a graceful shutdown. I:\n\n0. Modified the `stop_instance()` method in nova-compute to `time.sleep(120)` first thing\n1. Started two instances\n2. Issued a stop on the first instance\n3. `pkill -f nova-compute`\n4. Observed it going into graceful shutdown and log \"waiting for 1 in-progress tasks\"\n5. Issued a stop on the second instance\n6. Observed it not start the same process on the compute, not change state via the API, and saw a single pending message in the `nova_cell1@compute.$host` queue\n7. Saw the compute finish shutting down with no change to the second instance\n8. Waited several minutes, item still pending in the queue\n9. Restarted nova-compute and observed it consume the queued stop for the second instance and complete it.","commit_id":"fec26fb64baef2251bf547850ae71edfa6a7413d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9999ed52243ea499465e5c32ea0aa20e41e2fca6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"715c3811_cbb44e23","updated":"2026-08-13 23:07:07.000000000","message":"Updates look good to me and behavior was additionally tested by Dan, +W","commit_id":"fec26fb64baef2251bf547850ae71edfa6a7413d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"159bfe945c937a6d4792997c469575d52f9894b6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"16ac7e4e_c50c2ca5","updated":"2026-08-14 13:46:49.000000000","message":"recheck greande failures not related","commit_id":"fec26fb64baef2251bf547850ae71edfa6a7413d"}],"nova/compute/manager.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c502a8e91dfcf84a8dc928e2ec831c72f56a17c7","unresolved":true,"context_lines":[{"line_number":1910,"context_line":"        should transit the in-progress tasks to safe termination point. The"},{"line_number":1911,"context_line":"        safe termination point can be either complete or abort them."},{"line_number":1912,"context_line":"        \"\"\""},{"line_number":1913,"context_line":"        cleanup_reserved_time \u003d 20"},{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"        wait_timeout \u003d max(0, timeout - cleanup_reserved_time)"},{"line_number":1916,"context_line":"        LOG.debug(\u0027Compute manager waiting up to %s seconds for in-progress \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"1000babf_5c1c0fa6","line":1913,"updated":"2026-07-23 22:14:19.000000000","message":"What is the cleanup_reserved_time for? If manager_shutdown_timeout \u003c\u003d 20 then wait_timeout would be zero. It would be nice to have a code comment or other explanation in the docstring about what it means or what it\u0027s for.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"56b6653c712602c195b7b31d00934202f9039dd5","unresolved":false,"context_lines":[{"line_number":1910,"context_line":"        should transit the in-progress tasks to safe termination point. The"},{"line_number":1911,"context_line":"        safe termination point can be either complete or abort them."},{"line_number":1912,"context_line":"        \"\"\""},{"line_number":1913,"context_line":"        cleanup_reserved_time \u003d 20"},{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"        wait_timeout \u003d max(0, timeout - cleanup_reserved_time)"},{"line_number":1916,"context_line":"        LOG.debug(\u0027Compute manager waiting up to %s seconds for in-progress \u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"296e8ca9_ae01f223","line":1913,"in_reply_to":"1000babf_5c1c0fa6","updated":"2026-07-25 04:02:50.000000000","message":"that is for cleanup_host(L1923). that is good point of manager_shutdown_timeout is less than 20 sec. let me fix that and add comment for what it is for.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c502a8e91dfcf84a8dc928e2ec831c72f56a17c7","unresolved":true,"context_lines":[{"line_number":1913,"context_line":"        cleanup_reserved_time \u003d 20"},{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"        wait_timeout \u003d max(0, timeout - cleanup_reserved_time)"},{"line_number":1916,"context_line":"        LOG.debug(\u0027Compute manager waiting up to %s seconds for in-progress \u0027"},{"line_number":1917,"context_line":"                  \u0027tasks to complete.\u0027, wait_timeout)"},{"line_number":1918,"context_line":"        self._wait_for_in_progress_tasks(wait_timeout)"},{"line_number":1919,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"bbea90df_57941208","line":1916,"range":{"start_line":1916,"start_character":12,"end_line":1916,"end_character":17},"updated":"2026-07-23 22:14:19.000000000","message":"I know this is pre-existing code but would we not want to log this at INFO at least? So that someone checking the logs would know why nova-compute is not going ahead and shutting down if it\u0027s in the middle of waiting? Or are there other logging that covers this some other way maybe.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"56b6653c712602c195b7b31d00934202f9039dd5","unresolved":false,"context_lines":[{"line_number":1913,"context_line":"        cleanup_reserved_time \u003d 20"},{"line_number":1914,"context_line":""},{"line_number":1915,"context_line":"        wait_timeout \u003d max(0, timeout - cleanup_reserved_time)"},{"line_number":1916,"context_line":"        LOG.debug(\u0027Compute manager waiting up to %s seconds for in-progress \u0027"},{"line_number":1917,"context_line":"                  \u0027tasks to complete.\u0027, wait_timeout)"},{"line_number":1918,"context_line":"        self._wait_for_in_progress_tasks(wait_timeout)"},{"line_number":1919,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"36ae01f1_d1e7101a","line":1916,"range":{"start_line":1916,"start_character":12,"end_line":1916,"end_character":17},"in_reply_to":"bbea90df_57941208","updated":"2026-07-25 04:02:50.000000000","message":"I think I made most of the shutdown logging at debug level but agree that high level logging of shutdown can be at info level. Some of them are in service.py","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c502a8e91dfcf84a8dc928e2ec831c72f56a17c7","unresolved":true,"context_lines":[{"line_number":2509,"context_line":"    @wrap_exception()"},{"line_number":2510,"context_line":"    @reverts_task_state"},{"line_number":2511,"context_line":"    @wrap_instance_fault"},{"line_number":2512,"context_line":"    @manager.skip_general_tracking"},{"line_number":2513,"context_line":"    def build_and_run_instance(self, context, instance, image, request_spec,"},{"line_number":2514,"context_line":"                     filter_properties, accel_uuids, admin_password\u003dNone,"},{"line_number":2515,"context_line":"                     injected_files\u003dNone, requested_networks\u003dNone,"}],"source_content_type":"text/x-python","patch_set":4,"id":"8d82f5de_ed96639d","line":2512,"updated":"2026-07-23 22:14:19.000000000","message":"Sorry if I missed it but I\u0027m wondering about this naming ... i.e. \"skip_general_tracking\" doesn\u0027t seem to be clear what this is about. What is \"general\" tracking? What type of tracking would not fall under \"general\"?\n\nI would have thought the word \"task\" or \"rpc\" would be in here but maybe this mechanism is intentionally left more broad to be able to track all sorts of other things in the future if desired?\n\nI guess my point is if it\u0027s possible, I\u0027d want the name of the decorator to more self explanatory when I see it.\n\nIf we\u0027re avoiding limiting the scope of this maybe `skip_automatic_tracking` could be a better name? When I went over this patch with AI assistance, it said this decorator means basically that it means the automatic tracking mechanism should not be applied and instead it will be done manually or possibly not at all.\n\nIf we\u0027re fine with locking into the scope, `skip_rpc_task_tracking` might be another option.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"56b6653c712602c195b7b31d00934202f9039dd5","unresolved":false,"context_lines":[{"line_number":2509,"context_line":"    @wrap_exception()"},{"line_number":2510,"context_line":"    @reverts_task_state"},{"line_number":2511,"context_line":"    @wrap_instance_fault"},{"line_number":2512,"context_line":"    @manager.skip_general_tracking"},{"line_number":2513,"context_line":"    def build_and_run_instance(self, context, instance, image, request_spec,"},{"line_number":2514,"context_line":"                     filter_properties, accel_uuids, admin_password\u003dNone,"},{"line_number":2515,"context_line":"                     injected_files\u003dNone, requested_networks\u003dNone,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fec8746e_97835343","line":2512,"in_reply_to":"8d82f5de_ed96639d","updated":"2026-07-25 04:02:50.000000000","message":"yeah, i actually struggled to have good name for this :) thanks for more suggestion. That general tracking is for RPC tasks only and kind of automatic as that is done via RPC endpoints call from RPC dispatcher instead of adding tracking in each RPC method. I think adding \u0027rpc\u0027 and \u0027automatic\u0027 words will make it more clear so naming it to skip_automatic_rpc_tracking.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c502a8e91dfcf84a8dc928e2ec831c72f56a17c7","unresolved":true,"context_lines":[{"line_number":6478,"context_line":"    def _end_pending_dest_resize_task(self, instance_uuid):"},{"line_number":6479,"context_line":"        key \u003d self._pending_dest_resizes.pop(instance_uuid, None)"},{"line_number":6480,"context_line":"        if key is not None:"},{"line_number":6481,"context_line":"            self._record_task_end(key)"},{"line_number":6482,"context_line":""},{"line_number":6483,"context_line":"    def _do_prep_resize(self, context, image, instance, flavor,"},{"line_number":6484,"context_line":"                        request_spec, filter_properties, node,"}],"source_content_type":"text/x-python","patch_set":4,"id":"309f53f0_15d0465c","line":6481,"updated":"2026-07-23 22:14:19.000000000","message":"Should this also be called after revert resize finishes? If so, then we must be missing some test coverage for the case of revert, something similar to test_cold_migration_dest_shutdown_before_resize_instance_completes.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"12105a8e1706c65bb8a41d9ec442fba2a4fd791b","unresolved":true,"context_lines":[{"line_number":6478,"context_line":"    def _end_pending_dest_resize_task(self, instance_uuid):"},{"line_number":6479,"context_line":"        key \u003d self._pending_dest_resizes.pop(instance_uuid, None)"},{"line_number":6480,"context_line":"        if key is not None:"},{"line_number":6481,"context_line":"            self._record_task_end(key)"},{"line_number":6482,"context_line":""},{"line_number":6483,"context_line":"    def _do_prep_resize(self, context, image, instance, flavor,"},{"line_number":6484,"context_line":"                        request_spec, filter_properties, node,"}],"source_content_type":"text/x-python","patch_set":4,"id":"cd28f688_b1930195","line":6481,"in_reply_to":"028717c8_b1d41417","updated":"2026-07-31 18:28:08.000000000","message":"\u003e so `finish_revert_resize()` happens on the source and that\u0027s where we change `instance.host` back to the source, right? \n\nyes, source;s finish_revert_resize() call change the host back to source.\n\n\n\u003e If so, then making revert idempotent on the dest (I think that\u0027s what you\u0027re proposing?) will still work as a second revert will go back to the destination, see there is no instance anymore and continue to call the source\u0027s finish method. Is that right?\n\nYeah, making dest revert_resize idempotent will solve the issue in an even easier way. I was thinking about reverting state, but if the instance is destroyed from hypervisor, then we cannot do that; making it idempotent is a good idea.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d03f01c1bad4114052ea1ce05d514e33cbdaa84a","unresolved":true,"context_lines":[{"line_number":6478,"context_line":"    def _end_pending_dest_resize_task(self, instance_uuid):"},{"line_number":6479,"context_line":"        key \u003d self._pending_dest_resizes.pop(instance_uuid, None)"},{"line_number":6480,"context_line":"        if key is not None:"},{"line_number":6481,"context_line":"            self._record_task_end(key)"},{"line_number":6482,"context_line":""},{"line_number":6483,"context_line":"    def _do_prep_resize(self, context, image, instance, flavor,"},{"line_number":6484,"context_line":"                        request_spec, filter_properties, node,"}],"source_content_type":"text/x-python","patch_set":4,"id":"028717c8_b1d41417","line":6481,"in_reply_to":"215780b7_daf43a90","updated":"2026-07-31 13:48:08.000000000","message":"so `finish_revert_resize()` happens on the source and that\u0027s where we change `instance.host` back to the source, right? If so, then making revert idempotent on the dest (I think that\u0027s what you\u0027re proposing?) will still work as a second revert will go back to the destination, see there is no instance anymore and continue to call the source\u0027s finish method. Is that right?","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"56b6653c712602c195b7b31d00934202f9039dd5","unresolved":true,"context_lines":[{"line_number":6478,"context_line":"    def _end_pending_dest_resize_task(self, instance_uuid):"},{"line_number":6479,"context_line":"        key \u003d self._pending_dest_resizes.pop(instance_uuid, None)"},{"line_number":6480,"context_line":"        if key is not None:"},{"line_number":6481,"context_line":"            self._record_task_end(key)"},{"line_number":6482,"context_line":""},{"line_number":6483,"context_line":"    def _do_prep_resize(self, context, image, instance, flavor,"},{"line_number":6484,"context_line":"                        request_spec, filter_properties, node,"}],"source_content_type":"text/x-python","patch_set":4,"id":"58451c82_af117aa3","line":6481,"in_reply_to":"309f53f0_15d0465c","updated":"2026-07-25 04:02:50.000000000","message":"revert_resize is tricky and unique case which has low possibility of missing out the finish_revert_resize at source but logically possible.\n\nrevert_resize is initiated on dest and end it by calling RPC cast on source (finish_revert_resize) so technically revert_resize is not finished as overall but if destination is shutting down then it is completed from dest side and it is ok to let dest shutdown. source host recevie the RPC cast (finish_revert_resize) and finish the source compute work. All good if dest is shutting down.\n\nBut problem is when source compute is shutting down and dest get revert_resize and source shutdown before finish_revert_resize is received from dest. It will leaves VM in off state on source. Which means revert_resize is not actually completed. Why I said this is low possibility of this because we run finish_revert_resize() on rpcserver-alt so when source is shutting down it will keep 2nd RPC server so that dest can send the finish_revert_resize() cast to source. But there is window when dest takes time and source completly shutdown.\n\nWe need some design change to handle this case, some of the option i can think:\n- convert finish_revert_resize() RPC cast to call so that dest wait for source to bring back the VM. \n\n- Dest call something like prep_revert_resize on source so that source knows that revert_resize is initiated and dest will call finish_revert_resize soon.\n\n- do nothing. Because same scenario can happened if source is already shutdown before confirming or revert the resize. If admin is initiating the source compute shutdown then they know what they are ding as some of the instance on this compute is in between of resize (verify_resize state).\n\n\nThere is already test (test_revert_resize_dest_compute_graceful_shutdown) when dest is shutting down and we can add tests for source shutting down based on what options we decide to handle that case.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"eb3246a3a720c4fc859b7dfecf97ebe19863e22b","unresolved":true,"context_lines":[{"line_number":6478,"context_line":"    def _end_pending_dest_resize_task(self, instance_uuid):"},{"line_number":6479,"context_line":"        key \u003d self._pending_dest_resizes.pop(instance_uuid, None)"},{"line_number":6480,"context_line":"        if key is not None:"},{"line_number":6481,"context_line":"            self._record_task_end(key)"},{"line_number":6482,"context_line":""},{"line_number":6483,"context_line":"    def _do_prep_resize(self, context, image, instance, flavor,"},{"line_number":6484,"context_line":"                        request_spec, filter_properties, node,"}],"source_content_type":"text/x-python","patch_set":4,"id":"a1eebbea_2a6c6140","line":6481,"in_reply_to":"58451c82_af117aa3","updated":"2026-07-28 22:37:54.000000000","message":"OK sorry I missed that this happens at the end of `finish_resize` which applies to both confirm and revert scenarios. The resize is considered finished for tracking once the instance is in VERIFY_RESIZE state and confirm/revert is a separate thing.\n\nI think we can leave it as-is. Because the RPC back-and-forth part is considered done, and if things shut down then the resize confirm or revert can still be issued when services are started up again later.\n\nThe multi RPC part would no longer be \"in-flight\". I guess an individual confirm or revert could be considered in-flight separately but those would get covered by the automatic RPC tracking I think.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"20895d5b86602a2aa9aaff5bcf0ab7cf8b193291","unresolved":true,"context_lines":[{"line_number":6478,"context_line":"    def _end_pending_dest_resize_task(self, instance_uuid):"},{"line_number":6479,"context_line":"        key \u003d self._pending_dest_resizes.pop(instance_uuid, None)"},{"line_number":6480,"context_line":"        if key is not None:"},{"line_number":6481,"context_line":"            self._record_task_end(key)"},{"line_number":6482,"context_line":""},{"line_number":6483,"context_line":"    def _do_prep_resize(self, context, image, instance, flavor,"},{"line_number":6484,"context_line":"                        request_spec, filter_properties, node,"}],"source_content_type":"text/x-python","patch_set":4,"id":"215780b7_daf43a90","line":6481,"in_reply_to":"78d88f04_3c6e78c5","updated":"2026-07-30 02:23:03.000000000","message":"That all makes sense ... good idea to open the bug to capture the issue and I agree it is a separate thing to potentially address in the future.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3a4cbfe9755d4b178c486ef61eec8e22f6d90080","unresolved":true,"context_lines":[{"line_number":6478,"context_line":"    def _end_pending_dest_resize_task(self, instance_uuid):"},{"line_number":6479,"context_line":"        key \u003d self._pending_dest_resizes.pop(instance_uuid, None)"},{"line_number":6480,"context_line":"        if key is not None:"},{"line_number":6481,"context_line":"            self._record_task_end(key)"},{"line_number":6482,"context_line":""},{"line_number":6483,"context_line":"    def _do_prep_resize(self, context, image, instance, flavor,"},{"line_number":6484,"context_line":"                        request_spec, filter_properties, node,"}],"source_content_type":"text/x-python","patch_set":4,"id":"78d88f04_3c6e78c5","line":6481,"in_reply_to":"a1eebbea_2a6c6140","updated":"2026-07-29 22:12:44.000000000","message":"Yes, the resize operation is separately tracked from confirm or revert resize, but revert_resize tracking has one gap/point of failure.\n\nresize:\n-------\nit marked as complete in finish_resize(), which handles the single operation \u0027resize\u0027. So all good.\n\nconfirm_resize:\n---------------\nhappens at the source compute only, so automatic RPC tracking will take care of that. So all good.\n\nrevert_resize:\n--------------\nThis operation involves both source and dest calls; the problem is that dest does not sync up with source when it starts the revert_resize; instead, it updates source at the end via RPC cast, which means dest does not even confirm/wait if source successfully reverted the resize or not. So if finish_revert_resize() on source is not completed successfully, we end up having VM in unrecoerable state and it can happen in multiple scenarios:\n\ncase 1: the source compute is already shutdown; we do not need to handle it, as the admin knew when they shutdown knowing there are instances with VERIFY_RESIZE state and revert_resize operation if anyone perform need source to be up.\n\ncase 2: The RPC cast is lost due to a queue timeout or any other reason. I think we should fix this case by making revert_resize self-healing/revert operation so that users can try it again.\n\ncase 3: graceful shutdown case): source compute shutdown initiated during the revert_resize operation in progress on the destination. This is something we should handle as part of graceful shutdown and hold the source to shut down before finish_revert_resize() is completed.\n\ncase 2 and 3 are not easy to be solved just by task tracking model instead they need some redesign revert_resize from RPC as well as self-reverting perspective. I feel we should handle it as a separate spec or in part-3 which is more focus on per operation self-recoverable/revert - https://specs.openstack.org/openstack/nova-specs/specs/backlog/approved/nova-services-graceful-shutdown.html#spec-3-safe-termination-point-for-nova-operations\n\nJust not to forget about it, I opened a bug to be fix in in part-3 or a separate change. - https://bugs.launchpad.net/nova/+bug/2162090","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"eb3246a3a720c4fc859b7dfecf97ebe19863e22b","unresolved":true,"context_lines":[{"line_number":1829,"context_line":"        # for that and 20 sec is the max time are reserving out of total"},{"line_number":1830,"context_line":"        # timeout. This is a rough estimated time for cleanup which we can"},{"line_number":1831,"context_line":"        # change if we get to know that it is less."},{"line_number":1832,"context_line":"        cleanup_reserved_time \u003d min(20, timeout)"},{"line_number":1833,"context_line":""},{"line_number":1834,"context_line":"        wait_timeout \u003d max(0, timeout - cleanup_reserved_time)"},{"line_number":1835,"context_line":"        LOG.info(\u0027Compute manager waiting up to %s seconds for in-progress \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"373613e7_c4a29b13","line":1832,"updated":"2026-07-28 22:37:54.000000000","message":"Thanks for the helpful code comment.\n\nThe code change seems to have the same result i.e. if timeout \u003d 15 then wait_timeout would be 0. Not sure if that was intended.\n\nSo basically, if timeout is \u003c\u003d 20 seconds then all time goes to cleanup_host() instead of in-progress tasks. Maybe that is fine, just noting it here.","commit_id":"6098b2daa24a90b1408a947828b5d0380099f891"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"20895d5b86602a2aa9aaff5bcf0ab7cf8b193291","unresolved":false,"context_lines":[{"line_number":1829,"context_line":"        # for that and 20 sec is the max time are reserving out of total"},{"line_number":1830,"context_line":"        # timeout. This is a rough estimated time for cleanup which we can"},{"line_number":1831,"context_line":"        # change if we get to know that it is less."},{"line_number":1832,"context_line":"        cleanup_reserved_time \u003d min(20, timeout)"},{"line_number":1833,"context_line":""},{"line_number":1834,"context_line":"        wait_timeout \u003d max(0, timeout - cleanup_reserved_time)"},{"line_number":1835,"context_line":"        LOG.info(\u0027Compute manager waiting up to %s seconds for in-progress \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a020e6d_b63aa2c1","line":1832,"in_reply_to":"146e19ed_8fdd471d","updated":"2026-07-30 02:23:03.000000000","message":"Acknowledged","commit_id":"6098b2daa24a90b1408a947828b5d0380099f891"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3a4cbfe9755d4b178c486ef61eec8e22f6d90080","unresolved":true,"context_lines":[{"line_number":1829,"context_line":"        # for that and 20 sec is the max time are reserving out of total"},{"line_number":1830,"context_line":"        # timeout. This is a rough estimated time for cleanup which we can"},{"line_number":1831,"context_line":"        # change if we get to know that it is less."},{"line_number":1832,"context_line":"        cleanup_reserved_time \u003d min(20, timeout)"},{"line_number":1833,"context_line":""},{"line_number":1834,"context_line":"        wait_timeout \u003d max(0, timeout - cleanup_reserved_time)"},{"line_number":1835,"context_line":"        LOG.info(\u0027Compute manager waiting up to %s seconds for in-progress \u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"146e19ed_8fdd471d","line":1832,"in_reply_to":"373613e7_c4a29b13","updated":"2026-07-29 22:12:44.000000000","message":"Yeah, we need to compromise on either one. I feel cleaning up the host/live migrations/threadpool executors is a good candidate to perform if the timeout is configured lower.","commit_id":"6098b2daa24a90b1408a947828b5d0380099f891"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d03f01c1bad4114052ea1ce05d514e33cbdaa84a","unresolved":true,"context_lines":[{"line_number":4688,"context_line":"            raise"},{"line_number":4689,"context_line":"        future.add_done_callback("},{"line_number":4690,"context_line":"            functools.partial(self._record_task_end, key))"},{"line_number":4691,"context_line":"        return future"},{"line_number":4692,"context_line":""},{"line_number":4693,"context_line":"    @wrap_exception()"},{"line_number":4694,"context_line":"    @reverts_task_state"}],"source_content_type":"text/x-python","patch_set":6,"id":"c5ef989b_72ec931d","line":4691,"updated":"2026-07-31 13:48:08.000000000","message":"Feels like maybe we could turn this repeated chunk into a single helper?\n```\ndef start_recorded_task(name, uuid, req_id, fn, *args):\n    key \u003d self._record_task_start(\n                \u0027snapshot_instance\u0027, instance.uuid, context.request_id)\n    try:\n        future \u003d utils.spawn_on(...)\n     ...etc\n```","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4a0757799d630492a61df6063c0d473d3d0eeea0","unresolved":false,"context_lines":[{"line_number":4688,"context_line":"            raise"},{"line_number":4689,"context_line":"        future.add_done_callback("},{"line_number":4690,"context_line":"            functools.partial(self._record_task_end, key))"},{"line_number":4691,"context_line":"        return future"},{"line_number":4692,"context_line":""},{"line_number":4693,"context_line":"    @wrap_exception()"},{"line_number":4694,"context_line":"    @reverts_task_state"}],"source_content_type":"text/x-python","patch_set":6,"id":"66b4b5c5_0ba30538","line":4691,"in_reply_to":"7d90a872_89f68153","updated":"2026-08-03 17:19:57.000000000","message":"Done","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"12105a8e1706c65bb8a41d9ec442fba2a4fd791b","unresolved":true,"context_lines":[{"line_number":4688,"context_line":"            raise"},{"line_number":4689,"context_line":"        future.add_done_callback("},{"line_number":4690,"context_line":"            functools.partial(self._record_task_end, key))"},{"line_number":4691,"context_line":"        return future"},{"line_number":4692,"context_line":""},{"line_number":4693,"context_line":"    @wrap_exception()"},{"line_number":4694,"context_line":"    @reverts_task_state"}],"source_content_type":"text/x-python","patch_set":6,"id":"7d90a872_89f68153","line":4691,"in_reply_to":"c5ef989b_72ec931d","updated":"2026-07-31 18:28:08.000000000","message":"yeah we can do that, it is not in many places but still it will be easy to have a common function.","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b833769406c10b8136b9c946eb3a34cc258aa800","unresolved":true,"context_lines":[{"line_number":1829,"context_line":"        # for that and 20 sec is the max time are reserving out of total"},{"line_number":1830,"context_line":"        # timeout. This is a rough estimated time for cleanup which we can"},{"line_number":1831,"context_line":"        # change if we get to know that it is less."},{"line_number":1832,"context_line":"        cleanup_reserved_time \u003d min(20, timeout)"},{"line_number":1833,"context_line":""},{"line_number":1834,"context_line":"        wait_timeout \u003d max(0, timeout - cleanup_reserved_time)"},{"line_number":1835,"context_line":"        LOG.info(\u0027Compute manager waiting up to %s seconds for in-progress \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"ab8f5799_7aa50cc3","line":1832,"updated":"2026-08-05 15:26:17.000000000","message":"Isn\u0027t this a bit of a hidden tripwire for people? If they set the shutdown timeout to 20s or less we\u0027ll never do the actual work people think we\u0027re doing (waiting for in-progress tasks) and go straight to `cleanup_host()` which may take zero time at all. In other words, if I set the timeout to 20s it will look like this isn\u0027t working. I guess you\u0027ll log \"waiting up to 0 seconds\" below, but people will have to realize that\u0027s because you subtracted 20 from their configured 20. Further, it seems like this will vary by service, which might be confusing.\n\nShouldn\u0027t we at least note in the config option that some value will be subtracted from their configured value as reserved time to give them a hint about the above?","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ea9d7b982ed921c1cc1fb55b2f5d5b17bdd5e0ea","unresolved":false,"context_lines":[{"line_number":1829,"context_line":"        # for that and 20 sec is the max time are reserving out of total"},{"line_number":1830,"context_line":"        # timeout. This is a rough estimated time for cleanup which we can"},{"line_number":1831,"context_line":"        # change if we get to know that it is less."},{"line_number":1832,"context_line":"        cleanup_reserved_time \u003d min(20, timeout)"},{"line_number":1833,"context_line":""},{"line_number":1834,"context_line":"        wait_timeout \u003d max(0, timeout - cleanup_reserved_time)"},{"line_number":1835,"context_line":"        LOG.info(\u0027Compute manager waiting up to %s seconds for in-progress \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"8c3a35ea_049bcdb4","line":1832,"in_reply_to":"ab8f5799_7aa50cc3","updated":"2026-08-06 03:46:39.000000000","message":"yeah, will update the config option which is only valid for compute service (as of now). Also, I can add log this reserved time so that users can know 20 sec is reserved.","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ac5e332efa39d25cda15172e8ebfff75f29f5632","unresolved":false,"context_lines":[{"line_number":1833,"context_line":""},{"line_number":1834,"context_line":"        wait_timeout \u003d max(0, timeout - cleanup_reserved_time)"},{"line_number":1835,"context_line":"        LOG.info(\u0027Compute manager waiting up to %s seconds for in-progress \u0027"},{"line_number":1836,"context_line":"                  \u0027tasks to complete (%s seconds reserved for cleanup_host).\u0027,"},{"line_number":1837,"context_line":"                  wait_timeout, cleanup_reserved_time)"},{"line_number":1838,"context_line":"        self._wait_for_in_progress_tasks(wait_timeout)"},{"line_number":1839,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"d36fb236_cb09237b","line":1836,"updated":"2026-08-06 17:09:47.000000000","message":"++ This is a good indicator I didn\u0027t think about.","commit_id":"65962d01d7f43a8087920bb1d8f1991ec4c7dfb1"}],"nova/manager.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"02677ab2b93b5f513b9b85fb258b0486a0990438","unresolved":true,"context_lines":[{"line_number":236,"context_line":"            remaining_count \u003d len(self._in_progress_tasks)"},{"line_number":237,"context_line":"            if not self._in_progress_tasks:"},{"line_number":238,"context_line":"                self._in_progress_task_cond.notify_all()"},{"line_number":239,"context_line":"        if task and self._shutdown_in_progress:"},{"line_number":240,"context_line":"            elapsed \u003d time.monotonic() - task[\u0027start_time\u0027]"},{"line_number":241,"context_line":"            LOG.info("},{"line_number":242,"context_line":"                \u0027Graceful shutdown: task completed: %s \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"2e828ce6_00194f06","line":239,"updated":"2026-07-31 14:55:50.000000000","message":"Hmm, when might task be None? Seems like that would mean we ended up recording the end twice, no?","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"5cf8dbbac7705e9bbec14cf6be1470e5eb507cef","unresolved":false,"context_lines":[{"line_number":236,"context_line":"            remaining_count \u003d len(self._in_progress_tasks)"},{"line_number":237,"context_line":"            if not self._in_progress_tasks:"},{"line_number":238,"context_line":"                self._in_progress_task_cond.notify_all()"},{"line_number":239,"context_line":"        if task and self._shutdown_in_progress:"},{"line_number":240,"context_line":"            elapsed \u003d time.monotonic() - task[\u0027start_time\u0027]"},{"line_number":241,"context_line":"            LOG.info("},{"line_number":242,"context_line":"                \u0027Graceful shutdown: task completed: %s \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"4633d7a7_52983e7a","line":239,"in_reply_to":"2bad2d61_c61f86b3","updated":"2026-08-04 17:09:16.000000000","message":"Done","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"307dcf7d75f568e972a3838c7b07985cb98a811b","unresolved":true,"context_lines":[{"line_number":236,"context_line":"            remaining_count \u003d len(self._in_progress_tasks)"},{"line_number":237,"context_line":"            if not self._in_progress_tasks:"},{"line_number":238,"context_line":"                self._in_progress_task_cond.notify_all()"},{"line_number":239,"context_line":"        if task and self._shutdown_in_progress:"},{"line_number":240,"context_line":"            elapsed \u003d time.monotonic() - task[\u0027start_time\u0027]"},{"line_number":241,"context_line":"            LOG.info("},{"line_number":242,"context_line":"                \u0027Graceful shutdown: task completed: %s \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"9148e546_4f48d65d","line":239,"in_reply_to":"2bad2d61_c61f86b3","updated":"2026-07-31 18:46:42.000000000","message":"Sure, we don\u0027t want it to fail, but I guess I\u0027m not sure when we\u0027d actually do this twice. Does the completion run even on failure? I was just going to suggest a `LOG.warning()` if it\u0027s really unexpected so we can see where we might be double-ending.","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"12105a8e1706c65bb8a41d9ec442fba2a4fd791b","unresolved":true,"context_lines":[{"line_number":236,"context_line":"            remaining_count \u003d len(self._in_progress_tasks)"},{"line_number":237,"context_line":"            if not self._in_progress_tasks:"},{"line_number":238,"context_line":"                self._in_progress_task_cond.notify_all()"},{"line_number":239,"context_line":"        if task and self._shutdown_in_progress:"},{"line_number":240,"context_line":"            elapsed \u003d time.monotonic() - task[\u0027start_time\u0027]"},{"line_number":241,"context_line":"            LOG.info("},{"line_number":242,"context_line":"                \u0027Graceful shutdown: task completed: %s \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"2bad2d61_c61f86b3","line":239,"in_reply_to":"2e828ce6_00194f06","updated":"2026-07-31 18:28:08.000000000","message":"Yes, for multiple ends, it is called, so we do not get an error; instead, we just ignore. I am adding _record_task_end in future callbacks, as well as in failure cases for the same operation, so checking task None is on the safe side so that task tracking should not cause the operation to fail.","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"99f9b7b5e22f6a5918c35902624d843b619f86a7","unresolved":true,"context_lines":[{"line_number":236,"context_line":"            remaining_count \u003d len(self._in_progress_tasks)"},{"line_number":237,"context_line":"            if not self._in_progress_tasks:"},{"line_number":238,"context_line":"                self._in_progress_task_cond.notify_all()"},{"line_number":239,"context_line":"        if task and self._shutdown_in_progress:"},{"line_number":240,"context_line":"            elapsed \u003d time.monotonic() - task[\u0027start_time\u0027]"},{"line_number":241,"context_line":"            LOG.info("},{"line_number":242,"context_line":"                \u0027Graceful shutdown: task completed: %s \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"84dc9144_835b918a","line":239,"in_reply_to":"9148e546_4f48d65d","updated":"2026-07-31 18:56:17.000000000","message":"\u003e Sure, we don\u0027t want it to fail, but I guess I\u0027m not sure when we\u0027d actually do this twice. Does the completion run even on failure?\n\nYes, so this is more of a task that is completed, which is either successful or failed, but there is nothing left for the service to do/wait for this operation. That is graceful shutdown purpose but if we want to use this task tracking anywhere else then we can store the task result also or maybe for graceful shutdown also if that is useful?\n\nBut I checked again and it should not be called twice even case of failure becuase if failure in subnitting the task to thread then we call this and if not then only we add it in the future object callback so either will happen not both.\nI can log warning if it is twice.","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ac5e332efa39d25cda15172e8ebfff75f29f5632","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        self.service_name \u003d service_name"},{"line_number":117,"context_line":"        self.notifier \u003d rpc.get_notifier(self.service_name, self.host)"},{"line_number":118,"context_line":"        self.additional_endpoints \u003d []"},{"line_number":119,"context_line":"        self._shutdown_in_progress \u003d threading.Event()"},{"line_number":120,"context_line":"        self._in_progress_tasks \u003d {}"},{"line_number":121,"context_line":"        self._failed_tasks \u003d {}"},{"line_number":122,"context_line":"        self._completed_task_count \u003d 0"}],"source_content_type":"text/x-python","patch_set":9,"id":"e09e4775_d86d0792","line":119,"updated":"2026-08-06 17:09:47.000000000","message":"Nice, I think this is good","commit_id":"65962d01d7f43a8087920bb1d8f1991ec4c7dfb1"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9999ed52243ea499465e5c32ea0aa20e41e2fca6","unresolved":true,"context_lines":[{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        LOG.info("},{"line_number":327,"context_line":"            \u0027Graceful shutdown: all in-progress tasks finished. \u0027"},{"line_number":328,"context_line":"            \u0027completed tasks: %d, failed tasks: %d%s\u0027,"},{"line_number":329,"context_line":"            self._completed_task_count, len(self._failed_tasks),"},{"line_number":330,"context_line":"            \u0027: %s\u0027 % self._summarize_failed_tasks()"},{"line_number":331,"context_line":"            if self._failed_tasks else \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"ba6940b1_b935943a","line":328,"updated":"2026-08-13 23:07:07.000000000","message":"Noting this format is inconsistent with the summary message on L309 where the completed tasks and failed tasks are inside parentheses.","commit_id":"fec26fb64baef2251bf547850ae71edfa6a7413d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"159bfe945c937a6d4792997c469575d52f9894b6","unresolved":false,"context_lines":[{"line_number":325,"context_line":""},{"line_number":326,"context_line":"        LOG.info("},{"line_number":327,"context_line":"            \u0027Graceful shutdown: all in-progress tasks finished. \u0027"},{"line_number":328,"context_line":"            \u0027completed tasks: %d, failed tasks: %d%s\u0027,"},{"line_number":329,"context_line":"            self._completed_task_count, len(self._failed_tasks),"},{"line_number":330,"context_line":"            \u0027: %s\u0027 % self._summarize_failed_tasks()"},{"line_number":331,"context_line":"            if self._failed_tasks else \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":14,"id":"c85c448a_e6cdc25d","line":328,"in_reply_to":"ba6940b1_b935943a","updated":"2026-08-14 13:46:49.000000000","message":"ack, will fix it in doc change","commit_id":"fec26fb64baef2251bf547850ae71edfa6a7413d"}],"nova/service.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c502a8e91dfcf84a8dc928e2ec831c72f56a17c7","unresolved":true,"context_lines":[{"line_number":101,"context_line":"            finally:"},{"line_number":102,"context_line":"                self._tracker._record_task_end(key)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        return _tracked"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def _create_service_ref(this_service, context):"}],"source_content_type":"text/x-python","patch_set":4,"id":"99c853b8_7581a282","line":104,"updated":"2026-07-23 22:14:19.000000000","message":"I wonder if it might be worth caching these by method, considering they will not change over time.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"eb3246a3a720c4fc859b7dfecf97ebe19863e22b","unresolved":true,"context_lines":[{"line_number":101,"context_line":"            finally:"},{"line_number":102,"context_line":"                self._tracker._record_task_end(key)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        return _tracked"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def _create_service_ref(this_service, context):"}],"source_content_type":"text/x-python","patch_set":4,"id":"c1ba0bdf_866f5d14","line":104,"in_reply_to":"4bf8769f_2c92475b","updated":"2026-07-28 22:37:54.000000000","message":"Sorry I mean cache the _tracked callables by their names, so you don\u0027t have to construct them from scratch \"forever\". For each method name, the _tracked object will not change IIUC. Maybe not too impactful but just something to consider.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"56b6653c712602c195b7b31d00934202f9039dd5","unresolved":true,"context_lines":[{"line_number":101,"context_line":"            finally:"},{"line_number":102,"context_line":"                self._tracker._record_task_end(key)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        return _tracked"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def _create_service_ref(this_service, context):"}],"source_content_type":"text/x-python","patch_set":4,"id":"4bf8769f_2c92475b","line":104,"in_reply_to":"99c853b8_7581a282","updated":"2026-07-25 04:02:50.000000000","message":"but it will be changed as instance_uuid sometime and request_uuid every time will be different for each operation. or i missed something here?","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3a4cbfe9755d4b178c486ef61eec8e22f6d90080","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            finally:"},{"line_number":102,"context_line":"                self._tracker._record_task_end(key)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"        return _tracked"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"def _create_service_ref(this_service, context):"}],"source_content_type":"text/x-python","patch_set":4,"id":"763bf1b7_6d2f4bac","line":104,"in_reply_to":"c1ba0bdf_866f5d14","updated":"2026-07-29 22:12:44.000000000","message":"ohk, I got it now. yes _tracked wrapper object will not change so it is good idea not to wrap it every time.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c502a8e91dfcf84a8dc928e2ec831c72f56a17c7","unresolved":true,"context_lines":[{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        shutdown_thread \u003d threading.Thread(target\u003d_run)"},{"line_number":410,"context_line":"        shutdown_thread.daemon \u003d True"},{"line_number":411,"context_line":"        shutdown_thread.start()"},{"line_number":412,"context_line":"        # NOTE(gmaan): Event.wait(timeout) always returns a bool even on"},{"line_number":413,"context_line":"        # timeout."},{"line_number":414,"context_line":"        if not finished.wait(timeout):"}],"source_content_type":"text/x-python","patch_set":4,"id":"158c279d_d3e742ab","line":411,"updated":"2026-07-23 22:14:19.000000000","message":"So if this thread is still running when the timeout fires, it will continue to run while this proceeds to shutdown the rpcserver_alt. Is that OK/safe to do?\n\nI guess regardless, I am not sure what is the reason for having this daemon thread rather than letting it be synchronous and time out with its existing Condition in _wait_for_in_progress_tasks?\n\nIf there is a reason the daemon thread is definitely needed, it would be helpful to have a code comment or docstring that explains it.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"56b6653c712602c195b7b31d00934202f9039dd5","unresolved":false,"context_lines":[{"line_number":408,"context_line":""},{"line_number":409,"context_line":"        shutdown_thread \u003d threading.Thread(target\u003d_run)"},{"line_number":410,"context_line":"        shutdown_thread.daemon \u003d True"},{"line_number":411,"context_line":"        shutdown_thread.start()"},{"line_number":412,"context_line":"        # NOTE(gmaan): Event.wait(timeout) always returns a bool even on"},{"line_number":413,"context_line":"        # timeout."},{"line_number":414,"context_line":"        if not finished.wait(timeout):"}],"source_content_type":"text/x-python","patch_set":4,"id":"d0c3b909_314e3b29","line":411,"in_reply_to":"158c279d_d3e742ab","updated":"2026-07-25 04:02:50.000000000","message":"It is safe as timeout is what max time we can wait for rpcserver_alt to continue active. After that we have to proceed and stop all before global graceful_shutdown_timeout interrupt the service.stop().\n\nRegarding sync wait in _wait_for_in_progress_tasks(), we need to start a separate thread to handle the cleanup_host which is sync call to driver cleanup_host etc. That is not under timeout boundary and can hang the manager\u0027s graceful_shutdown and will cause shutdown to abruptly stop when graceful_shutdown_timeout reaches.\n\nLet me add comment here.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"02677ab2b93b5f513b9b85fb258b0486a0990438","unresolved":true,"context_lines":[{"line_number":93,"context_line":"            elif \u0027instance\u0027 in kwargs:"},{"line_number":94,"context_line":"                inst \u003d kwargs[\u0027instance\u0027]"},{"line_number":95,"context_line":"                if hasattr(inst, \u0027uuid\u0027):"},{"line_number":96,"context_line":"                    instance_uuid \u003d inst.uuid"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"            key \u003d self._tracker._record_task_start("},{"line_number":99,"context_line":"                name, instance_uuid, request_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5c3a3d23_ff206cc3","line":96,"updated":"2026-07-31 14:55:50.000000000","message":"Can you comment this logic to explain what you\u0027re doing/expecting? I\u0027m also not sure how you can be doing I think the first case you\u0027re assuming the thing is context if it has a `request_id` and the second assuming it\u0027s an instance if it has  `uuid`? The former is probably a reasonable guess, but too many things have a `uuid` and this seems like it could be a very subtle bug waiting for us in the future. Why can\u0027t you check `isinstance(args[0], context.RequestContext)` for example?","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"12105a8e1706c65bb8a41d9ec442fba2a4fd791b","unresolved":true,"context_lines":[{"line_number":93,"context_line":"            elif \u0027instance\u0027 in kwargs:"},{"line_number":94,"context_line":"                inst \u003d kwargs[\u0027instance\u0027]"},{"line_number":95,"context_line":"                if hasattr(inst, \u0027uuid\u0027):"},{"line_number":96,"context_line":"                    instance_uuid \u003d inst.uuid"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"            key \u003d self._tracker._record_task_start("},{"line_number":99,"context_line":"                name, instance_uuid, request_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"6412bc6b_1da05872","line":96,"in_reply_to":"5c3a3d23_ff206cc3","updated":"2026-07-31 18:28:08.000000000","message":"I checked the signature of RPC methods, and args[0] is context and args[1] is instance for most RPC methods, but yes, you are right; there are other cases like def get_host_uptime(self, ctxt, host): where we might pick host UUID as instance UUID here. In case of scheduler\u0027s select_destinations, it can be wrong too \n\ndef select_destinations(self, ctxt, spec_obj, instance_uuids,\n            return_objects\u003dFalse, return_alternates\u003dFalse):\n            \nargs[0] is easy to check as RequestContext and get request_id from there but it is not standard to assume instance/instance_uuid being which arg.\n\nI can check if isinstance(args[1], objects.Instance) and last else can be \u0027instance\u0027 in kwargs. something like:\n\n            if isinstance(args[0], context.RequestContext):\n                request_id \u003d getattr(args[0], \u0027request_id\u0027, None)\n            if len(args) \u003e 1 and isinstance(args[1], objects.Instance):\n                instance_uuid \u003d args[1].uuid\n            elif \u0027instance\u0027 in kwargs:\n                instance_uuid \u003d kwargs[\u0027instance\u0027].uuid","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"5cf8dbbac7705e9bbec14cf6be1470e5eb507cef","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            elif \u0027instance\u0027 in kwargs:"},{"line_number":94,"context_line":"                inst \u003d kwargs[\u0027instance\u0027]"},{"line_number":95,"context_line":"                if hasattr(inst, \u0027uuid\u0027):"},{"line_number":96,"context_line":"                    instance_uuid \u003d inst.uuid"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"            key \u003d self._tracker._record_task_start("},{"line_number":99,"context_line":"                name, instance_uuid, request_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"86179985_d28377a6","line":96,"in_reply_to":"6412bc6b_1da05872","updated":"2026-08-04 17:09:16.000000000","message":"Done","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"307dcf7d75f568e972a3838c7b07985cb98a811b","unresolved":true,"context_lines":[{"line_number":93,"context_line":"            elif \u0027instance\u0027 in kwargs:"},{"line_number":94,"context_line":"                inst \u003d kwargs[\u0027instance\u0027]"},{"line_number":95,"context_line":"                if hasattr(inst, \u0027uuid\u0027):"},{"line_number":96,"context_line":"                    instance_uuid \u003d inst.uuid"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"            key \u003d self._tracker._record_task_start("},{"line_number":99,"context_line":"                name, instance_uuid, request_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"ad7718d8_de422ae8","line":96,"in_reply_to":"6412bc6b_1da05872","updated":"2026-07-31 18:46:42.000000000","message":"Yep, isinstance for both of those seems better to me, and obviously if something is in kwargs as `instance\u003dHost()` then we\u0027re in trouble elsewhere :)","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"20895d5b86602a2aa9aaff5bcf0ab7cf8b193291","unresolved":true,"context_lines":[{"line_number":102,"context_line":"            finally:"},{"line_number":103,"context_line":"                self._tracker._record_task_end(key)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        setattr(self, name, _tracked)"},{"line_number":106,"context_line":"        return _tracked"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"4b09fc1d_b4fc5e68","line":105,"updated":"2026-07-30 02:23:03.000000000","message":"Really nice, easy way to cache these.","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"12105a8e1706c65bb8a41d9ec442fba2a4fd791b","unresolved":true,"context_lines":[{"line_number":102,"context_line":"            finally:"},{"line_number":103,"context_line":"                self._tracker._record_task_end(key)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        setattr(self, name, _tracked)"},{"line_number":106,"context_line":"        return _tracked"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"e1c0f127_2145ffc5","line":105,"in_reply_to":"0d720782_00bea22a","updated":"2026-07-31 18:28:08.000000000","message":"sure, will add comment. I am also doing setattr for a non-tracked method also (L82) so that we do not need to check the _skip_automatic_rpc_tracking condition everytime.","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"02677ab2b93b5f513b9b85fb258b0486a0990438","unresolved":true,"context_lines":[{"line_number":102,"context_line":"            finally:"},{"line_number":103,"context_line":"                self._tracker._record_task_end(key)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        setattr(self, name, _tracked)"},{"line_number":106,"context_line":"        return _tracked"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"0d720782_00bea22a","line":105,"in_reply_to":"4b09fc1d_b4fc5e68","updated":"2026-07-31 14:55:50.000000000","message":"Did you mean \"catch\"?\n\nGmaan, can you add a comment above this `setattr` that reminds the reader that `__getattr__` is only called for things that aren\u0027t actually present on an object? \nI always have to look up which one is always called and which is only called as a last resort. Here I did it to make sure you weren\u0027t actually re-re-re-re-wrapping things :)","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"307dcf7d75f568e972a3838c7b07985cb98a811b","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            finally:"},{"line_number":103,"context_line":"                self._tracker._record_task_end(key)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        setattr(self, name, _tracked)"},{"line_number":106,"context_line":"        return _tracked"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"15c3579f_2f00d349","line":105,"in_reply_to":"e1c0f127_2145ffc5","updated":"2026-07-31 18:46:42.000000000","message":"Acknowledged","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"b4923f4387d4253a2150e5edf38822efaf3e067a","unresolved":true,"context_lines":[{"line_number":102,"context_line":"            finally:"},{"line_number":103,"context_line":"                self._tracker._record_task_end(key)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        setattr(self, name, _tracked)"},{"line_number":106,"context_line":"        return _tracked"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ee7daed5_eabe84a0","line":105,"in_reply_to":"e1c0f127_2145ffc5","updated":"2026-07-31 18:49:14.000000000","message":"I did mean \"cache\" because setting the attr like this makes it so that the _tracked object will be picked up by future accesses and not need to be built again. It is a way of caching the _tracked objects. In the previous PS the `setattr` was not there and the _tracked object gets rebuilt every call even if the name is the same.\n\nI also needed the reminder that `__getattr__` is only entered when an attribute is not set 🙂","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"5cf8dbbac7705e9bbec14cf6be1470e5eb507cef","unresolved":false,"context_lines":[{"line_number":102,"context_line":"            finally:"},{"line_number":103,"context_line":"                self._tracker._record_task_end(key)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        setattr(self, name, _tracked)"},{"line_number":106,"context_line":"        return _tracked"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"dcb7b1db_28910c49","line":105,"in_reply_to":"ee7daed5_eabe84a0","updated":"2026-08-04 17:09:16.000000000","message":"Done","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"02677ab2b93b5f513b9b85fb258b0486a0990438","unresolved":true,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        # NOTE(gmaan): manager\u0027s graceful_shutdown does two things 1. wait for"},{"line_number":413,"context_line":"        # in-progress tasks 2. cleanup_host. First one is controlled with"},{"line_number":414,"context_line":"        # timeout but latter one is sync call to drivers cleanup_host which"},{"line_number":415,"context_line":"        # can hang the shutdown so we need to run manager\u0027s graceful_shutdown"},{"line_number":416,"context_line":"        # in a thread with timeout so that we do not hang the overall shutdown."},{"line_number":417,"context_line":"        shutdown_thread \u003d threading.Thread(target\u003d_run)"}],"source_content_type":"text/x-python","patch_set":6,"id":"cba91243_528229e5","line":414,"updated":"2026-07-31 14:55:50.000000000","message":"Is there something here you have in mind as potentially risky? Just wondering whether it makes sense to wait for that forever (until kill -9) or if it\u0027s something that is likely to hang but be fine to abruptly interrupt.","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"5cf8dbbac7705e9bbec14cf6be1470e5eb507cef","unresolved":false,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        # NOTE(gmaan): manager\u0027s graceful_shutdown does two things 1. wait for"},{"line_number":413,"context_line":"        # in-progress tasks 2. cleanup_host. First one is controlled with"},{"line_number":414,"context_line":"        # timeout but latter one is sync call to drivers cleanup_host which"},{"line_number":415,"context_line":"        # can hang the shutdown so we need to run manager\u0027s graceful_shutdown"},{"line_number":416,"context_line":"        # in a thread with timeout so that we do not hang the overall shutdown."},{"line_number":417,"context_line":"        shutdown_thread \u003d threading.Thread(target\u003d_run)"}],"source_content_type":"text/x-python","patch_set":6,"id":"5b3d6817_f2adf6cc","line":414,"in_reply_to":"7d1125f3_26229dd6","updated":"2026-08-04 17:09:16.000000000","message":"Done","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"307dcf7d75f568e972a3838c7b07985cb98a811b","unresolved":true,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        # NOTE(gmaan): manager\u0027s graceful_shutdown does two things 1. wait for"},{"line_number":413,"context_line":"        # in-progress tasks 2. cleanup_host. First one is controlled with"},{"line_number":414,"context_line":"        # timeout but latter one is sync call to drivers cleanup_host which"},{"line_number":415,"context_line":"        # can hang the shutdown so we need to run manager\u0027s graceful_shutdown"},{"line_number":416,"context_line":"        # in a thread with timeout so that we do not hang the overall shutdown."},{"line_number":417,"context_line":"        shutdown_thread \u003d threading.Thread(target\u003d_run)"}],"source_content_type":"text/x-python","patch_set":6,"id":"e506b609_17f8c019","line":414,"in_reply_to":"9755a753_9f3fdb2c","updated":"2026-07-31 18:46:42.000000000","message":"Okay, I was just wondering if any driver has a `cleanup_host()` that has a high risk of hanging. I guess my point is, this seems like maybe premature (although defensive) optimization. I could see a potential case where a driver has a cleanu routine that really shouldn\u0027t be interrupted (like if the ironic case was making multiple calls to ironic that should either all succeed or all fail, or maybe some other virt driver making non-atomic disk changes).\n\nLike, we could consider tightening the definition of `cleanup_host()` to say that it needs to expect to complete quickly else it will block shutdown of the service, and push the timeout responsibility to libvirt/host.py to not block forever waiting for the delayed executor.\n\nThat said, it looks like only vmwareapi and libvirt implement this, and vmwareapi is just a session logout, so probably no need to change this right now. Maybe just comment in `virt/driver.py` that `cleanup_host()` may be interrupted for future driver authors?","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"12105a8e1706c65bb8a41d9ec442fba2a4fd791b","unresolved":true,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        # NOTE(gmaan): manager\u0027s graceful_shutdown does two things 1. wait for"},{"line_number":413,"context_line":"        # in-progress tasks 2. cleanup_host. First one is controlled with"},{"line_number":414,"context_line":"        # timeout but latter one is sync call to drivers cleanup_host which"},{"line_number":415,"context_line":"        # can hang the shutdown so we need to run manager\u0027s graceful_shutdown"},{"line_number":416,"context_line":"        # in a thread with timeout so that we do not hang the overall shutdown."},{"line_number":417,"context_line":"        shutdown_thread \u003d threading.Thread(target\u003d_run)"}],"source_content_type":"text/x-python","patch_set":6,"id":"9755a753_9f3fdb2c","line":414,"in_reply_to":"cba91243_528229e5","updated":"2026-07-31 18:28:08.000000000","message":"The only risk of waiting forever is that we might end up leaving rpcserver_alt shutdown abruptly instead of the normal flow of stop() and wait(). and then all threadpool executors graceful shutdown  (which I am adding in next change).\n\nI did not find any obvious things which can hang, but I suspected cleanup_host still has delayed_executor to shut down (though we cancel all the delayed events that are not yet picked up by the executor before shutdown). In case we have many events already picked up, then it can take longer. Though there is a refactor opportunity here; we can shut down delayed_executor also as part of all executor shutdowns.","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"99f9b7b5e22f6a5918c35902624d843b619f86a7","unresolved":true,"context_lines":[{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        # NOTE(gmaan): manager\u0027s graceful_shutdown does two things 1. wait for"},{"line_number":413,"context_line":"        # in-progress tasks 2. cleanup_host. First one is controlled with"},{"line_number":414,"context_line":"        # timeout but latter one is sync call to drivers cleanup_host which"},{"line_number":415,"context_line":"        # can hang the shutdown so we need to run manager\u0027s graceful_shutdown"},{"line_number":416,"context_line":"        # in a thread with timeout so that we do not hang the overall shutdown."},{"line_number":417,"context_line":"        shutdown_thread \u003d threading.Thread(target\u003d_run)"}],"source_content_type":"text/x-python","patch_set":6,"id":"7d1125f3_26229dd6","line":414,"in_reply_to":"e506b609_17f8c019","updated":"2026-07-31 18:56:17.000000000","message":"yeah, we can change it if any driver adds a long and must do things there. will add comment for now.","commit_id":"c2a37a41b257cf461ff1330b8686ab0e8c17daef"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"948b2908d95a850e6f66e7f014be2be086ec214d","unresolved":true,"context_lines":[{"line_number":88,"context_line":"            request_id \u003d None"},{"line_number":89,"context_line":"            if isinstance(args[0], context.RequestContext):"},{"line_number":90,"context_line":"                request_id \u003d getattr(args[0], \u0027request_id\u0027, None)"},{"line_number":91,"context_line":"            if len(args) \u003e 1 and isinstance(args[1], objects.Instance):"},{"line_number":92,"context_line":"                instance_uuid \u003d args[1].uuid"},{"line_number":93,"context_line":"            elif \u0027instance\u0027 in kwargs:"},{"line_number":94,"context_line":"                instance_uuid \u003d kwargs[\u0027instance\u0027].uuid"}],"source_content_type":"text/x-python","patch_set":7,"id":"9daa5283_f59e637f","line":91,"updated":"2026-08-04 21:52:28.000000000","message":"Coverage tells me this was never true in the tests. I\u0027m thinking now I might recall that RPC methods are always dispatched by keyword, so that may be why. I still think having this there probably makes sense but perhaps we need a small dedicated unit test to make sure it gets exercised?","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ea9d7b982ed921c1cc1fb55b2f5d5b17bdd5e0ea","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            request_id \u003d None"},{"line_number":89,"context_line":"            if isinstance(args[0], context.RequestContext):"},{"line_number":90,"context_line":"                request_id \u003d getattr(args[0], \u0027request_id\u0027, None)"},{"line_number":91,"context_line":"            if len(args) \u003e 1 and isinstance(args[1], objects.Instance):"},{"line_number":92,"context_line":"                instance_uuid \u003d args[1].uuid"},{"line_number":93,"context_line":"            elif \u0027instance\u0027 in kwargs:"},{"line_number":94,"context_line":"                instance_uuid \u003d kwargs[\u0027instance\u0027].uuid"}],"source_content_type":"text/x-python","patch_set":7,"id":"90b2ed7b_ad78838c","line":91,"in_reply_to":"1b13a0ce_70cc9006","updated":"2026-08-06 03:46:39.000000000","message":"Done","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"21e310eb160af63dc25d18b76834b0a327f0107b","unresolved":true,"context_lines":[{"line_number":88,"context_line":"            request_id \u003d None"},{"line_number":89,"context_line":"            if isinstance(args[0], context.RequestContext):"},{"line_number":90,"context_line":"                request_id \u003d getattr(args[0], \u0027request_id\u0027, None)"},{"line_number":91,"context_line":"            if len(args) \u003e 1 and isinstance(args[1], objects.Instance):"},{"line_number":92,"context_line":"                instance_uuid \u003d args[1].uuid"},{"line_number":93,"context_line":"            elif \u0027instance\u0027 in kwargs:"},{"line_number":94,"context_line":"                instance_uuid \u003d kwargs[\u0027instance\u0027].uuid"}],"source_content_type":"text/x-python","patch_set":7,"id":"1b13a0ce_70cc9006","line":91,"in_reply_to":"9daa5283_f59e637f","updated":"2026-08-05 02:02:07.000000000","message":"Done","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"}],"nova/tests/fixtures/nova.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5cbfaebe761cf8cad601144ccc68e9e50e3d5e05","unresolved":true,"context_lines":[{"line_number":2455,"context_line":"        intercept \u003d self.useFixture(InterceptMethodFixture("},{"line_number":2456,"context_line":"            target, \u0027method_name\u0027))"},{"line_number":2457,"context_line":"        # call method"},{"line_number":2458,"context_line":"        self.assertFalse(intercept.started.is_set())"},{"line_number":2459,"context_line":"        # check more things"},{"line_number":2460,"context_line":"        intercept.proceed.set()"},{"line_number":2461,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"c1c7759f_b152a1cc","line":2458,"updated":"2026-08-10 15:30:06.000000000","message":"should this be `assertTrue()`? You\u0027re showing that after calling the method the \"started\" indicator should be set because it is run on L2480 right?","commit_id":"9b33a271a7dc30b834314cf85c2cf5b28bc3b6b6"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"eab4e0c23896e5b70c9054da71141ead6a467f80","unresolved":false,"context_lines":[{"line_number":2455,"context_line":"        intercept \u003d self.useFixture(InterceptMethodFixture("},{"line_number":2456,"context_line":"            target, \u0027method_name\u0027))"},{"line_number":2457,"context_line":"        # call method"},{"line_number":2458,"context_line":"        self.assertFalse(intercept.started.is_set())"},{"line_number":2459,"context_line":"        # check more things"},{"line_number":2460,"context_line":"        intercept.proceed.set()"},{"line_number":2461,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"5d12576b_a2fe6ce8","line":2458,"in_reply_to":"c1c7759f_b152a1cc","updated":"2026-08-10 16:52:32.000000000","message":"yeah, i cope pasted the assert line but forgot to change it to True. Also, let me make it more clear with step wise.","commit_id":"9b33a271a7dc30b834314cf85c2cf5b28bc3b6b6"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"9999ed52243ea499465e5c32ea0aa20e41e2fca6","unresolved":true,"context_lines":[{"line_number":2459,"context_line":"        self.assertTrue(intercept.started.is_set())"},{"line_number":2460,"context_line":"        \u003c Check/do more things while the method is in-progress\u003e"},{"line_number":2461,"context_line":"        # Signal method to proceed/complete."},{"line_number":2462,"context_line":"        intercept.proceed.set()"},{"line_number":2463,"context_line":"    \"\"\""},{"line_number":2464,"context_line":""},{"line_number":2465,"context_line":"    DEFAULT_TIMEOUT \u003d 60"}],"source_content_type":"text/x-python","patch_set":14,"id":"86f35625_4bf6b3ed","line":2462,"updated":"2026-08-13 23:07:07.000000000","message":"Nice idea to create this fixture.","commit_id":"fec26fb64baef2251bf547850ae71edfa6a7413d"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"159bfe945c937a6d4792997c469575d52f9894b6","unresolved":false,"context_lines":[{"line_number":2459,"context_line":"        self.assertTrue(intercept.started.is_set())"},{"line_number":2460,"context_line":"        \u003c Check/do more things while the method is in-progress\u003e"},{"line_number":2461,"context_line":"        # Signal method to proceed/complete."},{"line_number":2462,"context_line":"        intercept.proceed.set()"},{"line_number":2463,"context_line":"    \"\"\""},{"line_number":2464,"context_line":""},{"line_number":2465,"context_line":"    DEFAULT_TIMEOUT \u003d 60"}],"source_content_type":"text/x-python","patch_set":14,"id":"cce4cf88_23bc50ed","line":2462,"in_reply_to":"86f35625_4bf6b3ed","updated":"2026-08-14 13:46:49.000000000","message":"Acknowledged","commit_id":"fec26fb64baef2251bf547850ae71edfa6a7413d"}],"nova/tests/functional/test_graceful_shutdown.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c502a8e91dfcf84a8dc928e2ec831c72f56a17c7","unresolved":true,"context_lines":[{"line_number":606,"context_line":"            compute.manager, \u0027cleanup_host\u0027, side_effect\u003d_cleanup_host))"},{"line_number":607,"context_line":"        return cleanup_called"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"    def test_build_intance_track_wait_during_shutdown(self):"},{"line_number":610,"context_line":"        compute \u003d self.computes[\u0027src\u0027]"},{"line_number":611,"context_line":"        self.flags(manager_shutdown_timeout\u003d30)"},{"line_number":612,"context_line":"        cleanup_called \u003d self._mock_cleanup_host(compute)"}],"source_content_type":"text/x-python","patch_set":4,"id":"4928070b_fa88c85d","line":609,"range":{"start_line":609,"start_character":19,"end_line":609,"end_character":26},"updated":"2026-07-23 22:14:19.000000000","message":"instance","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"56b6653c712602c195b7b31d00934202f9039dd5","unresolved":false,"context_lines":[{"line_number":606,"context_line":"            compute.manager, \u0027cleanup_host\u0027, side_effect\u003d_cleanup_host))"},{"line_number":607,"context_line":"        return cleanup_called"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"    def test_build_intance_track_wait_during_shutdown(self):"},{"line_number":610,"context_line":"        compute \u003d self.computes[\u0027src\u0027]"},{"line_number":611,"context_line":"        self.flags(manager_shutdown_timeout\u003d30)"},{"line_number":612,"context_line":"        cleanup_called \u003d self._mock_cleanup_host(compute)"}],"source_content_type":"text/x-python","patch_set":4,"id":"54b8ac00_f30519f4","line":609,"range":{"start_line":609,"start_character":19,"end_line":609,"end_character":26},"in_reply_to":"4928070b_fa88c85d","updated":"2026-07-25 04:02:50.000000000","message":"Done","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c502a8e91dfcf84a8dc928e2ec831c72f56a17c7","unresolved":true,"context_lines":[{"line_number":645,"context_line":"        self.wait_for_service_stop(stop_thread, \u0027src\u0027)"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"        self.assertTrue(cleanup_called.is_set())"},{"line_number":648,"context_line":"        # Check tracked task is remoevd from tacking dict."},{"line_number":649,"context_line":"        self.assertEqual({}, compute.manager._in_progress_tasks)"},{"line_number":650,"context_line":""},{"line_number":651,"context_line":"        self._restart_compute(\u0027src\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"58973469_9f110580","line":648,"updated":"2026-07-23 22:14:19.000000000","message":"\"removed\" and \"tracking\"","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"56b6653c712602c195b7b31d00934202f9039dd5","unresolved":false,"context_lines":[{"line_number":645,"context_line":"        self.wait_for_service_stop(stop_thread, \u0027src\u0027)"},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"        self.assertTrue(cleanup_called.is_set())"},{"line_number":648,"context_line":"        # Check tracked task is remoevd from tacking dict."},{"line_number":649,"context_line":"        self.assertEqual({}, compute.manager._in_progress_tasks)"},{"line_number":650,"context_line":""},{"line_number":651,"context_line":"        self._restart_compute(\u0027src\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"8835476e_33013ca3","line":648,"in_reply_to":"58973469_9f110580","updated":"2026-07-25 04:02:50.000000000","message":"Done","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"c502a8e91dfcf84a8dc928e2ec831c72f56a17c7","unresolved":true,"context_lines":[{"line_number":688,"context_line":"        self.wait_for_service_stop(stop_thread, \u0027src\u0027)"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"        self.assertTrue(cleanup_called.is_set())"},{"line_number":691,"context_line":"        # Check tracked task is remoevd from tacking dict."},{"line_number":692,"context_line":"        self.assertEqual({}, compute.manager._in_progress_tasks)"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"        self._restart_compute(\u0027src\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1f904e15_8157e1d9","line":691,"updated":"2026-07-23 22:14:19.000000000","message":"Same.","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"56b6653c712602c195b7b31d00934202f9039dd5","unresolved":false,"context_lines":[{"line_number":688,"context_line":"        self.wait_for_service_stop(stop_thread, \u0027src\u0027)"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"        self.assertTrue(cleanup_called.is_set())"},{"line_number":691,"context_line":"        # Check tracked task is remoevd from tacking dict."},{"line_number":692,"context_line":"        self.assertEqual({}, compute.manager._in_progress_tasks)"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"        self._restart_compute(\u0027src\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"f872861e_6379d79d","line":691,"in_reply_to":"1f904e15_8157e1d9","updated":"2026-07-25 04:02:50.000000000","message":"Done","commit_id":"185c59d3452585261c4704ecd774238d96648d60"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"948b2908d95a850e6f66e7f014be2be086ec214d","unresolved":true,"context_lines":[{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        stop_thread \u003d self._stop_compute_gracefully(self.computes[\u0027dest\u0027])"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        time.sleep(1)"},{"line_number":320,"context_line":"        self.assertTrue("},{"line_number":321,"context_line":"            stop_thread.is_alive(),"},{"line_number":322,"context_line":"            \u0027graceful shutdown should still be waiting for the in-progress \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"8f788b03_4527abc1","line":319,"updated":"2026-08-04 21:52:28.000000000","message":"This is to make sure the thread has time to start? If it\u0027s just that, it seems rather long, but any sort of timer like this could be delayed on a heavily-loaded worker and result in a flaky test. Can\u0027t we just `wait()` on `started`? That will give us a timeout, result in the minimal amount of time and the thread has to be running in order to have set it (although you can assert `is_alive()` after you wait if you want.\n\n... later\n\nOh, is this because you need to give time for the thread in `_stop_compute_gracefully` to have done its job? Hmm, okay, but this still seems more fragile than necessary. Could we just have a condition we set in the runtime code that we use to signal that we\u0027re starting the process? I don\u0027t want to add it just for the tests, but it could potentially be useful elsewhere if we need to know if graceful shutdown has started without racing with the exact thing we\u0027re checking for.","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"21e310eb160af63dc25d18b76834b0a327f0107b","unresolved":true,"context_lines":[{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        stop_thread \u003d self._stop_compute_gracefully(self.computes[\u0027dest\u0027])"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        time.sleep(1)"},{"line_number":320,"context_line":"        self.assertTrue("},{"line_number":321,"context_line":"            stop_thread.is_alive(),"},{"line_number":322,"context_line":"            \u0027graceful shutdown should still be waiting for the in-progress \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"f9473805_0d6f631d","line":319,"in_reply_to":"8f788b03_4527abc1","updated":"2026-08-05 02:02:07.000000000","message":"This is mainly for when service.stop() reaches the service manager.graceful_shutdown(), where graceful shutdown finishes the main RPC server stop/wait (wait() can take time, as it completes existing RPC requests) and then calls the service manager to wait for in-progress tasks. Mainly, I want to wait for some time before proceed.set() so that we can avoid live migration to be completed before graceful shutdown reaches the stage where it waits for in-progress tasks.\n\nCurrently I am logging the different stage of shutdown so we can know where it is waiting or stuck but yeah, setting a condition in manager when it waits for in-progress tasks can be useful. will add it","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ea9d7b982ed921c1cc1fb55b2f5d5b17bdd5e0ea","unresolved":false,"context_lines":[{"line_number":316,"context_line":""},{"line_number":317,"context_line":"        stop_thread \u003d self._stop_compute_gracefully(self.computes[\u0027dest\u0027])"},{"line_number":318,"context_line":""},{"line_number":319,"context_line":"        time.sleep(1)"},{"line_number":320,"context_line":"        self.assertTrue("},{"line_number":321,"context_line":"            stop_thread.is_alive(),"},{"line_number":322,"context_line":"            \u0027graceful shutdown should still be waiting for the in-progress \u0027"}],"source_content_type":"text/x-python","patch_set":7,"id":"fb899f83_d0daac8f","line":319,"in_reply_to":"f9473805_0d6f631d","updated":"2026-08-06 03:46:39.000000000","message":"Done","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b833769406c10b8136b9c946eb3a34cc258aa800","unresolved":true,"context_lines":[{"line_number":465,"context_line":"        stop_thread \u003d self._stop_compute_gracefully(self.computes[\u0027dest\u0027])"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        time.sleep(1)"},{"line_number":468,"context_line":"        self.assertTrue("},{"line_number":469,"context_line":"            stop_thread.is_alive(),"},{"line_number":470,"context_line":"            \u0027graceful shutdown should still be waiting for the in-progress \u0027"},{"line_number":471,"context_line":"            \u0027resize to reach finish_resize\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"05cd779d_536607de","line":468,"updated":"2026-08-05 15:26:17.000000000","message":"Here too, I think you could use your `wait_for_shutdown_in_progress()` helper here instead of the static delay and check, right? If `compute_manager._shutdown_in_progress` was a condition then there wouldn\u0027t even need to be a polling loop in the tests.","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ea9d7b982ed921c1cc1fb55b2f5d5b17bdd5e0ea","unresolved":false,"context_lines":[{"line_number":465,"context_line":"        stop_thread \u003d self._stop_compute_gracefully(self.computes[\u0027dest\u0027])"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        time.sleep(1)"},{"line_number":468,"context_line":"        self.assertTrue("},{"line_number":469,"context_line":"            stop_thread.is_alive(),"},{"line_number":470,"context_line":"            \u0027graceful shutdown should still be waiting for the in-progress \u0027"},{"line_number":471,"context_line":"            \u0027resize to reach finish_resize\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"932b9ea1_d3e092fc","line":468,"in_reply_to":"05cd779d_536607de","updated":"2026-08-06 03:46:39.000000000","message":"yeah, will change _shutdown_in_progress to event (as this will be set once during shutdown so event will work better here).","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b833769406c10b8136b9c946eb3a34cc258aa800","unresolved":true,"context_lines":[{"line_number":603,"context_line":"            compute.manager._shutdown_in_progress,"},{"line_number":604,"context_line":"            \u0027manager shutdown is not started yet\u0027)"},{"line_number":605,"context_line":""},{"line_number":606,"context_line":"    def _mock_cleanup_host(self, compute):"},{"line_number":607,"context_line":"        cleanup_called \u003d threading.Event()"},{"line_number":608,"context_line":"        original_cleanup_host \u003d compute.manager.cleanup_host"},{"line_number":609,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"cdbbe48b_8152523d","line":606,"updated":"2026-08-05 15:26:17.000000000","message":"This is basically like `_block_driver_method()`, and you repeat this pattern other places inline and here in this specific helper. Can\u0027t we maybe just refactor the former to take an object (`self.driver` for existing callers) and use the same helper for all of these cases?","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ea9d7b982ed921c1cc1fb55b2f5d5b17bdd5e0ea","unresolved":false,"context_lines":[{"line_number":603,"context_line":"            compute.manager._shutdown_in_progress,"},{"line_number":604,"context_line":"            \u0027manager shutdown is not started yet\u0027)"},{"line_number":605,"context_line":""},{"line_number":606,"context_line":"    def _mock_cleanup_host(self, compute):"},{"line_number":607,"context_line":"        cleanup_called \u003d threading.Event()"},{"line_number":608,"context_line":"        original_cleanup_host \u003d compute.manager.cleanup_host"},{"line_number":609,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"6d398bb2_6157c2ae","line":606,"in_reply_to":"cdbbe48b_8152523d","updated":"2026-08-06 03:46:39.000000000","message":"yeah, it end up multiple duplicate wrappers. done and some refactoring to keep all these helper in base class.","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ac5e332efa39d25cda15172e8ebfff75f29f5632","unresolved":true,"context_lines":[{"line_number":108,"context_line":"    def _intercept_method("},{"line_number":109,"context_line":"            self, compute, method_name, target\u003dNone, on_proceed\u003dNone,"},{"line_number":110,"context_line":"            blocking\u003dTrue):"},{"line_number":111,"context_line":"        \"\"\"Check and pause a method until explicitly released."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        Returns ``(started_event, proceed_event)``.  The caller waits on"},{"line_number":114,"context_line":"        ``started_event`` to confirm the method has been entered, then asserts"}],"source_content_type":"text/x-python","patch_set":9,"id":"f3060471_fadf61be","line":111,"updated":"2026-08-06 17:09:47.000000000","message":"Except we don\u0027t pause if blocking\u003dFalse?","commit_id":"65962d01d7f43a8087920bb1d8f1991ec4c7dfb1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"acac730f168d4f1df5aa1b2cd8ab37f5dddc840b","unresolved":false,"context_lines":[{"line_number":108,"context_line":"    def _intercept_method("},{"line_number":109,"context_line":"            self, compute, method_name, target\u003dNone, on_proceed\u003dNone,"},{"line_number":110,"context_line":"            blocking\u003dTrue):"},{"line_number":111,"context_line":"        \"\"\"Check and pause a method until explicitly released."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"        Returns ``(started_event, proceed_event)``.  The caller waits on"},{"line_number":114,"context_line":"        ``started_event`` to confirm the method has been entered, then asserts"}],"source_content_type":"text/x-python","patch_set":9,"id":"4725eafa_560c5848","line":111,"in_reply_to":"f3060471_fadf61be","updated":"2026-08-06 20:11:40.000000000","message":"yeah, done. As per other comments, I will be removeing the \u0027blocking\u0027 arg itself.","commit_id":"65962d01d7f43a8087920bb1d8f1991ec4c7dfb1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ac5e332efa39d25cda15172e8ebfff75f29f5632","unresolved":true,"context_lines":[{"line_number":118,"context_line":"        \"\"\""},{"line_number":119,"context_line":"        target \u003d target if target is not None else compute.manager.driver"},{"line_number":120,"context_line":"        original \u003d getattr(target, method_name)"},{"line_number":121,"context_line":"        on_proceed \u003d on_proceed or original"},{"line_number":122,"context_line":"        started \u003d threading.Event()"},{"line_number":123,"context_line":"        proceed \u003d _WaitableEvent()"},{"line_number":124,"context_line":"        if not blocking:"}],"source_content_type":"text/x-python","patch_set":9,"id":"94247ae3_0e3119e0","line":121,"updated":"2026-08-06 17:09:47.000000000","message":"This is sort of \"do X instead of the original\" right? Might want a better name for \"on_proceed\" like \"side_effect\" to behave like mock or something.\n\nNot a big deal, just commenting. Otherwise I *love* this `_intercept_method()` helper. It would maybe even be good to put this into a fixture and use it more in the other parts of the tests where we\u0027re probably getting lucky more than we suspect. With the move to threaded tests I think this pattern will be needed a lot more often.","commit_id":"65962d01d7f43a8087920bb1d8f1991ec4c7dfb1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"acac730f168d4f1df5aa1b2cd8ab37f5dddc840b","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        \"\"\""},{"line_number":119,"context_line":"        target \u003d target if target is not None else compute.manager.driver"},{"line_number":120,"context_line":"        original \u003d getattr(target, method_name)"},{"line_number":121,"context_line":"        on_proceed \u003d on_proceed or original"},{"line_number":122,"context_line":"        started \u003d threading.Event()"},{"line_number":123,"context_line":"        proceed \u003d _WaitableEvent()"},{"line_number":124,"context_line":"        if not blocking:"}],"source_content_type":"text/x-python","patch_set":9,"id":"b58dc6e0_2272b360","line":121,"in_reply_to":"94247ae3_0e3119e0","updated":"2026-08-06 20:11:40.000000000","message":"++ on \u0027side_effect\u0027. sure I can move it to fixture and we can see where all we can use it.","commit_id":"65962d01d7f43a8087920bb1d8f1991ec4c7dfb1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ac5e332efa39d25cda15172e8ebfff75f29f5632","unresolved":true,"context_lines":[{"line_number":592,"context_line":"        self.flags(manager_shutdown_timeout\u003d30)"},{"line_number":593,"context_line":"        cleanup_called, _ \u003d self._intercept_method("},{"line_number":594,"context_line":"            compute, \u0027cleanup_host\u0027, target\u003dcompute.manager,"},{"line_number":595,"context_line":"            blocking\u003dFalse)"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        spawn_started, spawn_proceed \u003d self._intercept_method("},{"line_number":598,"context_line":"            compute, \u0027spawn\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"beb9e32c_c267cf13","line":595,"updated":"2026-08-06 17:09:47.000000000","message":"I was wondering why the need for the `blocking` flag and different behavior. Couldn\u0027t we just set `cleanup_proceed.set()` right after we call here instead of needing the alternate behavior on the intercept fixture? Not a huge deal of course, I just feel like in most places where we\u0027re going to do this, it\u0027s basically equivalent to just immediately set proceed after we call. Maybe you have other scenarios in mind?","commit_id":"65962d01d7f43a8087920bb1d8f1991ec4c7dfb1"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"acac730f168d4f1df5aa1b2cd8ab37f5dddc840b","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        self.flags(manager_shutdown_timeout\u003d30)"},{"line_number":593,"context_line":"        cleanup_called, _ \u003d self._intercept_method("},{"line_number":594,"context_line":"            compute, \u0027cleanup_host\u0027, target\u003dcompute.manager,"},{"line_number":595,"context_line":"            blocking\u003dFalse)"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        spawn_started, spawn_proceed \u003d self._intercept_method("},{"line_number":598,"context_line":"            compute, \u0027spawn\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"06baf6e2_ebd524d6","line":595,"in_reply_to":"beb9e32c_c267cf13","updated":"2026-08-06 20:11:40.000000000","message":"no other scenario than just to know if method is called or not. I think users of _intercept_method set the proceed event will make _intercept_method more generic and let tests use it in both ways (to know method is called or wait to proceed) they want.","commit_id":"65962d01d7f43a8087920bb1d8f1991ec4c7dfb1"}],"nova/tests/unit/compute/test_compute_mgr.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b833769406c10b8136b9c946eb3a34cc258aa800","unresolved":true,"context_lines":[{"line_number":1049,"context_line":"        mock_task_start.assert_called_once_with("},{"line_number":1050,"context_line":"            \u0027fake-task\u0027, instance.uuid, self.context.request_id)"},{"line_number":1051,"context_line":"        mock_task_end.assert_called_once_with(1, mock.ANY)"},{"line_number":1052,"context_line":"        self.assertEqual({}, self.compute._in_progress_tasks)"},{"line_number":1053,"context_line":""},{"line_number":1054,"context_line":"    def test_start_recorded_task_func_failure_record_task_failed(self):"},{"line_number":1055,"context_line":"        instance \u003d objects.Instance(uuid\u003duuidutils.generate_uuid())"}],"source_content_type":"text/x-python","patch_set":7,"id":"f4cc8466_cdc528f3","line":1052,"updated":"2026-08-05 15:26:17.000000000","message":"I\u0027m not sure we need the test above this one distinct from this. Is there some important difference I\u0027m missing?","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ea9d7b982ed921c1cc1fb55b2f5d5b17bdd5e0ea","unresolved":false,"context_lines":[{"line_number":1049,"context_line":"        mock_task_start.assert_called_once_with("},{"line_number":1050,"context_line":"            \u0027fake-task\u0027, instance.uuid, self.context.request_id)"},{"line_number":1051,"context_line":"        mock_task_end.assert_called_once_with(1, mock.ANY)"},{"line_number":1052,"context_line":"        self.assertEqual({}, self.compute._in_progress_tasks)"},{"line_number":1053,"context_line":""},{"line_number":1054,"context_line":"    def test_start_recorded_task_func_failure_record_task_failed(self):"},{"line_number":1055,"context_line":"        instance \u003d objects.Instance(uuid\u003duuidutils.generate_uuid())"}],"source_content_type":"text/x-python","patch_set":7,"id":"a694b878_93114ff8","line":1052,"in_reply_to":"f4cc8466_cdc528f3","updated":"2026-08-06 03:46:39.000000000","message":"yeah both checks smae things. i will remove this one","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b833769406c10b8136b9c946eb3a34cc258aa800","unresolved":true,"context_lines":[{"line_number":12140,"context_line":""},{"line_number":12141,"context_line":"        _test()"},{"line_number":12142,"context_line":""},{"line_number":12143,"context_line":"        # The tve migration stay in-progress."},{"line_number":12144,"context_line":"        self.assertIn(instance.uuid, compute._pending_dest_live_migrations)"},{"line_number":12145,"context_line":"        self.assertEqual(1, len(compute._in_progress_tasks))"},{"line_number":12146,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"c54ea778_94d94ee7","line":12143,"range":{"start_line":12143,"start_character":14,"end_line":12143,"end_character":17},"updated":"2026-08-05 15:26:17.000000000","message":"\"the\" ?","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ea9d7b982ed921c1cc1fb55b2f5d5b17bdd5e0ea","unresolved":false,"context_lines":[{"line_number":12140,"context_line":""},{"line_number":12141,"context_line":"        _test()"},{"line_number":12142,"context_line":""},{"line_number":12143,"context_line":"        # The tve migration stay in-progress."},{"line_number":12144,"context_line":"        self.assertIn(instance.uuid, compute._pending_dest_live_migrations)"},{"line_number":12145,"context_line":"        self.assertEqual(1, len(compute._in_progress_tasks))"},{"line_number":12146,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"e8d8e536_c9b724a8","line":12143,"range":{"start_line":12143,"start_character":14,"end_line":12143,"end_character":17},"in_reply_to":"c54ea778_94d94ee7","updated":"2026-08-06 03:46:39.000000000","message":"Done","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"}],"nova/tests/unit/test_manager.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b833769406c10b8136b9c946eb3a34cc258aa800","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    @mock.patch(\u0027nova.manager.LOG\u0027)"},{"line_number":99,"context_line":"    def test_record_task_end_called_twice_logs_warning(self, mock_log):"},{"line_number":100,"context_line":"        # Calling _record_task_end() again for an already-ended task (e.g."},{"line_number":101,"context_line":"        # a double callback) should log warning."},{"line_number":102,"context_line":"        key \u003d self.manager._record_task_start(\u0027task-a\u0027, \u0027instance-1\u0027, \u0027req-1\u0027)"},{"line_number":103,"context_line":"        self.manager._shutdown_in_progress \u003d True"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"05ffdc45_05c5c9bd","line":101,"updated":"2026-08-05 15:26:17.000000000","message":"++","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b833769406c10b8136b9c946eb3a34cc258aa800","unresolved":true,"context_lines":[{"line_number":231,"context_line":"        key \u003d self.manager._record_task_start(\u0027task-a\u0027, \u0027instance-1\u0027, \u0027req-1\u0027)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        def _finish_soon():"},{"line_number":234,"context_line":"            time.sleep(2)"},{"line_number":235,"context_line":"            self.manager._record_task_end(key)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        t \u003d threading.Thread(target\u003d_finish_soon)"}],"source_content_type":"text/x-python","patch_set":7,"id":"d1529969_7c7d86c1","line":234,"updated":"2026-08-05 15:26:17.000000000","message":"I think it\u0027s really unfortunate to have to put real sleeps in our unit/functional tests really anywhere. All these eventually add up and just make things run slower for no reason. Using conditions or something to lockstep the wait-er and wait-ee whenever we can seems prudent to me. Not saying you have to change this but... the more we add the worse it gets very slowly.","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ea9d7b982ed921c1cc1fb55b2f5d5b17bdd5e0ea","unresolved":false,"context_lines":[{"line_number":231,"context_line":"        key \u003d self.manager._record_task_start(\u0027task-a\u0027, \u0027instance-1\u0027, \u0027req-1\u0027)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        def _finish_soon():"},{"line_number":234,"context_line":"            time.sleep(2)"},{"line_number":235,"context_line":"            self.manager._record_task_end(key)"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        t \u003d threading.Thread(target\u003d_finish_soon)"}],"source_content_type":"text/x-python","patch_set":7,"id":"4471fa4e_c090fab5","line":234,"in_reply_to":"d1529969_7c7d86c1","updated":"2026-08-06 03:46:39.000000000","message":"agree, I think remove the sleep. We can check condition as self.manager._in_progress_task_cond is already there which is being waited in _wait_for_in_progress_tasks and notify_all from _record_task_end","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"}],"nova/virt/driver.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4a0757799d630492a61df6063c0d473d3d0eeea0","unresolved":true,"context_lines":[{"line_number":383,"context_line":"        including ending remote sessions. This is optional."},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        This is called synchronously during graceful shutdown and with no"},{"line_number":386,"context_line":"        timeout of its own. If the cleanup takes time then serviec graceful"},{"line_number":387,"context_line":"        shutdown may interrupt it as this is run in a daemon thread bounded"},{"line_number":388,"context_line":"        by manager_shutdown_timeout/graceful_shutdown_timeout, so a hang here"},{"line_number":389,"context_line":"        will not block the process from exiting."}],"source_content_type":"text/x-python","patch_set":7,"id":"07c77431_a123d461","line":386,"range":{"start_line":386,"start_character":59,"end_line":386,"end_character":66},"updated":"2026-08-03 17:19:57.000000000","message":"\"service\"","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"5cf8dbbac7705e9bbec14cf6be1470e5eb507cef","unresolved":true,"context_lines":[{"line_number":383,"context_line":"        including ending remote sessions. This is optional."},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        This is called synchronously during graceful shutdown and with no"},{"line_number":386,"context_line":"        timeout of its own. If the cleanup takes time then serviec graceful"},{"line_number":387,"context_line":"        shutdown may interrupt it as this is run in a daemon thread bounded"},{"line_number":388,"context_line":"        by manager_shutdown_timeout/graceful_shutdown_timeout, so a hang here"},{"line_number":389,"context_line":"        will not block the process from exiting."}],"source_content_type":"text/x-python","patch_set":7,"id":"70f60116_d243b58b","line":386,"range":{"start_line":386,"start_character":59,"end_line":386,"end_character":66},"in_reply_to":"07c77431_a123d461","updated":"2026-08-04 17:09:16.000000000","message":"Acknowledged","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ea9d7b982ed921c1cc1fb55b2f5d5b17bdd5e0ea","unresolved":false,"context_lines":[{"line_number":383,"context_line":"        including ending remote sessions. This is optional."},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"        This is called synchronously during graceful shutdown and with no"},{"line_number":386,"context_line":"        timeout of its own. If the cleanup takes time then serviec graceful"},{"line_number":387,"context_line":"        shutdown may interrupt it as this is run in a daemon thread bounded"},{"line_number":388,"context_line":"        by manager_shutdown_timeout/graceful_shutdown_timeout, so a hang here"},{"line_number":389,"context_line":"        will not block the process from exiting."}],"source_content_type":"text/x-python","patch_set":7,"id":"996e767f_fbe7967f","line":386,"range":{"start_line":386,"start_character":59,"end_line":386,"end_character":66},"in_reply_to":"70f60116_d243b58b","updated":"2026-08-06 03:46:39.000000000","message":"Done","commit_id":"1fa31434cc5f339951ad7ed0641f0d41596603b3"}]}
