)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"0e096705f070c05075f7e50204a685838b3ee73d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"437962be_b6cba1c1","updated":"2025-01-23 20:18:13.000000000","message":"recheck neutron-functional","commit_id":"d95ec92639b66c8219aa6631d5e7447c03dcc29a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"dc3548d8d6a468fe73ca56ba06b9d8c09c56bc00","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"aa21e178_026578a2","updated":"2025-01-23 22:34:42.000000000","message":"test_async_process_respawns_with_race_condition functional test failed, which was just added here","commit_id":"d95ec92639b66c8219aa6631d5e7447c03dcc29a"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"56d229efb6e1859b074bc905f2f42dd316fd9cac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"d44d593c_869bed77","updated":"2025-01-26 21:04:00.000000000","message":"recheck timeout","commit_id":"47aafc79809f30022e17957d0a5f8e07285d2393"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"4e73c30d28489340057e1edf1a33ecde0eb8debb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"2d7ba099_8c6845ef","updated":"2025-01-24 18:12:26.000000000","message":"recheck unrelated","commit_id":"47aafc79809f30022e17957d0a5f8e07285d2393"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"dd8024daa062488674f94f5d6ae04d52e4e93f14","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"8b6a0a32_48925774","updated":"2025-01-27 16:20:50.000000000","message":"Let\u0027s merge this and continue debugging the issue Yatin cited","commit_id":"f29b2d3a7a0b6ea93eff73959d6e959d51833677"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"44edd693af0f566d2fa3e49cb7547f0915419a9d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"1ed55f79_cf8c07b6","updated":"2025-01-27 13:55:09.000000000","message":"i hoped it will fix the issue with this test but still hitting in test patch https://zuul.opendev.org/t/openstack/buildset/92ae27c86d4644029efaff17ce0b0e81 Sahid can you check that?","commit_id":"f29b2d3a7a0b6ea93eff73959d6e959d51833677"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"ef24fb97452fac099ca9bce386564451a770bf7a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"a90c932f_296845bc","updated":"2025-01-27 20:00:14.000000000","message":"recheck neutron-fullstack","commit_id":"f29b2d3a7a0b6ea93eff73959d6e959d51833677"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"e360b70aaf21eb4d01f08529619d5d1cfde94a9f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"194df41f_f6d97046","updated":"2025-01-28 12:31:15.000000000","message":"recheck test_ha_router_failover_graceful","commit_id":"f29b2d3a7a0b6ea93eff73959d6e959d51833677"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"7aebe6dd024d4e809ca54f4d121ea3e21e03a2bd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"95361be7_ca71f7f5","updated":"2025-01-28 07:37:49.000000000","message":"recheck timeout ovn","commit_id":"f29b2d3a7a0b6ea93eff73959d6e959d51833677"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"336adcd02e3ebe4ac096948695ab5f92b7f29e2e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"f1ebfe93_130f3150","in_reply_to":"1ed55f79_cf8c07b6","updated":"2025-01-27 14:17:40.000000000","message":"Yatin, can you give me more context?","commit_id":"f29b2d3a7a0b6ea93eff73959d6e959d51833677"},{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"682231b88e4b58790802c8ed076ccef49e4d960a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"a314e338_daa0cd61","in_reply_to":"f1ebfe93_130f3150","updated":"2025-01-27 14:27:19.000000000","message":"Sahid we seeing random failures in this test from some time https://bugs.launchpad.net/neutron/+bug/2095598","commit_id":"f29b2d3a7a0b6ea93eff73959d6e959d51833677"}],"neutron/agent/common/async_process.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f7f3a2758ab411e60e8d77a3f11073a839598e6f","unresolved":true,"context_lines":[{"line_number":261,"context_line":"                pass"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    def _watch_process(self, callback, kill_event, thread_exit_event):"},{"line_number":264,"context_line":"        try:"},{"line_number":265,"context_line":"            while not kill_event.ready() or not thread_exit_event.ready():"},{"line_number":266,"context_line":"                try:"},{"line_number":267,"context_line":"                    output \u003d callback()"}],"source_content_type":"text/x-python","patch_set":3,"id":"bfbe4868_abda259b","line":264,"range":{"start_line":264,"start_character":8,"end_line":264,"end_character":12},"updated":"2025-01-21 08:04:04.000000000","message":"Why is this try/finally context needed? You need to check ``thread_exit_event`` in L280, not ``self._is_running``. And ``thread_exit_event.send()`` must be called after checking it.\n\n[1]https://review.opendev.org/c/openstack/neutron/+/939348/comment/d272208e_7a28cb10/","commit_id":"37bc09b2d3c0e01474325d7d61986f8499b0c325"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e410260b688a26c101077a7937a0a847388fcba7","unresolved":false,"context_lines":[{"line_number":261,"context_line":"                pass"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    def _watch_process(self, callback, kill_event, thread_exit_event):"},{"line_number":264,"context_line":"        try:"},{"line_number":265,"context_line":"            while not kill_event.ready() or not thread_exit_event.ready():"},{"line_number":266,"context_line":"                try:"},{"line_number":267,"context_line":"                    output \u003d callback()"}],"source_content_type":"text/x-python","patch_set":3,"id":"53a3574c_d9ceeb4d","line":264,"range":{"start_line":264,"start_character":8,"end_line":264,"end_character":12},"in_reply_to":"0140806b_f56f1009","updated":"2025-01-23 15:49:25.000000000","message":"Done","commit_id":"37bc09b2d3c0e01474325d7d61986f8499b0c325"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"25e172943159ce33996f19cbba1ec5bd18c473f2","unresolved":true,"context_lines":[{"line_number":261,"context_line":"                pass"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    def _watch_process(self, callback, kill_event, thread_exit_event):"},{"line_number":264,"context_line":"        try:"},{"line_number":265,"context_line":"            while not kill_event.ready() or not thread_exit_event.ready():"},{"line_number":266,"context_line":"                try:"},{"line_number":267,"context_line":"                    output \u003d callback()"}],"source_content_type":"text/x-python","patch_set":3,"id":"0140806b_f56f1009","line":264,"range":{"start_line":264,"start_character":8,"end_line":264,"end_character":12},"in_reply_to":"36ee71b6_aa010229","updated":"2025-01-21 13:46:55.000000000","message":"Yes you are right, thank you.","commit_id":"37bc09b2d3c0e01474325d7d61986f8499b0c325"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8e01b808d7318a84138ea945c6f04c5d1632f4d5","unresolved":true,"context_lines":[{"line_number":261,"context_line":"                pass"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    def _watch_process(self, callback, kill_event, thread_exit_event):"},{"line_number":264,"context_line":"        try:"},{"line_number":265,"context_line":"            while not kill_event.ready() or not thread_exit_event.ready():"},{"line_number":266,"context_line":"                try:"},{"line_number":267,"context_line":"                    output \u003d callback()"}],"source_content_type":"text/x-python","patch_set":3,"id":"36ee71b6_aa010229","line":264,"range":{"start_line":264,"start_character":8,"end_line":264,"end_character":12},"in_reply_to":"6a7b66b5_5e7abc1e","updated":"2025-01-21 10:05:13.000000000","message":"Yes, the first thread exiting will execute ``_handle_process_error`` without signalling thread_exit_event. This is just the opposite of the purpose of this signal. Also this signal is actually the one to be used in https://review.opendev.org/c/openstack/neutron/+/939627/3/neutron/agent/common/async_process.py#280, not ``if self._is_running``, that is a common variable for all threads. This implementation is wrong.","commit_id":"37bc09b2d3c0e01474325d7d61986f8499b0c325"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"f0f0c5470c9cd8cc28a714a8c2979617a681a159","unresolved":true,"context_lines":[{"line_number":261,"context_line":"                pass"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"    def _watch_process(self, callback, kill_event, thread_exit_event):"},{"line_number":264,"context_line":"        try:"},{"line_number":265,"context_line":"            while not kill_event.ready() or not thread_exit_event.ready():"},{"line_number":266,"context_line":"                try:"},{"line_number":267,"context_line":"                    output \u003d callback()"}],"source_content_type":"text/x-python","patch_set":3,"id":"6a7b66b5_5e7abc1e","line":264,"range":{"start_line":264,"start_character":8,"end_line":264,"end_character":12},"in_reply_to":"bfbe4868_abda259b","updated":"2025-01-21 09:20:36.000000000","message":"Looks like a correct separation to ensure that we notify other thread that we exit the loop. In that way I don\u0027t touch the current algorithm that handles the main process running state.\n\nDo you see an issue with it?","commit_id":"37bc09b2d3c0e01474325d7d61986f8499b0c325"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"9bef7f282ec7e81eb84b6cf33734108c709e744a","unresolved":true,"context_lines":[{"line_number":281,"context_line":"            # self._is_running being True indicates that the loop was"},{"line_number":282,"context_line":"            # broken out of due to an error in the watched process"},{"line_number":283,"context_line":"            # rather than the loop condition being satisfied."},{"line_number":284,"context_line":"            if self._is_running:"},{"line_number":285,"context_line":"                self._is_running \u003d False"},{"line_number":286,"context_line":"                self._handle_process_error()"},{"line_number":287,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"d78eda81_53bcb8b3","line":284,"range":{"start_line":284,"start_character":12,"end_line":284,"end_character":32},"updated":"2025-01-22 07:48:35.000000000","message":"I\u0027ll comment that again: this variable must not be used to access or not to the execution of ``_handle_process_error``, only the local ``thread_exit_event``. This variable must be set to False to set the process as down, but once inside this branch, you need to execute always ``_handle_process_error`` to stop the process. The second thread won\u0027t access inside this branch.","commit_id":"c5129470dcc8e69135894226dab0a2c59a7d3e31"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"e410260b688a26c101077a7937a0a847388fcba7","unresolved":false,"context_lines":[{"line_number":281,"context_line":"            # self._is_running being True indicates that the loop was"},{"line_number":282,"context_line":"            # broken out of due to an error in the watched process"},{"line_number":283,"context_line":"            # rather than the loop condition being satisfied."},{"line_number":284,"context_line":"            if self._is_running:"},{"line_number":285,"context_line":"                self._is_running \u003d False"},{"line_number":286,"context_line":"                self._handle_process_error()"},{"line_number":287,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"93161845_f3e15a2e","line":284,"range":{"start_line":284,"start_character":12,"end_line":284,"end_character":32},"in_reply_to":"5d7a1653_5f4cf43b","updated":"2025-01-23 15:49:25.000000000","message":"Right, that\u0027s correct.","commit_id":"c5129470dcc8e69135894226dab0a2c59a7d3e31"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"6554faf8e434a353a5ff48d97a71654c4d8c9991","unresolved":true,"context_lines":[{"line_number":281,"context_line":"            # self._is_running being True indicates that the loop was"},{"line_number":282,"context_line":"            # broken out of due to an error in the watched process"},{"line_number":283,"context_line":"            # rather than the loop condition being satisfied."},{"line_number":284,"context_line":"            if self._is_running:"},{"line_number":285,"context_line":"                self._is_running \u003d False"},{"line_number":286,"context_line":"                self._handle_process_error()"},{"line_number":287,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5d7a1653_5f4cf43b","line":284,"range":{"start_line":284,"start_character":12,"end_line":284,"end_character":32},"in_reply_to":"d78eda81_53bcb8b3","updated":"2025-01-22 08:09:09.000000000","message":"In the case that the threads get killed in a legitimate way via stop() My understanding based on code/comments is that we don\u0027t want to go through `_handle_process_error()` from any of the watchers threads, as we don\u0027t want to respawn it.","commit_id":"c5129470dcc8e69135894226dab0a2c59a7d3e31"}],"neutron/tests/functional/agent/linux/test_async_process.py":[{"author":{"_account_id":13861,"name":"yatin","email":"ykarel@redhat.com","username":"yatinkarel"},"change_message_id":"35dec64f9c91a7179b425e24a8bec2e13e8619ed","unresolved":true,"context_lines":[{"line_number":81,"context_line":"            exception\u003dRuntimeError(_(\"Async process didn\u0027t respawn\")))"},{"line_number":82,"context_line":"        self._check_stdout(proc)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def test_async_process_respawns_with_race_condition(self):"},{"line_number":85,"context_line":"        original_sleep \u003d eventlet.sleep"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        with mock.patch("}],"source_content_type":"text/x-python","patch_set":8,"id":"25a81419_c028fdf0","line":84,"range":{"start_line":84,"start_character":8,"end_line":84,"end_character":55},"updated":"2025-02-03 14:38:33.000000000","message":"this new test is unstable, see https://bugs.launchpad.net/neutron/+bug/2097284","commit_id":"f29b2d3a7a0b6ea93eff73959d6e959d51833677"}]}
