)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"4a3ce936dc900fdca3198295e59a08bbfcd14b0e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"8d646e1d_a51a0d6e","updated":"2025-06-10 10:15:57.000000000","message":"I\u0027ve manually tested this patch with [1] and now is working: ``launch_service`` can be called several times, as is happening in the Neutron Periodic service (that needs to call several Neutron ``PeriodicWorker``).\n\n[1]https://review.opendev.org/c/openstack/neutron/+/952117","commit_id":"ceee273b2c31bb7851bf9f87c6b12cba299148b9"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"931ae7f9179a463174db1dc688870116f6a9a495","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"f8951956_d81acac9","updated":"2025-06-13 09:42:32.000000000","message":"Hey Daniel,\n\nGood job with this patch, I think it is almost complete, I\u0027m just -1 to highlight my comment. I think we have to handle the warning a bit differently, and I think we have to deprecate this parameter now. Please see my inline comment.","commit_id":"cce09d3a0ecb976842bc01cd8de5212a0e750c10"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"1e0621124cea280082dd5ac75937fb2175306bf0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"416b32ec_c7cf4b33","updated":"2025-06-13 14:18:03.000000000","message":"LGTM\n\nTakashi\u0027s latest patch set is a good compromise to solve my previous request about handling deprecation in a different way.","commit_id":"2dc3ae3584a2e70dc5938f0ff28ba3af7ffca114"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"6073eee176c409721ef883114f782e614fb05d2b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"84b68aa7_856ec85e","updated":"2025-06-13 19:47:18.000000000","message":"The jobs errors seems legit and I think they are side effects of the changes made into our latest patch set:\n\n```\n2025-06-13 14:22:46.796851 | ubuntu-jammy | {5} oslo_service.tests.test_fixture.FixtureTestCase.test_sleep_fixture [0.003467s] ... ok\n\n2025-06-13 14:22:46.801172 | ubuntu-jammy | {6} oslo_service.tests.backend.threading.test_launcher.ProcessLauncherTestCase.test_accepts_wait_interval_and_logs_warning [0.000678s] ... FAILED\n\n2025-06-13 14:22:46.801238 | ubuntu-jammy |\n\n2025-06-13 14:22:46.801264 | ubuntu-jammy | Captured traceback:\n\n2025-06-13 14:22:46.801286 | ubuntu-jammy | ~~~~~~~~~~~~~~~~~~~\n\n2025-06-13 14:22:46.801306 | ubuntu-jammy |     Traceback (most recent call last):\n\n2025-06-13 14:22:46.801327 | ubuntu-jammy |\n\n2025-06-13 14:22:46.801347 | ubuntu-jammy |       File \"/home/zuul/src/opendev.org/openstack/oslo.service/oslo_service/tests/backend/threading/test_launcher.py\", line 50, in test_accepts_wait_interval_and_logs_warning\n\n2025-06-13 14:22:46.801369 | ubuntu-jammy |     mock_warn.assert_called_once()\n\n2025-06-13 14:22:46.801389 | ubuntu-jammy |\n\n2025-06-13 14:22:46.801409 | ubuntu-jammy |       File \"/usr/lib/python3.10/unittest/mock.py\", line 908, in assert_called_once\n\n2025-06-13 14:22:46.801429 | ubuntu-jammy |     raise AssertionError(msg)\n\n2025-06-13 14:22:46.801449 | ubuntu-jammy |\n\n2025-06-13 14:22:46.801469 | ubuntu-jammy |     AssertionError: Expected \u0027warning\u0027 to have been called once. Called 0 times.\n```","commit_id":"2dc3ae3584a2e70dc5938f0ff28ba3af7ffca114"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"e04542de65fc24d116a8e456fae322aae86a1ade","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"ff37b8ef_a096e119","updated":"2025-06-14 00:28:02.000000000","message":"recheck","commit_id":"2dc3ae3584a2e70dc5938f0ff28ba3af7ffca114"}],"oslo_service/backend/threading/service.py":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"b6d53dea40ec6f05bd0c13ce474efd9c1ace7f7c","unresolved":true,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"class ProcessLauncher:"},{"line_number":214,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027, no_fork\u003dFalse, **kwargs):"},{"line_number":215,"context_line":"        self.conf \u003d conf"},{"line_number":216,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":217,"context_line":"        self.no_fork \u003d no_fork"}],"source_content_type":"text/x-python","patch_set":4,"id":"04b6658e_0066f6ef","line":214,"range":{"start_line":214,"start_character":69,"end_line":214,"end_character":77},"updated":"2025-06-10 12:06:21.000000000","message":"Due to a various reasons listed below I think we have to improve how we accept the arg.\n* The current logic does not work in case the argument is passed as a bare arg, not kwarg.\n* This makes the interface more vague which is not ideal.\n* Also to make the interface consistent this should be placed BEFORE restart_method.\n\nWhat I\u0027d suggest is adding wait_interval\u003dNone before restart_method and shows a warning in case the value is not None.","commit_id":"ceee273b2c31bb7851bf9f87c6b12cba299148b9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"fb09165fb23f26718fa76f1374be813b0052aace","unresolved":true,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"class ProcessLauncher:"},{"line_number":214,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027, no_fork\u003dFalse, **kwargs):"},{"line_number":215,"context_line":"        self.conf \u003d conf"},{"line_number":216,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":217,"context_line":"        self.no_fork \u003d no_fork"}],"source_content_type":"text/x-python","patch_set":4,"id":"898bc58d_32714924","line":214,"range":{"start_line":214,"start_character":69,"end_line":214,"end_character":77},"in_reply_to":"04b6658e_0066f6ef","updated":"2025-06-11 06:12:28.000000000","message":"I think this ^^ could be a better implementation.","commit_id":"ceee273b2c31bb7851bf9f87c6b12cba299148b9"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"dff3efef25a80b66354c632f8c05288e16f9f087","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"class ProcessLauncher:"},{"line_number":214,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027, no_fork\u003dFalse, **kwargs):"},{"line_number":215,"context_line":"        self.conf \u003d conf"},{"line_number":216,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":217,"context_line":"        self.no_fork \u003d no_fork"}],"source_content_type":"text/x-python","patch_set":4,"id":"82b7904c_4dfa75e8","line":214,"range":{"start_line":214,"start_character":69,"end_line":214,"end_character":77},"in_reply_to":"898bc58d_32714924","updated":"2025-06-11 08:14:04.000000000","message":"Done","commit_id":"ceee273b2c31bb7851bf9f87c6b12cba299148b9"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"b6d53dea40ec6f05bd0c13ce474efd9c1ace7f7c","unresolved":true,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def launch_service(self, service, workers\u003d1):"},{"line_number":229,"context_line":"        _check_service_base(service)"},{"line_number":230,"context_line":"        self._services.append((service, workers))"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        if self.no_fork:"},{"line_number":233,"context_line":"            LOG.warning(\"no_fork\u003dTrue: running service in main process\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"63131475_b8985b75","line":230,"range":{"start_line":230,"start_character":13,"end_line":230,"end_character":22},"updated":"2025-06-10 12:06:21.000000000","message":"Can we just get rid of self.services ? This is not used anywhere else, IIUC.","commit_id":"ceee273b2c31bb7851bf9f87c6b12cba299148b9"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"970f80702497916fb00045a74adf67fd8cc518b7","unresolved":false,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def launch_service(self, service, workers\u003d1):"},{"line_number":229,"context_line":"        _check_service_base(service)"},{"line_number":230,"context_line":"        self._services.append((service, workers))"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        if self.no_fork:"},{"line_number":233,"context_line":"            LOG.warning(\"no_fork\u003dTrue: running service in main process\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"77eb3fad_0dbf9215","line":230,"range":{"start_line":230,"start_character":13,"end_line":230,"end_character":22},"in_reply_to":"053687fd_ee1a63bc","updated":"2025-06-11 09:04:36.000000000","message":"Done","commit_id":"ceee273b2c31bb7851bf9f87c6b12cba299148b9"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"cf40db8af6dcc59b342d79b137817ef0dbd4de31","unresolved":true,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def launch_service(self, service, workers\u003d1):"},{"line_number":229,"context_line":"        _check_service_base(service)"},{"line_number":230,"context_line":"        self._services.append((service, workers))"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        if self.no_fork:"},{"line_number":233,"context_line":"            LOG.warning(\"no_fork\u003dTrue: running service in main process\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"ccc57432_6f6eed0a","line":230,"range":{"start_line":230,"start_character":13,"end_line":230,"end_character":22},"in_reply_to":"63131475_b8985b75","updated":"2025-06-11 08:23:45.000000000","message":"Hey,\nThanks a lot for the feedback!\n\nAbout self._services: I totally get where you’re coming from but for now, it’s the only reliable way to support multiple launch_service() calls. Without it, we’d lose track of what’s been added, and the logic breaks when services are launched one after another.","commit_id":"ceee273b2c31bb7851bf9f87c6b12cba299148b9"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"9a084af8b2472809a4f271c52dd82c2c1aba7699","unresolved":true,"context_lines":[{"line_number":227,"context_line":""},{"line_number":228,"context_line":"    def launch_service(self, service, workers\u003d1):"},{"line_number":229,"context_line":"        _check_service_base(service)"},{"line_number":230,"context_line":"        self._services.append((service, workers))"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"        if self.no_fork:"},{"line_number":233,"context_line":"            LOG.warning(\"no_fork\u003dTrue: running service in main process\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"053687fd_ee1a63bc","line":230,"range":{"start_line":230,"start_character":13,"end_line":230,"end_character":22},"in_reply_to":"ccc57432_6f6eed0a","updated":"2025-06-11 08:46:52.000000000","message":"Hi again,\n\nYou’re right, I was clearly running low on energy. Appreciate the feedback, I will clean that up.","commit_id":"ceee273b2c31bb7851bf9f87c6b12cba299148b9"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"931ae7f9179a463174db1dc688870116f6a9a495","unresolved":true,"context_lines":[{"line_number":212,"context_line":""},{"line_number":213,"context_line":"class ProcessLauncher:"},{"line_number":214,"context_line":"    def __init__("},{"line_number":215,"context_line":"            self, conf, wait_interval\u003dNone, restart_method\u003d\u0027reload\u0027,"},{"line_number":216,"context_line":"            no_fork\u003dFalse):"},{"line_number":217,"context_line":"        self.conf \u003d conf"},{"line_number":218,"context_line":"        self.restart_method \u003d restart_method"}],"source_content_type":"text/x-python","patch_set":7,"id":"2ce263e6_de2b5f07","line":215,"range":{"start_line":215,"start_character":24,"end_line":215,"end_character":42},"updated":"2025-06-13 09:42:32.000000000","message":"I\u0027d argue that we have to deprecate it at the same that we introduce it, to:\n1. not forgot to remove it when we will remove the eventlet backend\n2. more properly inform user that it have no meaning in the threading backend\n3. be proactive with the final version of oslo.service that will be fully based on the threading backend.\n\nThis can be done by using debtcollector. We can either add it now or through a follow up, but I\u0027d prefer to deprecate it now to avoid forgetting it as we already have a full plate of additional adjustments to introduce in oslo.service.","commit_id":"cce09d3a0ecb976842bc01cd8de5212a0e750c10"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"ca0d683541df34df4aac61f0d71c06fe069800fb","unresolved":true,"context_lines":[{"line_number":212,"context_line":""},{"line_number":213,"context_line":"class ProcessLauncher:"},{"line_number":214,"context_line":"    def __init__("},{"line_number":215,"context_line":"            self, conf, wait_interval\u003dNone, restart_method\u003d\u0027reload\u0027,"},{"line_number":216,"context_line":"            no_fork\u003dFalse):"},{"line_number":217,"context_line":"        self.conf \u003d conf"},{"line_number":218,"context_line":"        self.restart_method \u003d restart_method"}],"source_content_type":"text/x-python","patch_set":7,"id":"2d3dc6d4_a1e68e61","line":215,"range":{"start_line":215,"start_character":24,"end_line":215,"end_character":42},"in_reply_to":"0a24d438_67122a3e","updated":"2025-06-13 11:26:03.000000000","message":"Note that one downside of using debtcollector.removed_kwargs is that it works only for kwargs. Because these args can be passed via not only kwargs but also args I personally prefer the current method.","commit_id":"cce09d3a0ecb976842bc01cd8de5212a0e750c10"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"5d51900365dfc677d506e0f2904a7b1bc6e86baa","unresolved":true,"context_lines":[{"line_number":212,"context_line":""},{"line_number":213,"context_line":"class ProcessLauncher:"},{"line_number":214,"context_line":"    def __init__("},{"line_number":215,"context_line":"            self, conf, wait_interval\u003dNone, restart_method\u003d\u0027reload\u0027,"},{"line_number":216,"context_line":"            no_fork\u003dFalse):"},{"line_number":217,"context_line":"        self.conf \u003d conf"},{"line_number":218,"context_line":"        self.restart_method \u003d restart_method"}],"source_content_type":"text/x-python","patch_set":7,"id":"0a24d438_67122a3e","line":215,"range":{"start_line":215,"start_character":24,"end_line":215,"end_character":42},"in_reply_to":"2ce263e6_de2b5f07","updated":"2025-06-13 11:24:51.000000000","message":"Maybe adding DeprecationWarning and also stating \"will be removed\" in the new warning message addresses you concerns ?","commit_id":"cce09d3a0ecb976842bc01cd8de5212a0e750c10"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"87e30f90a49c5662c5efb6c40c9dc009b5849238","unresolved":true,"context_lines":[{"line_number":212,"context_line":""},{"line_number":213,"context_line":"class ProcessLauncher:"},{"line_number":214,"context_line":"    def __init__("},{"line_number":215,"context_line":"            self, conf, wait_interval\u003dNone, restart_method\u003d\u0027reload\u0027,"},{"line_number":216,"context_line":"            no_fork\u003dFalse):"},{"line_number":217,"context_line":"        self.conf \u003d conf"},{"line_number":218,"context_line":"        self.restart_method \u003d restart_method"}],"source_content_type":"text/x-python","patch_set":7,"id":"87236b33_0da2a196","line":215,"range":{"start_line":215,"start_character":24,"end_line":215,"end_character":42},"in_reply_to":"2d3dc6d4_a1e68e61","updated":"2025-06-13 14:11:17.000000000","message":"Thanks for your heads up. Yes, a DeprecationWarning also stating \"will be removed\" in the new warning message will addresses my concerns, but if you think kwargs is a kind a blocker, then I\u0027m ok to simply follow the current implementation.","commit_id":"cce09d3a0ecb976842bc01cd8de5212a0e750c10"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"59b1a432152942f71bfd536fe8ab492856be81bd","unresolved":false,"context_lines":[{"line_number":212,"context_line":""},{"line_number":213,"context_line":"class ProcessLauncher:"},{"line_number":214,"context_line":"    def __init__("},{"line_number":215,"context_line":"            self, conf, wait_interval\u003dNone, restart_method\u003d\u0027reload\u0027,"},{"line_number":216,"context_line":"            no_fork\u003dFalse):"},{"line_number":217,"context_line":"        self.conf \u003d conf"},{"line_number":218,"context_line":"        self.restart_method \u003d restart_method"}],"source_content_type":"text/x-python","patch_set":7,"id":"7bc00815_8da5c429","line":215,"range":{"start_line":215,"start_character":24,"end_line":215,"end_character":42},"in_reply_to":"87236b33_0da2a196","updated":"2025-06-13 14:13:46.000000000","message":"Done","commit_id":"cce09d3a0ecb976842bc01cd8de5212a0e750c10"}]}
