)]}'
{".zuul.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e1e2a609f98b40cad3088d711624f60daf727c34","unresolved":true,"context_lines":[{"line_number":355,"context_line":"    vars:"},{"line_number":356,"context_line":"      devstack_localrc:"},{"line_number":357,"context_line":"        \u0027SYSTEMD_ENV_VARS[\"watcher-decision-engine\"]\u0027: OS_WATCHER_DISABLE_EVENTLET_PATCHING\u003dtrue"},{"line_number":358,"context_line":"        \u0027SYSTEMD_ENV_VARS[\"watcher-applier\"]\u0027: OS_WATCHER_DISABLE_EVENTLET_PATCHING\u003dtrue"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"- job:"},{"line_number":361,"context_line":"    name: openstack-tox-py312-threading"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"df100508_3869332f","line":358,"updated":"2025-11-18 16:04:05.000000000","message":"why do we not also have the api?\n\ndid we just move that entirly last cycle?","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5a6d52ee11b31952e50fba552ddfe788a76fd2e9","unresolved":false,"context_lines":[{"line_number":355,"context_line":"    vars:"},{"line_number":356,"context_line":"      devstack_localrc:"},{"line_number":357,"context_line":"        \u0027SYSTEMD_ENV_VARS[\"watcher-decision-engine\"]\u0027: OS_WATCHER_DISABLE_EVENTLET_PATCHING\u003dtrue"},{"line_number":358,"context_line":"        \u0027SYSTEMD_ENV_VARS[\"watcher-applier\"]\u0027: OS_WATCHER_DISABLE_EVENTLET_PATCHING\u003dtrue"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"- job:"},{"line_number":361,"context_line":"    name: openstack-tox-py312-threading"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"85acc568_ed45ee34","line":358,"in_reply_to":"68107ba5_4ce7a425","updated":"2025-11-28 17:41:09.000000000","message":"Acknowledged","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"ed635d47185dae1a608eee7d393f784d2f945984","unresolved":true,"context_lines":[{"line_number":355,"context_line":"    vars:"},{"line_number":356,"context_line":"      devstack_localrc:"},{"line_number":357,"context_line":"        \u0027SYSTEMD_ENV_VARS[\"watcher-decision-engine\"]\u0027: OS_WATCHER_DISABLE_EVENTLET_PATCHING\u003dtrue"},{"line_number":358,"context_line":"        \u0027SYSTEMD_ENV_VARS[\"watcher-applier\"]\u0027: OS_WATCHER_DISABLE_EVENTLET_PATCHING\u003dtrue"},{"line_number":359,"context_line":""},{"line_number":360,"context_line":"- job:"},{"line_number":361,"context_line":"    name: openstack-tox-py312-threading"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"68107ba5_4ce7a425","line":358,"in_reply_to":"df100508_3869332f","updated":"2025-11-18 18:04:21.000000000","message":"mainly because there was no associated eventlet code in api side. But yeah, we can expliciy set that for the api too, I can propose another patch to include it.","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"6f2e586c601853992411ba8e29ca87ceed6941e8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"fa356c8e_370ed989","updated":"2025-11-05 20:46:47.000000000","message":"still wip","commit_id":"14e58c28eb4c5a1f2db2f8c4c57e1553ce0a37e8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96f2cc3b8dc47ff18475e364e289740a2d87c33a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"4d017a64_2d206a5e","updated":"2025-11-19 11:31:15.000000000","message":"i think im happy to upgrade to a +2 once joan\u0027s release note comment is adressed","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e1e2a609f98b40cad3088d711624f60daf727c34","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"b9f2d72a_8c7a9ab1","updated":"2025-11-18 16:04:05.000000000","message":"ill make time to review this properly in the next day or two just reslvoing som ecomments","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b5df37dd00edfe2ed045a1b25d805ee425bf2888","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"7a1d34c5_3d15e8b6","updated":"2025-11-19 10:26:31.000000000","message":"successfully tested locally","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"b08d89c18075e437e5240ff25d5fa2c36d35aecd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"1ab3b438_03606adb","updated":"2025-11-18 11:26:58.000000000","message":"the code looks good to me, I just spotted a typo. The limitations (serial actions in threading mode) are well covered in the commit message. I think this is good to go, my only question is, should we create a bug to have a tracker for this temporary limitation?","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"c234585c0f7b77e5a63b22d2d2bfe24956692a8f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"d99f6b22_52f28acf","in_reply_to":"1ab3b438_03606adb","updated":"2025-11-18 12:34:56.000000000","message":"Thanks Joan,\nYes, if we agreed on merging this patch as is, I would create a LP bug to track this limitation.","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"b7e2f64b824c99c10e0ed0c3f02c98a94b058ad3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"78321571_1cf29362","in_reply_to":"d99f6b22_52f28acf","updated":"2025-12-01 14:15:04.000000000","message":"Created: https://bugs.launchpad.net/watcher/+bug/2133505","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d2d4e994d8ee86cb5ec12f019e45c96af093f5f2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"601879a6_c3110906","updated":"2025-11-19 20:32:48.000000000","message":"Ty you all for the reviews.","commit_id":"6f75b90fd9c0edf195d1963c209b076575f0822a"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"c7c767aea70c831178bf05f23b914df038fa86e8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"7b79f811_4099ab20","updated":"2025-11-25 11:59:51.000000000","message":"lgtm, thanks!","commit_id":"6f75b90fd9c0edf195d1963c209b076575f0822a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"566442b41bad39cf98753b07f4c08d37e4073736","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"467bc1be_325abb63","updated":"2025-12-01 01:50:45.000000000","message":"recheck","commit_id":"6f75b90fd9c0edf195d1963c209b076575f0822a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"706294eda5e5b67fcda8d63dfedcae59fbcb65eb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"d9740842_57067c7a","updated":"2025-12-01 01:49:41.000000000","message":"teim-ci: manual","commit_id":"6f75b90fd9c0edf195d1963c209b076575f0822a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bb1996405d1469bb3c070bcc3698a14602e2a7ef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"f217d18a_a917c8e9","updated":"2025-12-30 15:44:14.000000000","message":"reapproving following trivial rebase","commit_id":"e45860787f9213c4866b60d6ef7e787bc97c0fdc"}],"releasenotes/notes/applier-threading-mode-882c79ca8843bc5a.yaml":[{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"b08d89c18075e437e5240ff25d5fa2c36d35aecd","unresolved":true,"context_lines":[{"line_number":8,"context_line":"    native threading mode, the environment variable"},{"line_number":9,"context_line":"    ``OS_WATCHER_DISABLE_EVENTLET_PATCHING\u003dtrue`` needs to be added to the"},{"line_number":10,"context_line":"    applier service configuration. When running in native threading mode, the"},{"line_number":11,"context_line":"    default workflow engine (Taskflow) will be configure with a serial engine,"},{"line_number":12,"context_line":"    which will execute the actions sequentially, due to a limitation of the"},{"line_number":13,"context_line":"    current implementation of watcher services."},{"line_number":14,"context_line":"    For more information, please check `eventlet"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"e4076a7f_b6ed27da","line":11,"updated":"2025-11-18 11:26:58.000000000","message":"```suggestion\n    default workflow engine (Taskflow) will be configured with a serial engine,\n```","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d2d4e994d8ee86cb5ec12f019e45c96af093f5f2","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    native threading mode, the environment variable"},{"line_number":9,"context_line":"    ``OS_WATCHER_DISABLE_EVENTLET_PATCHING\u003dtrue`` needs to be added to the"},{"line_number":10,"context_line":"    applier service configuration. When running in native threading mode, the"},{"line_number":11,"context_line":"    default workflow engine (Taskflow) will be configure with a serial engine,"},{"line_number":12,"context_line":"    which will execute the actions sequentially, due to a limitation of the"},{"line_number":13,"context_line":"    current implementation of watcher services."},{"line_number":14,"context_line":"    For more information, please check `eventlet"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"c8abafb4_725fef49","line":11,"in_reply_to":"45745b86_d3b1a872","updated":"2025-11-19 20:32:48.000000000","message":"Done, thanks Joan!","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96f2cc3b8dc47ff18475e364e289740a2d87c33a","unresolved":true,"context_lines":[{"line_number":8,"context_line":"    native threading mode, the environment variable"},{"line_number":9,"context_line":"    ``OS_WATCHER_DISABLE_EVENTLET_PATCHING\u003dtrue`` needs to be added to the"},{"line_number":10,"context_line":"    applier service configuration. When running in native threading mode, the"},{"line_number":11,"context_line":"    default workflow engine (Taskflow) will be configure with a serial engine,"},{"line_number":12,"context_line":"    which will execute the actions sequentially, due to a limitation of the"},{"line_number":13,"context_line":"    current implementation of watcher services."},{"line_number":14,"context_line":"    For more information, please check `eventlet"}],"source_content_type":"text/x-yaml","patch_set":6,"id":"45745b86_d3b1a872","line":11,"in_reply_to":"e4076a7f_b6ed27da","updated":"2025-11-19 11:31:15.000000000","message":"this is valid and proably shoudl be fixed since its a release note","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"}],"watcher/applier/messaging/trigger.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b5df37dd00edfe2ed045a1b25d805ee425bf2888","unresolved":true,"context_lines":[{"line_number":44,"context_line":"    def launch_action_plan(self, context, action_plan_uuid):"},{"line_number":45,"context_line":"        LOG.debug(\"Trigger ActionPlan %s\", action_plan_uuid)"},{"line_number":46,"context_line":"        # submit"},{"line_number":47,"context_line":"        executor.log_executor_stats(self.executor, name\u003d\"action-plan-pool\")"},{"line_number":48,"context_line":"        self.executor.submit(self.do_launch_action_plan, context,"},{"line_number":49,"context_line":"                             action_plan_uuid)"},{"line_number":50,"context_line":"        return action_plan_uuid"}],"source_content_type":"text/x-python","patch_set":6,"id":"f5f45ced_b6c3f2dd","line":47,"range":{"start_line":47,"start_character":0,"end_line":47,"end_character":2},"updated":"2025-11-19 10:26:31.000000000","message":"+1, good point adding the option to print executor stats.","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d2d4e994d8ee86cb5ec12f019e45c96af093f5f2","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    def launch_action_plan(self, context, action_plan_uuid):"},{"line_number":45,"context_line":"        LOG.debug(\"Trigger ActionPlan %s\", action_plan_uuid)"},{"line_number":46,"context_line":"        # submit"},{"line_number":47,"context_line":"        executor.log_executor_stats(self.executor, name\u003d\"action-plan-pool\")"},{"line_number":48,"context_line":"        self.executor.submit(self.do_launch_action_plan, context,"},{"line_number":49,"context_line":"                             action_plan_uuid)"},{"line_number":50,"context_line":"        return action_plan_uuid"}],"source_content_type":"text/x-python","patch_set":6,"id":"2245e37b_08080f2f","line":47,"range":{"start_line":47,"start_character":0,"end_line":47,"end_character":2},"in_reply_to":"f5f45ced_b6c3f2dd","updated":"2025-11-19 20:32:48.000000000","message":"Acknowledged","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"}],"watcher/applier/workflow_engine/base.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"5ff233404d9df6bc2be57a85a451b1f274a54409","unresolved":true,"context_lines":[{"line_number":229,"context_line":"                raise"},{"line_number":230,"context_line":"        # NOTE: spawn a new thread for action execution, so that if action plan"},{"line_number":231,"context_line":"        # is cancelled workflow engine will not wait to finish action execution"},{"line_number":232,"context_line":"        et \u003d utils.thread_spawn(_do_execute_action, *args, **kwargs)"},{"line_number":233,"context_line":"        utils.thread_start(et)"},{"line_number":234,"context_line":"        # NOTE: check for the state of action plan periodically,so that if"},{"line_number":235,"context_line":"        # action is finished or action plan is cancelled we can exit from here."}],"source_content_type":"text/x-python","patch_set":2,"id":"3ecc5c89_7c76da6c","line":232,"in_reply_to":"0834fbd8_88ef7382","updated":"2025-11-12 16:23:11.000000000","message":"For threading mode we are configuring the engine in serial mode, so no additional threads are created by taskflow.","commit_id":"e6d1d1d5738320781591401a7fa7b85e85fcbbb4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96f2cc3b8dc47ff18475e364e289740a2d87c33a","unresolved":false,"context_lines":[{"line_number":229,"context_line":"                raise"},{"line_number":230,"context_line":"        # NOTE: spawn a new thread for action execution, so that if action plan"},{"line_number":231,"context_line":"        # is cancelled workflow engine will not wait to finish action execution"},{"line_number":232,"context_line":"        et \u003d utils.thread_spawn(_do_execute_action, *args, **kwargs)"},{"line_number":233,"context_line":"        utils.thread_start(et)"},{"line_number":234,"context_line":"        # NOTE: check for the state of action plan periodically,so that if"},{"line_number":235,"context_line":"        # action is finished or action plan is cancelled we can exit from here."}],"source_content_type":"text/x-python","patch_set":2,"id":"fc781f2f_f1e05c82","line":232,"in_reply_to":"3ecc5c89_7c76da6c","updated":"2025-11-19 11:31:15.000000000","message":"Acknowledged","commit_id":"e6d1d1d5738320781591401a7fa7b85e85fcbbb4"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"5ff233404d9df6bc2be57a85a451b1f274a54409","unresolved":true,"context_lines":[{"line_number":254,"context_line":"            # Not all actions support abort operations, kill only those action"},{"line_number":255,"context_line":"            # which support abort operations"},{"line_number":256,"context_line":"            abort \u003d self.action.check_abort()"},{"line_number":257,"context_line":"            if (action_plan_object.state in"},{"line_number":258,"context_line":"                objects.action_plan.State.CANCEL_STATES and"},{"line_number":259,"context_line":"                    abort):"},{"line_number":260,"context_line":"                # NOTE(dviroel): killing green thread will raise an exception"}],"source_content_type":"text/x-python","patch_set":2,"id":"f3f3343e_14512ef1","line":257,"in_reply_to":"815209e6_b8f92dab","updated":"2025-11-12 16:23:11.000000000","message":"Expected behavior. We are going to remove this abort process in follow ups.","commit_id":"e6d1d1d5738320781591401a7fa7b85e85fcbbb4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96f2cc3b8dc47ff18475e364e289740a2d87c33a","unresolved":false,"context_lines":[{"line_number":254,"context_line":"            # Not all actions support abort operations, kill only those action"},{"line_number":255,"context_line":"            # which support abort operations"},{"line_number":256,"context_line":"            abort \u003d self.action.check_abort()"},{"line_number":257,"context_line":"            if (action_plan_object.state in"},{"line_number":258,"context_line":"                objects.action_plan.State.CANCEL_STATES and"},{"line_number":259,"context_line":"                    abort):"},{"line_number":260,"context_line":"                # NOTE(dviroel): killing green thread will raise an exception"}],"source_content_type":"text/x-python","patch_set":2,"id":"b6cb299a_3690b80e","line":257,"in_reply_to":"f3f3343e_14512ef1","updated":"2025-11-19 11:31:15.000000000","message":"im actully kind of happy it made this observation as it demonstrate at least a non trivial understanding of the code change that was being made.\n\nbut i agree this is the expected/designed behaviour.","commit_id":"e6d1d1d5738320781591401a7fa7b85e85fcbbb4"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b5df37dd00edfe2ed045a1b25d805ee425bf2888","unresolved":true,"context_lines":[{"line_number":256,"context_line":"            abort \u003d self.action.check_abort()"},{"line_number":257,"context_line":"            if (action_plan_object.state in"},{"line_number":258,"context_line":"                objects.action_plan.State.CANCEL_STATES and"},{"line_number":259,"context_line":"                    abort):"},{"line_number":260,"context_line":"                # NOTE(dviroel): killing green thread will raise an exception"},{"line_number":261,"context_line":"                # which will be caught by taskflow and revert and abort will"},{"line_number":262,"context_line":"                # be called. For threading mode, we will continue to wait for"},{"line_number":263,"context_line":"                # it to finish, and no abort will be called."},{"line_number":264,"context_line":"                utils.thread_kill(et)"},{"line_number":265,"context_line":"            utils.thread_wait(et)"},{"line_number":266,"context_line":"            return result"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"            # NOTE: catch the greenlet exit exception due to thread kill,"}],"source_content_type":"text/x-python","patch_set":6,"id":"cf9297c2_b9d7c097","line":265,"range":{"start_line":259,"start_character":0,"end_line":265,"end_character":33},"updated":"2025-11-19 10:26:31.000000000","message":"For the record, I\u0027ve tested the ActionPlan cancel both in eventlet and threading mode:\n\n1. In threading mode it works as expected, the ongoing action is not cancelled but the following ones are cancelled and the actionplan is set as CANCELLED.\n2. In eventlet mode, it fails to cancel, the AP goes to FAILED and the ongoing actions stay in the existing state (ONGOING and PENDING in my case). This behavior is found also before this patch so it\u0027s unrelated to it. Given that we plan to change the AP cancel behavior, I think it\u0027s something we will manage in follow-up.","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5a6d52ee11b31952e50fba552ddfe788a76fd2e9","unresolved":false,"context_lines":[{"line_number":256,"context_line":"            abort \u003d self.action.check_abort()"},{"line_number":257,"context_line":"            if (action_plan_object.state in"},{"line_number":258,"context_line":"                objects.action_plan.State.CANCEL_STATES and"},{"line_number":259,"context_line":"                    abort):"},{"line_number":260,"context_line":"                # NOTE(dviroel): killing green thread will raise an exception"},{"line_number":261,"context_line":"                # which will be caught by taskflow and revert and abort will"},{"line_number":262,"context_line":"                # be called. For threading mode, we will continue to wait for"},{"line_number":263,"context_line":"                # it to finish, and no abort will be called."},{"line_number":264,"context_line":"                utils.thread_kill(et)"},{"line_number":265,"context_line":"            utils.thread_wait(et)"},{"line_number":266,"context_line":"            return result"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"            # NOTE: catch the greenlet exit exception due to thread kill,"}],"source_content_type":"text/x-python","patch_set":6,"id":"08f4bc55_2f22024f","line":265,"range":{"start_line":259,"start_character":0,"end_line":265,"end_character":33},"in_reply_to":"656561ad_252a0e88","updated":"2025-11-28 17:41:09.000000000","message":"lets try not to forget to do that but i think we agree and can proceed with this enhancement for now.","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"07c480e536a899237ba416f503b3c4fc2b5818aa","unresolved":true,"context_lines":[{"line_number":256,"context_line":"            abort \u003d self.action.check_abort()"},{"line_number":257,"context_line":"            if (action_plan_object.state in"},{"line_number":258,"context_line":"                objects.action_plan.State.CANCEL_STATES and"},{"line_number":259,"context_line":"                    abort):"},{"line_number":260,"context_line":"                # NOTE(dviroel): killing green thread will raise an exception"},{"line_number":261,"context_line":"                # which will be caught by taskflow and revert and abort will"},{"line_number":262,"context_line":"                # be called. For threading mode, we will continue to wait for"},{"line_number":263,"context_line":"                # it to finish, and no abort will be called."},{"line_number":264,"context_line":"                utils.thread_kill(et)"},{"line_number":265,"context_line":"            utils.thread_wait(et)"},{"line_number":266,"context_line":"            return result"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"            # NOTE: catch the greenlet exit exception due to thread kill,"}],"source_content_type":"text/x-python","patch_set":6,"id":"bcca6bd7_8ff46da8","line":265,"range":{"start_line":259,"start_character":0,"end_line":265,"end_character":33},"in_reply_to":"9bd26889_c30a5aed","updated":"2025-11-19 13:34:34.000000000","message":"+1 to implement behavior 1 for all cases in follow-up and document it appropriately.","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"d2d4e994d8ee86cb5ec12f019e45c96af093f5f2","unresolved":true,"context_lines":[{"line_number":256,"context_line":"            abort \u003d self.action.check_abort()"},{"line_number":257,"context_line":"            if (action_plan_object.state in"},{"line_number":258,"context_line":"                objects.action_plan.State.CANCEL_STATES and"},{"line_number":259,"context_line":"                    abort):"},{"line_number":260,"context_line":"                # NOTE(dviroel): killing green thread will raise an exception"},{"line_number":261,"context_line":"                # which will be caught by taskflow and revert and abort will"},{"line_number":262,"context_line":"                # be called. For threading mode, we will continue to wait for"},{"line_number":263,"context_line":"                # it to finish, and no abort will be called."},{"line_number":264,"context_line":"                utils.thread_kill(et)"},{"line_number":265,"context_line":"            utils.thread_wait(et)"},{"line_number":266,"context_line":"            return result"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"            # NOTE: catch the greenlet exit exception due to thread kill,"}],"source_content_type":"text/x-python","patch_set":6,"id":"656561ad_252a0e88","line":265,"range":{"start_line":259,"start_character":0,"end_line":265,"end_character":33},"in_reply_to":"bcca6bd7_8ff46da8","updated":"2025-11-19 20:32:48.000000000","message":"Thanks you Alfredo for taking a time to validate both behaviors. Indeed, the evenlet can be fixed in a different patch with an associated bug. Thanks for the feedback.","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96f2cc3b8dc47ff18475e364e289740a2d87c33a","unresolved":true,"context_lines":[{"line_number":256,"context_line":"            abort \u003d self.action.check_abort()"},{"line_number":257,"context_line":"            if (action_plan_object.state in"},{"line_number":258,"context_line":"                objects.action_plan.State.CANCEL_STATES and"},{"line_number":259,"context_line":"                    abort):"},{"line_number":260,"context_line":"                # NOTE(dviroel): killing green thread will raise an exception"},{"line_number":261,"context_line":"                # which will be caught by taskflow and revert and abort will"},{"line_number":262,"context_line":"                # be called. For threading mode, we will continue to wait for"},{"line_number":263,"context_line":"                # it to finish, and no abort will be called."},{"line_number":264,"context_line":"                utils.thread_kill(et)"},{"line_number":265,"context_line":"            utils.thread_wait(et)"},{"line_number":266,"context_line":"            return result"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"            # NOTE: catch the greenlet exit exception due to thread kill,"}],"source_content_type":"text/x-python","patch_set":6,"id":"9bd26889_c30a5aed","line":265,"range":{"start_line":259,"start_character":0,"end_line":265,"end_character":33},"in_reply_to":"cf9297c2_b9d7c097","updated":"2025-11-19 11:31:15.000000000","message":"ah good observation\n\ni think the behvior in 1 is nicer honestly so i am ok with adressing this in a followup as you said espcially if we converge on that behavior or somthing simialr.\n\nalso this is hopefuly going away next cycle with the removal of eventlet so as long as we docuemnt the behvior i think it may be ok.\n\nits a little problematic as really we should try and have consitent behavior between both as our tempest test shoudl not need to know which backend is being used and that should not be api visable but i think we can unifi on the new behvior in  both mode and call this out in an upgrade release note when we do.","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"}],"watcher/common/utils.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"5ff233404d9df6bc2be57a85a451b1f274a54409","unresolved":true,"context_lines":[{"line_number":244,"context_line":"        return self.result"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"def thread_spawn(func, *args, **kwargs):"},{"line_number":248,"context_line":"    \"\"\"Spawn a new thread or eventlet green thread."},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    :param func: The function to spawn."}],"source_content_type":"text/x-python","patch_set":2,"id":"f740dedd_08346c30","line":247,"in_reply_to":"7cec1431_a538d5e4","updated":"2025-11-12 16:23:11.000000000","message":"This code may be removed together with eventlet removal in future releases.","commit_id":"e6d1d1d5738320781591401a7fa7b85e85fcbbb4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e1e2a609f98b40cad3088d711624f60daf727c34","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        return self.result"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"def thread_spawn(func, *args, **kwargs):"},{"line_number":248,"context_line":"    \"\"\"Spawn a new thread or eventlet green thread."},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    :param func: The function to spawn."}],"source_content_type":"text/x-python","patch_set":2,"id":"6f6302da_052001e0","line":247,"in_reply_to":"f740dedd_08346c30","updated":"2025-11-18 16:04:05.000000000","message":"Acknowledged","commit_id":"e6d1d1d5738320781591401a7fa7b85e85fcbbb4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e1e2a609f98b40cad3088d711624f60daf727c34","unresolved":false,"context_lines":[{"line_number":258,"context_line":"        return InlineThread(func, *args, **kwargs)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"def thread_start(thread, daemon\u003dTrue):"},{"line_number":262,"context_line":"    \"\"\"Start a thread."},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    :param thread: The thread to start."}],"source_content_type":"text/x-python","patch_set":2,"id":"048612aa_6386490e","line":261,"in_reply_to":"2553d17d_647b13a5","updated":"2025-11-18 16:04:05.000000000","message":"Done","commit_id":"e6d1d1d5738320781591401a7fa7b85e85fcbbb4"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"5ff233404d9df6bc2be57a85a451b1f274a54409","unresolved":true,"context_lines":[{"line_number":258,"context_line":"        return InlineThread(func, *args, **kwargs)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":""},{"line_number":261,"context_line":"def thread_start(thread, daemon\u003dTrue):"},{"line_number":262,"context_line":"    \"\"\"Start a thread."},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"    :param thread: The thread to start."}],"source_content_type":"text/x-python","patch_set":2,"id":"2553d17d_647b13a5","line":261,"in_reply_to":"f5c61903_cc94ab1d","updated":"2025-11-12 16:23:11.000000000","message":"Going to fix in the next PS.","commit_id":"e6d1d1d5738320781591401a7fa7b85e85fcbbb4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96f2cc3b8dc47ff18475e364e289740a2d87c33a","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        return tpool.execute(tpool_wrapper)"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"class InlineThread:"},{"line_number":198,"context_line":"    \"\"\"Executes function inline (synchronously), mimicking thread interface."},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    This class is used in non-eventlet mode to execute functions synchronously"}],"source_content_type":"text/x-python","patch_set":6,"id":"e7c272d0_ea10bdca","line":197,"in_reply_to":"c6b44884_3a6ed38b","updated":"2025-11-19 11:31:15.000000000","message":"\u003e Add type hints to InlineThread class methods\n\u003e \n\u003e **Severity**: SUGGESTION | **Confidence**: 0.6\n\u003e \n\u003e **Benefit**: Improves code documentation and static analysis support\n\u003e \n\u003e **Recommendation**:\n\u003e Add type hints for function signatures and return types\n\ni would like to start adding type hints to more of our apis  but we are not at that point yet so this can be ignored.\n\ni am planning to add the ability to have per repo style guidance in the coming weeks so i may restrict type hinting suggestion to abstract classes for now.\nalthough when the team is ready to start using typing more widly this is an suggetion that i think we shoudl genreally follow.","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96f2cc3b8dc47ff18475e364e289740a2d87c33a","unresolved":false,"context_lines":[{"line_number":214,"context_line":"        self.kwargs \u003d kwargs"},{"line_number":215,"context_line":"        self.result \u003d None"},{"line_number":216,"context_line":"        self.exception \u003d None"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    def start(self):"},{"line_number":219,"context_line":"        \"\"\"Execute the function synchronously in the current thread."},{"line_number":220,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1688024d_d8d4808c","line":217,"in_reply_to":"6e23d7d4_dbde30cb","updated":"2025-11-19 11:31:15.000000000","message":"\u003e Potential race condition in InlineThread class\n\u003e \n\u003e **Severity**: WARNING | **Confidence**: 0.7\n\u003e \n\u003e **Impact**: Could cause inconsistent state if multiple threads access InlineThread instance concurrently\n\u003e \n\u003e **Suggestion**:\n\u003e Add thread safety protection to InlineThread methods or document that instances should not be shared\n\nwe could but the doc string already says the class is mimicing a thread interface and we woudl not share thread between thread so we can ignore htis.","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96f2cc3b8dc47ff18475e364e289740a2d87c33a","unresolved":false,"context_lines":[{"line_number":244,"context_line":"        return self.result"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"def thread_spawn(func, *args, **kwargs):"},{"line_number":248,"context_line":"    \"\"\"Create a synchronous thread or eventlet green thread."},{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    :param func: The function to spawn."}],"source_content_type":"text/x-python","patch_set":6,"id":"84ad897f_1af5f0eb","line":247,"in_reply_to":"89f7e8cd_2c57d15d","updated":"2025-11-19 11:31:15.000000000","message":"not needed.","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96f2cc3b8dc47ff18475e364e289740a2d87c33a","unresolved":false,"context_lines":[{"line_number":267,"context_line":"        thread.start()"},{"line_number":268,"context_line":""},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"def thread_wait(thread):"},{"line_number":271,"context_line":"    \"\"\"Wait for a thread to finish."},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"    :param thread: The thread to wait for."}],"source_content_type":"text/x-python","patch_set":6,"id":"fe533083_502b6106","line":270,"in_reply_to":"2942adbe_f428481d","updated":"2025-11-19 11:31:15.000000000","message":"passthough excpeption propagation is what we expect in this case.","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"96f2cc3b8dc47ff18475e364e289740a2d87c33a","unresolved":false,"context_lines":[{"line_number":273,"context_line":"    :param thread: The thread to wait for."},{"line_number":274,"context_line":"    :return: The result of thread execution (for InlineThread/eventlet)."},{"line_number":275,"context_line":"    \"\"\""},{"line_number":276,"context_line":"    if isinstance(thread, eventlet.greenthread.GreenThread | InlineThread):"},{"line_number":277,"context_line":"        return thread.wait()"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"4b506ee3_0fb89e5b","line":276,"range":{"start_line":276,"start_character":25,"end_line":276,"end_character":74},"updated":"2025-11-19 11:31:15.000000000","message":"oh fancy. i think this was new in 3.10","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5a6d52ee11b31952e50fba552ddfe788a76fd2e9","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        self.result \u003d None"},{"line_number":216,"context_line":"        self.exception \u003d None"},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"    def start(self):"},{"line_number":219,"context_line":"        \"\"\"Execute the function synchronously in the current thread."},{"line_number":220,"context_line":""},{"line_number":221,"context_line":"        Exceptions are caught and stored to be re-raised in wait(),"},{"line_number":222,"context_line":"        mimicking the behavior of actual threads where exceptions occur"},{"line_number":223,"context_line":"        in the background and are retrieved when joining/waiting."},{"line_number":224,"context_line":"        \"\"\""},{"line_number":225,"context_line":"        try:"},{"line_number":226,"context_line":"            self.result \u003d self.func(*self.args, **self.kwargs)"},{"line_number":227,"context_line":"            self.exception \u003d None"},{"line_number":228,"context_line":"        except Exception as e:"},{"line_number":229,"context_line":"            self.result \u003d None"},{"line_number":230,"context_line":"            self.exception \u003d e"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def wait(self):"},{"line_number":233,"context_line":"        \"\"\"Return the result of execution."},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"        If an exception occurred during execution, it is re-raised here,"},{"line_number":236,"context_line":"        mimicking the behavior of thread.join() which allows exceptions"},{"line_number":237,"context_line":"        from background threads to be handled by the caller."},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        :return: The result of the function execution."},{"line_number":240,"context_line":"        :raises: Any exception that occurred during execution."},{"line_number":241,"context_line":"        \"\"\""},{"line_number":242,"context_line":"        if self.exception is not None:"},{"line_number":243,"context_line":"            raise self.exception"},{"line_number":244,"context_line":"        return self.result"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":""},{"line_number":247,"context_line":"def thread_spawn(func, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":7,"id":"e6a39b98_eb53cb10","line":244,"range":{"start_line":218,"start_character":4,"end_line":244,"end_character":26},"updated":"2025-11-28 17:41:09.000000000","message":"by the way we had a chooice of an eger inlien thread which this is\nor a lazy one\n\nthe only deta is if we execute the function when start is called\nor only when we wait on it.\n\nthere are pros and cons to either approch so this is the version.","commit_id":"6f75b90fd9c0edf195d1963c209b076575f0822a"}],"watcher/tests/applier/workflow_engine/test_taskflow_action_container.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e1e2a609f98b40cad3088d711624f60daf727c34","unresolved":false,"context_lines":[{"line_number":180,"context_line":"            self.engine.context, action.uuid)"},{"line_number":181,"context_line":"        self.assertEqual(obj_action.state, objects.action.State.FAILED)"},{"line_number":182,"context_line":"        self.assertEqual("},{"line_number":183,"context_line":"            obj_action.status_message,"},{"line_number":184,"context_line":"            \"Action failed in post_condition: Failed in post_condition\")"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    @mock.patch.object(utils, \u0027thread_kill\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1d50eb27_e2669674","line":183,"in_reply_to":"c0153e2d_4fd93507","updated":"2025-11-18 16:04:05.000000000","message":"\u003e Test mock inconsistency for cancel action plan test\n\u003e \n\u003e **Severity**: WARNING | **Confidence**: 0.8\n\u003e \n\u003e **Impact**: Test may not accurately verify thread killing behavior in both eventlet and threading modes\n\u003e \n\u003e **Suggestion**:\n\u003e Add separate test cases for eventlet and threading modes to verify proper thread handling\n\nnormally we coudl do this with test sensariso for other use cause where we need to test a an b but in this case we cant mix threaing modes in a given test run so we ahve one test that runs diffently depending on the execution envionrment.\n\nin other words yes in general to the suggestion but no in this specific case.","commit_id":"480199511046aae5085e7fe9cc1dd616f83dc740"}]}
