)]}'
{"/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"}],"/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"}],"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":"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"}],"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":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":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"}],"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"}]}
