)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"caf702b9a90df41fcbebe05ee49a72cf2541e066","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Daniel Bengtsson \u003cdbengt@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-01-23 17:23:22 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Refactor service.py to use spawn-safe pools and register graceful_shutdown_timeout"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates backend/_threading/service.py to use the new"},{"line_number":10,"context_line":"spawn-safe multiprocessing helpers from oslo_service._multiprocessing."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"403cc5f1_b1dde6eb","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":22},"updated":"2026-01-28 14:46:58.000000000","message":"(nit) Could you try describing why you need this change (like \"use spawn-safe pools in launchers) instead of describing what you changed ?","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"a4011dbee6104384050c0f332e0cd21300468d5d","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Daniel Bengtsson \u003cdbengt@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-01-23 17:23:22 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Refactor service.py to use spawn-safe pools and register graceful_shutdown_timeout"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates backend/_threading/service.py to use the new"},{"line_number":10,"context_line":"spawn-safe multiprocessing helpers from oslo_service._multiprocessing."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"606dfce2_7d5d5fa4","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":22},"in_reply_to":"2f38a63d_7c16a351","updated":"2026-01-29 14:39:51.000000000","message":"Done","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3c6942b43e4fa21648ad00318f649bec9e0d7009","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Daniel Bengtsson \u003cdbengt@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-01-23 17:23:22 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Refactor service.py to use spawn-safe pools and register graceful_shutdown_timeout"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch updates backend/_threading/service.py to use the new"},{"line_number":10,"context_line":"spawn-safe multiprocessing helpers from oslo_service._multiprocessing."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"2f38a63d_7c16a351","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":22},"in_reply_to":"403cc5f1_b1dde6eb","updated":"2026-01-29 13:31:30.000000000","message":"+1","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"c4f77514549f67ae5465e4dc5a513a166dfda97c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"6620ffe0_a6105083","updated":"2025-11-03 14:05:18.000000000","message":"recheck","commit_id":"46aeade081ddde6b31107367890f8817304861cb"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"da87beaabf97a65192e9638fd272b2565a8ed4e3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"c76f9316_42e637c0","updated":"2025-11-05 14:26:26.000000000","message":"recheck","commit_id":"46aeade081ddde6b31107367890f8817304861cb"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"2f5c8247daf744ba00e1dc06e3efe3531c2d1f5e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"e59e0758_6f241281","updated":"2025-12-11 16:55:26.000000000","message":"Rebased on master to eliminate the merge conflict so we can use this in testing cinder changes.  Removed the dependency, which has merged.","commit_id":"9f723aa8dd2c0a7a383a64df060324e7da206f71"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"18a903e996d7f99178a9e0ca3d0c1b3adf5aac53","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"f5a69849_59fd7fa6","updated":"2026-01-14 14:50:42.000000000","message":"@gmaan@ghanshyammann.com this might be interesting to you as well for the fork/spawn investigation","commit_id":"fc2b4145899b77a9762bcd07f217268b4d57aba2"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"0a07b363eba743b32925d2e6eee1bb4b2ed0aba9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"642ebe13_47d72a93","updated":"2026-01-21 09:10:56.000000000","message":"This new patch set LGTM.\n\nCotyledon has been adapted to context, and its adaption has been released through 2.2.0. OpenStack requirements are bumped, and this patch use the latest version of Cotyledon.\n\nThe main change on the Cotyledon side were the addition of the `graceful_shutdown_timeout` and of the `context` recognition and this patch is the logical continuation to align oslo.service with the new API of Cotyledon.\n\nI think puzzled me, I cannot find trace of `multiprocessing.reduction` and of `ForkingPickler` into the CPython documentation https://docs.python.org/3/search.html?q\u003dForkingPickler . Either this module is not documented or I missed something. In all the case this module is available in the code base https://github.com/python/cpython/blob/9060b4abbe475591b6230b23c2afefeff26fcca5/Lib/multiprocessing/reduction.py#L33\n\nI was also able to test its import locally in my REPL:\n\n```\n$ python\nPython 3.14.2 (main, Dec  5 2025, 00:00:00) [GCC 15.2.1 20251111 (Red Hat 15.2.1-4)] on linux\nType \"help\", \"copyright\", \"credits\" or \"license\" for more information.\n\u003e\u003e\u003e from multiprocessing.reduction import ForkingPickler\n\u003e\u003e\u003e dir(ForkingPickler)\n[\u0027__class__\u0027, \u0027__delattr__\u0027, \u0027__dict__\u0027, \u0027__dir__\u0027, \u0027__doc__\u0027, \u0027__eq__\u0027, \u0027__firstlineno__\u0027, \u0027__format__\u0027, \u0027__ge__\u0027, \u0027__getattribute__\u0027, \u0027__getstate__\u0027, \u0027__gt__\u0027, \u0027__hash__\u0027, \u0027__init__\u0027, \u0027__init_subclass__\u0027, \u0027__le__\u0027, \u0027__lt__\u0027, \u0027__module__\u0027, \u0027__ne__\u0027, \u0027__new__\u0027, \u0027__reduce__\u0027, \u0027__reduce_ex__\u0027, \u0027__repr__\u0027, \u0027__setattr__\u0027, \u0027__sizeof__\u0027, \u0027__static_attributes__\u0027, \u0027__str__\u0027, \u0027__subclasshook__\u0027, \u0027__weakref__\u0027, \u0027_copyreg_dispatch_table\u0027, \u0027_extra_reducers\u0027, \u0027bin\u0027, \u0027clear_memo\u0027, \u0027dispatch_table\u0027, \u0027dump\u0027, \u0027dumps\u0027, \u0027fast\u0027, \u0027loads\u0027, \u0027memo\u0027, \u0027persistent_id\u0027, \u0027register\u0027]\n\u003e\u003e\u003e \n```","commit_id":"99345660f0294633e33f67d32a12fdf02cf27ca7"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"1e019ae853b67521275e30eb104349e9dd91ebad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"9534345f_fc8a7b10","in_reply_to":"642ebe13_47d72a93","updated":"2026-01-21 09:11:52.000000000","message":"s/I think puzzled me/One thing puzzled me/","commit_id":"99345660f0294633e33f67d32a12fdf02cf27ca7"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ae9ffa52e7a827ed87c04e848ea8a483cf8db7ae","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"c8269eb2_ad3b87aa","updated":"2026-01-21 17:13:15.000000000","message":"Thanks for working on this. overall lgtm, I am ok if you want to handle the graceful_shutdown_timeout  in this change but let\u0027s do registration of config option in oslo.service itself. Or you can rebase it on top of my change. Either way is ok for me.","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"1356ebe8872fe0ff278c3fcd2579591199e82bd0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":18,"id":"c25274a4_3fafdca2","updated":"2026-01-22 18:33:23.000000000","message":"thanks for squashing the graceful_shutdown_timeout in this and I abandon mine - https://review.opendev.org/c/openstack/oslo.service/+/965208\n\nthis lgtm, 2 more comment and rest all looks perfec to me.","commit_id":"834e16ddd0e1e7407fc9286dcf0688cca4038c19"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"2af3edebe2ca442e0042639f61068e9e8c753f74","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":19,"id":"a62c1670_8d19e0f1","updated":"2026-01-22 21:37:43.000000000","message":"I rebased it to solve the merge conflict due to 974266 but my comment on PS18 stay same. not fixed those and let Daniel check those.","commit_id":"a572997aeb98ac974f6f8f10958b12656bf56849"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"7ac1ae9a57f68801779165d161cd349d79e43acf","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":21,"id":"ca6a7ad3_520c6776","updated":"2026-01-28 15:04:14.000000000","message":"Also, please update lower bound of cotyledon in pyproject.toml so that the new link interface is available.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"8388bed96072e30fee11e8e27f20d8a6bdcbb264","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"1d15b7b1_2c2edfd9","updated":"2026-01-28 14:44:41.000000000","message":"I\u0027m afraid you are using a wrong method to register shutdown_timeout option. IIUC You should call the one from cotyledon instead (cotyledon.oslo_config_glue.register_opts)","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"b89cc80bf1661a245e15c7ed0df60aba8e5a50b3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"c9c26f80_14fddc5e","updated":"2026-01-27 08:26:16.000000000","message":"LGTM, thanks","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3718a6b3ccebc62171563b63915cb3b262529607","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"08943b1a_faf0a73f","updated":"2026-01-23 17:29:18.000000000","message":"thanks for updates and working on it. this lgtm now.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"79846afa5d7c3d4f6caa1cecd1c42693c9861774","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"dd9abcad_8bdf5538","in_reply_to":"ca6a7ad3_520c6776","updated":"2026-01-28 15:05:26.000000000","message":"Sorry I somehow overlooked the fact that this is already done.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"c92563acdb95949690f4a3307c406d071dff3533","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"69faa84b_7b931a93","updated":"2026-02-02 09:38:57.000000000","message":"Hi,\n\nWould it make sense to merge this change now, and continue the remaining discussion about oslo_config_glue in Takashi’s follow-up patch?","commit_id":"39adcef74dc6c0c64b9a9c465dc24bc094cc707c"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"1f68705076a94814f7bf024b359048d98e213feb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"d75cc41d_8b71ebc1","updated":"2026-02-02 09:31:00.000000000","message":"The current version LGTM, and as a follow up patch has been created to redesign the config glue topic, I think we can merge this patch and continue the discussion on https://review.opendev.org/c/openstack/oslo.service/+/975357","commit_id":"39adcef74dc6c0c64b9a9c465dc24bc094cc707c"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"5f2e0e2febf517200c21482c23d3dd23e801032f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"8ea07afb_dba99050","updated":"2026-01-30 18:44:45.000000000","message":"lgtm, thanks","commit_id":"39adcef74dc6c0c64b9a9c465dc24bc094cc707c"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"958e8591be740b173fc08653960c62f45f437e3b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"b5dc5d49_38f7e02f","in_reply_to":"69faa84b_7b931a93","updated":"2026-02-02 17:09:59.000000000","message":"Honestly I personally prefer getting more clear agreement about that elimination patch, to make sure we are not stuck in the middle, so am hesitant to vote +A from my end (given the amount of follow-ups we have needed for the whole threading work). However other cores think this is ready and needs to be merged asap to unblock some other works then I\u0027ll leave it to them.","commit_id":"39adcef74dc6c0c64b9a9c465dc24bc094cc707c"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"0fd14da75b52c610a4c3a9c591a839c087559e9e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"b74b61a1_b2365a60","in_reply_to":"a77f76d5_a53335ef","updated":"2026-02-03 01:15:06.000000000","message":"I\u0027m not saying that\u0027s blocking. I said that anyone else from the core can merge this.\nAnyway I\u0027ll add +A now if people are eager to have this one as soon as possible.","commit_id":"39adcef74dc6c0c64b9a9c465dc24bc094cc707c"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"97bf751e4e6c961501bde001aaba40312df1aa74","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"a77f76d5_a53335ef","in_reply_to":"b5dc5d49_38f7e02f","updated":"2026-02-02 18:33:27.000000000","message":"Thanks for replacing the oslo_config_glue but I still did not understand why that is blocker for this change? and also holding the signal handler implementation for no_fork case - https://review.opendev.org/c/openstack/oslo.service/+/974024/7","commit_id":"39adcef74dc6c0c64b9a9c465dc24bc094cc707c"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d3f18875a4dfbea3496e6dab796ffe7f7b07e460","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"2a6144e9_d9e59ed3","in_reply_to":"b74b61a1_b2365a60","updated":"2026-02-03 02:54:32.000000000","message":"Thanks.","commit_id":"39adcef74dc6c0c64b9a9c465dc24bc094cc707c"}],"oslo_service/backend/_threading/service.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"713a191a7d7ce14be08ab8d6ef4065678df16619","unresolved":true,"context_lines":[{"line_number":23,"context_line":"import cotyledon"},{"line_number":24,"context_line":"from cotyledon import oslo_config_glue"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# Spawn-safe multiprocessing helpers (introduced by OSPRH-17937)"},{"line_number":27,"context_line":"from oslo_service._multiprocessing import get_spawn_context"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from oslo_service._i18n import _"}],"source_content_type":"text/x-python","patch_set":2,"id":"2b4ec2c2_4579bf31","line":26,"updated":"2025-10-30 14:30:54.000000000","message":"Can we keep launchpad bug references instead. The OSPRH link is a RH specific bug tracker not the upstream bug tracker","commit_id":"fb6a0d92724c676a45805792189109fb2de410a5"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"5858cb998b55f6a86506c095ca0c8d293a7af8f8","unresolved":false,"context_lines":[{"line_number":23,"context_line":"import cotyledon"},{"line_number":24,"context_line":"from cotyledon import oslo_config_glue"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# Spawn-safe multiprocessing helpers (introduced by OSPRH-17937)"},{"line_number":27,"context_line":"from oslo_service._multiprocessing import get_spawn_context"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from oslo_service._i18n import _"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa5219eb_adc4def2","line":26,"in_reply_to":"13c83676_03d62b70","updated":"2025-10-31 11:00:27.000000000","message":"Done","commit_id":"fb6a0d92724c676a45805792189109fb2de410a5"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"71a4225fcdb92c0cdf548d7e1e1d00315d0bb1fc","unresolved":true,"context_lines":[{"line_number":23,"context_line":"import cotyledon"},{"line_number":24,"context_line":"from cotyledon import oslo_config_glue"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"# Spawn-safe multiprocessing helpers (introduced by OSPRH-17937)"},{"line_number":27,"context_line":"from oslo_service._multiprocessing import get_spawn_context"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from oslo_service._i18n import _"}],"source_content_type":"text/x-python","patch_set":2,"id":"13c83676_03d62b70","line":26,"in_reply_to":"2b4ec2c2_4579bf31","updated":"2025-10-30 15:20:26.000000000","message":"Hi Gibi,\n\nthanks a lot for your comment!\nThe Jira ticket is public, we used it mainly to avoid duplicating work.\nI believe it can remain the main reference for now, as it’s accessible to everyone not only Red Hat employees.","commit_id":"fb6a0d92724c676a45805792189109fb2de410a5"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"f88462c9d703f3387f11ab26607a8028359b28c0","unresolved":true,"context_lines":[{"line_number":252,"context_line":"        self._manager \u003d None"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        # Initialize spawn-safe multiprocessing context"},{"line_number":255,"context_line":"        self.spawn_ctx \u003d get_spawn_context()"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if wait_interval is not None:"},{"line_number":258,"context_line":"            warnings.warn("}],"source_content_type":"text/x-python","patch_set":3,"id":"c034c2d8_f94cc749","line":255,"range":{"start_line":255,"start_character":8,"end_line":255,"end_character":44},"updated":"2025-11-06 09:33:03.000000000","message":"I think there is a bunch of problem here:\n- actually, in your chain of patches, there is no way to set the start method (see my comment in your parent patch) (this problem could be a false positive due to my lack of proper understanding of the stdlib doc);\n- `self.spawn_ctx` is initialized but it is never used or passed e.g [1]\n- AFAIKS there is no way to pass the context to cotyledon, so, I think cotyledon might require some adjustments to be able to handle the context properly.\n\n[1]\n```\nfrom multiprocessing import get_context\n\ndef your_func():\n    with get_context(\"spawn\").Pool() as pool:\n```","commit_id":"46aeade081ddde6b31107367890f8817304861cb"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"e762a549affdee358716fc5268b1127cb06cbfd2","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        self._manager \u003d None"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        # Initialize spawn-safe multiprocessing context"},{"line_number":255,"context_line":"        self.spawn_ctx \u003d get_spawn_context()"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if wait_interval is not None:"},{"line_number":258,"context_line":"            warnings.warn("}],"source_content_type":"text/x-python","patch_set":3,"id":"0e5b7f2d_79f00408","line":255,"range":{"start_line":255,"start_character":8,"end_line":255,"end_character":44},"in_reply_to":"3e045734_45ad240f","updated":"2026-01-14 19:06:55.000000000","message":"Done","commit_id":"46aeade081ddde6b31107367890f8817304861cb"},{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"3e37b2a400c6ad404c7cfa453d73ba8e0a987504","unresolved":true,"context_lines":[{"line_number":252,"context_line":"        self._manager \u003d None"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        # Initialize spawn-safe multiprocessing context"},{"line_number":255,"context_line":"        self.spawn_ctx \u003d get_spawn_context()"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if wait_interval is not None:"},{"line_number":258,"context_line":"            warnings.warn("}],"source_content_type":"text/x-python","patch_set":3,"id":"972a4bf9_f87d3a7f","line":255,"range":{"start_line":255,"start_character":8,"end_line":255,"end_character":44},"in_reply_to":"90caca94_7a9beff3","updated":"2025-11-12 13:05:21.000000000","message":"So, IMO, the cotyledon patch should be the first step here. \n\nHave you already proposed one? Last week, when I made my previous comment, I digged a bit into the cotyledon PRs, and I found no related patches.","commit_id":"46aeade081ddde6b31107367890f8817304861cb"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"d63387b9caf56c46cab567e4d1beb467af86ff42","unresolved":true,"context_lines":[{"line_number":252,"context_line":"        self._manager \u003d None"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        # Initialize spawn-safe multiprocessing context"},{"line_number":255,"context_line":"        self.spawn_ctx \u003d get_spawn_context()"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if wait_interval is not None:"},{"line_number":258,"context_line":"            warnings.warn("}],"source_content_type":"text/x-python","patch_set":3,"id":"3e045734_45ad240f","line":255,"range":{"start_line":255,"start_character":8,"end_line":255,"end_character":44},"in_reply_to":"972a4bf9_f87d3a7f","updated":"2025-11-17 12:00:07.000000000","message":"Good point. I initially planned to handle the cotyledon part after this patch, but you\u0027re right that it should come first.\nI\u0027ve now submitted a cotyledon patch[1] adding support for custom multiprocessing contexts. After it is merged, I\u0027ll update this change accordingly.\n\n[1] https://github.com/sileht/cotyledon/pull/84","commit_id":"46aeade081ddde6b31107367890f8817304861cb"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"e4edeb72bb56ec5149db1bbf525063ca506d36de","unresolved":true,"context_lines":[{"line_number":252,"context_line":"        self._manager \u003d None"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        # Initialize spawn-safe multiprocessing context"},{"line_number":255,"context_line":"        self.spawn_ctx \u003d get_spawn_context()"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if wait_interval is not None:"},{"line_number":258,"context_line":"            warnings.warn("}],"source_content_type":"text/x-python","patch_set":3,"id":"90caca94_7a9beff3","line":255,"range":{"start_line":255,"start_character":8,"end_line":255,"end_character":44},"in_reply_to":"c034c2d8_f94cc749","updated":"2025-11-07 13:26:35.000000000","message":"Thanks a lot Hervé for good points.\nRegarding set_start_method(), we intentionally don’t call it:\nget_context(\u0027spawn\u0027) already returns a local, spawn-safe context without touching the global multiprocessing configuration (as mentioned in the stdlib docs).\nThe spawn_ctx initialization here is a preparatory step — it will be used in the next patches where the process respawn logic is updated.\nFor cotyledon, you’re right it doesn’t yet expose a way to inject a context, that’s planned as a follow-up integration step once the helpers are in place.","commit_id":"46aeade081ddde6b31107367890f8817304861cb"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"e60fe5ffaa42118edea86202f106e0d7f31c5460","unresolved":true,"context_lines":[{"line_number":202,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":203,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":204,"context_line":"                mp_context\u003dself._manager_context,"},{"line_number":205,"context_line":"                graceful_shutdown_timeout\u003dself.conf.graceful_shutdown_timeout)"},{"line_number":206,"context_line":"            oslo_config_glue.link("},{"line_number":207,"context_line":"                self._manager, self.conf,"},{"line_number":208,"context_line":"                reload_method\u003dself.restart_method,"}],"source_content_type":"text/x-python","patch_set":14,"id":"ee6cc1bd_e111b6da","line":205,"range":{"start_line":205,"start_character":16,"end_line":205,"end_character":77},"updated":"2026-01-21 12:03:50.000000000","message":"Isn\u0027t this done by the link method called below ?","commit_id":"5fc12355ef9447d2cd6bfacd86833e18b2ac1cd4"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"acd58af7d77d02b6af5426b71c1f8c3d001b4beb","unresolved":false,"context_lines":[{"line_number":202,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":203,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":204,"context_line":"                mp_context\u003dself._manager_context,"},{"line_number":205,"context_line":"                graceful_shutdown_timeout\u003dself.conf.graceful_shutdown_timeout)"},{"line_number":206,"context_line":"            oslo_config_glue.link("},{"line_number":207,"context_line":"                self._manager, self.conf,"},{"line_number":208,"context_line":"                reload_method\u003dself.restart_method,"}],"source_content_type":"text/x-python","patch_set":14,"id":"81607005_93821979","line":205,"range":{"start_line":205,"start_character":16,"end_line":205,"end_character":77},"in_reply_to":"5233450b_32f11a57","updated":"2026-01-21 17:18:18.000000000","message":"That is the issue. We should not hide thinks under the oslo_config_glue and pass the things we need as explicit in __init__ so that we would not be surprise if oslo_config_glue remove it or change.","commit_id":"5fc12355ef9447d2cd6bfacd86833e18b2ac1cd4"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"3b672432bfdd73b271ae8a5c3a2b0d615e81986d","unresolved":false,"context_lines":[{"line_number":202,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":203,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":204,"context_line":"                mp_context\u003dself._manager_context,"},{"line_number":205,"context_line":"                graceful_shutdown_timeout\u003dself.conf.graceful_shutdown_timeout)"},{"line_number":206,"context_line":"            oslo_config_glue.link("},{"line_number":207,"context_line":"                self._manager, self.conf,"},{"line_number":208,"context_line":"                reload_method\u003dself.restart_method,"}],"source_content_type":"text/x-python","patch_set":14,"id":"5233450b_32f11a57","line":205,"range":{"start_line":205,"start_character":16,"end_line":205,"end_character":77},"in_reply_to":"cc671d77_2ee3cae5","updated":"2026-01-21 13:53:56.000000000","message":"Done","commit_id":"5fc12355ef9447d2cd6bfacd86833e18b2ac1cd4"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"44992037033774c44d7c85d7f63ccefe2dffe2f3","unresolved":true,"context_lines":[{"line_number":202,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":203,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":204,"context_line":"                mp_context\u003dself._manager_context,"},{"line_number":205,"context_line":"                graceful_shutdown_timeout\u003dself.conf.graceful_shutdown_timeout)"},{"line_number":206,"context_line":"            oslo_config_glue.link("},{"line_number":207,"context_line":"                self._manager, self.conf,"},{"line_number":208,"context_line":"                reload_method\u003dself.restart_method,"}],"source_content_type":"text/x-python","patch_set":14,"id":"cc671d77_2ee3cae5","line":205,"range":{"start_line":205,"start_character":16,"end_line":205,"end_character":77},"in_reply_to":"ee6cc1bd_e111b6da","updated":"2026-01-21 13:53:45.000000000","message":"Ok you\u0027re right! Done I have fixed it.","commit_id":"5fc12355ef9447d2cd6bfacd86833e18b2ac1cd4"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ae9ffa52e7a827ed87c04e848ea8a483cf8db7ae","unresolved":true,"context_lines":[{"line_number":53,"context_line":"            LOG.warning("},{"line_number":54,"context_line":"                \"Please make the service spawn-safe to avoid this fallback.\","},{"line_number":55,"context_line":"            )"},{"line_number":56,"context_line":"            return multiprocessing.get_context(\"fork\")"},{"line_number":57,"context_line":"        LOG.error("},{"line_number":58,"context_line":"            \"Service %s is not picklable with spawn and fork is unavailable.\","},{"line_number":59,"context_line":"            type(service_instance).__name__,"}],"source_content_type":"text/x-python","patch_set":15,"id":"c14b1b6e_f52fb9d1","line":56,"range":{"start_line":56,"start_character":19,"end_line":56,"end_character":54},"updated":"2026-01-21 17:13:15.000000000","message":"how about \u0027forkserver\u0027 that is default in python3.13. I have not tested that but at lease we should be moving towards default one?\n\nhttps://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods\n\nWith this change we are always falling back to the \u0027fork\u0027 which is going away slowly.","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"7aef2c3a221dcba2f3c2bcba20d6cd0726bb84f7","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            LOG.warning("},{"line_number":54,"context_line":"                \"Please make the service spawn-safe to avoid this fallback.\","},{"line_number":55,"context_line":"            )"},{"line_number":56,"context_line":"            return multiprocessing.get_context(\"fork\")"},{"line_number":57,"context_line":"        LOG.error("},{"line_number":58,"context_line":"            \"Service %s is not picklable with spawn and fork is unavailable.\","},{"line_number":59,"context_line":"            type(service_instance).__name__,"}],"source_content_type":"text/x-python","patch_set":15,"id":"f3897aa9_020725b6","line":56,"range":{"start_line":56,"start_character":19,"end_line":56,"end_character":54},"in_reply_to":"4b2c1e71_bec49123","updated":"2026-01-23 13:35:06.000000000","message":"Yes, agreed. Let\u0027s keep forkserver out of this change for now and handle it in a dedicated follow-up patch once we have testing and confidence around it.","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"1356ebe8872fe0ff278c3fcd2579591199e82bd0","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            LOG.warning("},{"line_number":54,"context_line":"                \"Please make the service spawn-safe to avoid this fallback.\","},{"line_number":55,"context_line":"            )"},{"line_number":56,"context_line":"            return multiprocessing.get_context(\"fork\")"},{"line_number":57,"context_line":"        LOG.error("},{"line_number":58,"context_line":"            \"Service %s is not picklable with spawn and fork is unavailable.\","},{"line_number":59,"context_line":"            type(service_instance).__name__,"}],"source_content_type":"text/x-python","patch_set":15,"id":"4b2c1e71_bec49123","line":56,"range":{"start_line":56,"start_character":19,"end_line":56,"end_character":54},"in_reply_to":"c14b1b6e_f52fb9d1","updated":"2026-01-22 18:33:23.000000000","message":"no need to change here, once we test and see value in \u0027forkserver\u0027 then we can add that as separate effort and no need to mix that in spawn","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ae9ffa52e7a827ed87c04e848ea8a483cf8db7ae","unresolved":false,"context_lines":[{"line_number":60,"context_line":"            exc_info\u003dexc,"},{"line_number":61,"context_line":"        )"},{"line_number":62,"context_line":"        raise"},{"line_number":63,"context_line":"    return get_spawn_context()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"def _ensure_spawn_picklable(service_instance):"}],"source_content_type":"text/x-python","patch_set":15,"id":"187ccfb3_d7096040","line":63,"range":{"start_line":63,"start_character":0,"end_line":63,"end_character":30},"updated":"2026-01-21 17:13:15.000000000","message":"++","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ae9ffa52e7a827ed87c04e848ea8a483cf8db7ae","unresolved":true,"context_lines":[{"line_number":199,"context_line":"        if self._manager is None:"},{"line_number":200,"context_line":"            self._manager_context \u003d _select_service_manager_context("},{"line_number":201,"context_line":"                service_instance)"},{"line_number":202,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":203,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":204,"context_line":"                mp_context\u003dself._manager_context)"},{"line_number":205,"context_line":"            oslo_config_glue.link("}],"source_content_type":"text/x-python","patch_set":15,"id":"190377e5_1d3d3681","line":202,"range":{"start_line":202,"start_character":12,"end_line":202,"end_character":53},"updated":"2026-01-21 17:13:15.000000000","message":"we should not register the oslo.service options via external way, we should do it explicitly in oslo.service itself. At least we can remove this part of glue. As you saw that I am handling that part independently from spawn change because that is needed for graceful shutdown signal handler also - https://review.opendev.org/c/openstack/oslo.service/+/974010\n\nAlso, adding some more test case for graceful_shutdown_timeout in above change.\n\nI am ok if you want to do it in this change and if it is close to merge but let\u0027s do registration direclty here instead of oslo_config_glue.register_opts","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"3b9e9812a0b7879c3e5c7bebdb985b50e5b3c6a6","unresolved":false,"context_lines":[{"line_number":199,"context_line":"        if self._manager is None:"},{"line_number":200,"context_line":"            self._manager_context \u003d _select_service_manager_context("},{"line_number":201,"context_line":"                service_instance)"},{"line_number":202,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":203,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":204,"context_line":"                mp_context\u003dself._manager_context)"},{"line_number":205,"context_line":"            oslo_config_glue.link("}],"source_content_type":"text/x-python","patch_set":15,"id":"7bc6c6da_2ef86648","line":202,"range":{"start_line":202,"start_character":12,"end_line":202,"end_character":53},"in_reply_to":"190377e5_1d3d3681","updated":"2026-01-22 15:21:22.000000000","message":"Done","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ae9ffa52e7a827ed87c04e848ea8a483cf8db7ae","unresolved":true,"context_lines":[{"line_number":200,"context_line":"            self._manager_context \u003d _select_service_manager_context("},{"line_number":201,"context_line":"                service_instance)"},{"line_number":202,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":203,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":204,"context_line":"                mp_context\u003dself._manager_context)"},{"line_number":205,"context_line":"            oslo_config_glue.link("},{"line_number":206,"context_line":"                self._manager, self.conf,"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f02b46f_319a5846","line":203,"range":{"start_line":203,"start_character":52,"end_line":203,"end_character":53},"updated":"2026-01-21 17:13:15.000000000","message":"being explicit and to remove the glue, we should pass graceful_shutdown_timeout in the ServiceManager\n\n            self._manager \u003d cotyledon.ServiceManager(\n                graceful_shutdown_timeout\u003dself.conf.graceful_shutdown_timeout,\n                mp_context\u003dself._manager_context)","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"3b9e9812a0b7879c3e5c7bebdb985b50e5b3c6a6","unresolved":false,"context_lines":[{"line_number":200,"context_line":"            self._manager_context \u003d _select_service_manager_context("},{"line_number":201,"context_line":"                service_instance)"},{"line_number":202,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":203,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":204,"context_line":"                mp_context\u003dself._manager_context)"},{"line_number":205,"context_line":"            oslo_config_glue.link("},{"line_number":206,"context_line":"                self._manager, self.conf,"}],"source_content_type":"text/x-python","patch_set":15,"id":"bf930da6_4b726ba6","line":203,"range":{"start_line":203,"start_character":52,"end_line":203,"end_character":53},"in_reply_to":"7f02b46f_319a5846","updated":"2026-01-22 15:21:22.000000000","message":"Done","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"3295191073561edbf48b0ce466f39dbcb1c60f8f","unresolved":true,"context_lines":[{"line_number":196,"context_line":"        service_instance.backdoor_port \u003d self.backdoor_port"},{"line_number":197,"context_line":"        if not isinstance(workers, int) or workers \u003c 1:"},{"line_number":198,"context_line":"            raise ValueError(\"Number of workers must be \u003e\u003d 1\")"},{"line_number":199,"context_line":"        if self._manager is None:"},{"line_number":200,"context_line":"            self._manager_context \u003d _select_service_manager_context("},{"line_number":201,"context_line":"                service_instance)"},{"line_number":202,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":203,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":204,"context_line":"                mp_context\u003dself._manager_context)"},{"line_number":205,"context_line":"            oslo_config_glue.link("},{"line_number":206,"context_line":"                self._manager, self.conf,"},{"line_number":207,"context_line":"                reload_method\u003dself.restart_method,"}],"source_content_type":"text/x-python","patch_set":15,"id":"225c01ab_d77c8f36","line":204,"range":{"start_line":199,"start_character":6,"end_line":204,"end_character":49},"updated":"2026-01-22 03:49:22.000000000","message":"I just encounter another possible race condition can happen if we create cotyledon.ServiceManager in launch_service()\n \n - https://bugs.launchpad.net/oslo.service/+bug/2138840\n \n I proposed the fix for ProcessLauncher - https://review.opendev.org/c/openstack/oslo.service/+/974266 and we need similar fix here also","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"3b9e9812a0b7879c3e5c7bebdb985b50e5b3c6a6","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        service_instance.backdoor_port \u003d self.backdoor_port"},{"line_number":197,"context_line":"        if not isinstance(workers, int) or workers \u003c 1:"},{"line_number":198,"context_line":"            raise ValueError(\"Number of workers must be \u003e\u003d 1\")"},{"line_number":199,"context_line":"        if self._manager is None:"},{"line_number":200,"context_line":"            self._manager_context \u003d _select_service_manager_context("},{"line_number":201,"context_line":"                service_instance)"},{"line_number":202,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":203,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":204,"context_line":"                mp_context\u003dself._manager_context)"},{"line_number":205,"context_line":"            oslo_config_glue.link("},{"line_number":206,"context_line":"                self._manager, self.conf,"},{"line_number":207,"context_line":"                reload_method\u003dself.restart_method,"}],"source_content_type":"text/x-python","patch_set":15,"id":"d796490b_88f337c8","line":204,"range":{"start_line":199,"start_character":6,"end_line":204,"end_character":49},"in_reply_to":"225c01ab_d77c8f36","updated":"2026-01-22 15:21:22.000000000","message":"Done","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ae9ffa52e7a827ed87c04e848ea8a483cf8db7ae","unresolved":true,"context_lines":[{"line_number":202,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":203,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":204,"context_line":"                mp_context\u003dself._manager_context)"},{"line_number":205,"context_line":"            oslo_config_glue.link("},{"line_number":206,"context_line":"                self._manager, self.conf,"},{"line_number":207,"context_line":"                reload_method\u003dself.restart_method,"},{"line_number":208,"context_line":"            )"},{"line_number":209,"context_line":"        elif self._manager_context.get_start_method() \u003d\u003d \"spawn\":"},{"line_number":210,"context_line":"            _ensure_spawn_picklable(service_instance)"}],"source_content_type":"text/x-python","patch_set":15,"id":"a9fb6845_663a2002","line":207,"range":{"start_line":205,"start_character":11,"end_line":207,"end_character":50},"updated":"2026-01-21 17:13:15.000000000","message":"I agree we still need this but at some point we should stop using this glue at all. Because registration of config options needs to be separate I am doing this change also in https://review.opendev.org/c/openstack/oslo.service/+/974010","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"3b9e9812a0b7879c3e5c7bebdb985b50e5b3c6a6","unresolved":false,"context_lines":[{"line_number":202,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":203,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":204,"context_line":"                mp_context\u003dself._manager_context)"},{"line_number":205,"context_line":"            oslo_config_glue.link("},{"line_number":206,"context_line":"                self._manager, self.conf,"},{"line_number":207,"context_line":"                reload_method\u003dself.restart_method,"},{"line_number":208,"context_line":"            )"},{"line_number":209,"context_line":"        elif self._manager_context.get_start_method() \u003d\u003d \"spawn\":"},{"line_number":210,"context_line":"            _ensure_spawn_picklable(service_instance)"}],"source_content_type":"text/x-python","patch_set":15,"id":"301ca00d_0bb42b37","line":207,"range":{"start_line":205,"start_character":11,"end_line":207,"end_character":50},"in_reply_to":"a9fb6845_663a2002","updated":"2026-01-22 15:21:22.000000000","message":"Done","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ae9ffa52e7a827ed87c04e848ea8a483cf8db7ae","unresolved":true,"context_lines":[{"line_number":206,"context_line":"                self._manager, self.conf,"},{"line_number":207,"context_line":"                reload_method\u003dself.restart_method,"},{"line_number":208,"context_line":"            )"},{"line_number":209,"context_line":"        elif self._manager_context.get_start_method() \u003d\u003d \"spawn\":"},{"line_number":210,"context_line":"            _ensure_spawn_picklable(service_instance)"},{"line_number":211,"context_line":"        self._manager.add(ServiceWrapper, workers, args\u003d(service_instance,))"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def stop(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"ecc60555_4513bad1","line":210,"range":{"start_line":209,"start_character":0,"end_line":210,"end_character":53},"updated":"2026-01-21 17:13:15.000000000","message":"which case this will be? or you are considering if more than one service is launched with same ServiceLauncher?\n\nlauncher \u003d ServiceLauncher(conf)\nservice1 \u003d service_x()\nservice2 \u003d service_y()\nlauncher.launch_service(service1)\nlauncher.launch_service(service2)","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"3b9e9812a0b7879c3e5c7bebdb985b50e5b3c6a6","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                self._manager, self.conf,"},{"line_number":207,"context_line":"                reload_method\u003dself.restart_method,"},{"line_number":208,"context_line":"            )"},{"line_number":209,"context_line":"        elif self._manager_context.get_start_method() \u003d\u003d \"spawn\":"},{"line_number":210,"context_line":"            _ensure_spawn_picklable(service_instance)"},{"line_number":211,"context_line":"        self._manager.add(ServiceWrapper, workers, args\u003d(service_instance,))"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def stop(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"8c9d00f3_c63c1063","line":210,"range":{"start_line":209,"start_character":0,"end_line":210,"end_character":53},"in_reply_to":"ecc60555_4513bad1","updated":"2026-01-22 15:21:22.000000000","message":"Done","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ae9ffa52e7a827ed87c04e848ea8a483cf8db7ae","unresolved":true,"context_lines":[{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        if self._manager is None:"},{"line_number":328,"context_line":"            self._manager_context \u003d _select_service_manager_context(service)"},{"line_number":329,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":330,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":331,"context_line":"                mp_context\u003dself._manager_context)"},{"line_number":332,"context_line":"            oslo_config_glue.link("}],"source_content_type":"text/x-python","patch_set":15,"id":"3db5bda3_697b9991","line":329,"range":{"start_line":329,"start_character":0,"end_line":329,"end_character":53},"updated":"2026-01-21 17:13:15.000000000","message":"ditto","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"3b9e9812a0b7879c3e5c7bebdb985b50e5b3c6a6","unresolved":false,"context_lines":[{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        if self._manager is None:"},{"line_number":328,"context_line":"            self._manager_context \u003d _select_service_manager_context(service)"},{"line_number":329,"context_line":"            oslo_config_glue.register_opts(self.conf)"},{"line_number":330,"context_line":"            self._manager \u003d cotyledon.ServiceManager("},{"line_number":331,"context_line":"                mp_context\u003dself._manager_context)"},{"line_number":332,"context_line":"            oslo_config_glue.link("}],"source_content_type":"text/x-python","patch_set":15,"id":"fb65ea5e_fa4ec85a","line":329,"range":{"start_line":329,"start_character":0,"end_line":329,"end_character":53},"in_reply_to":"3db5bda3_697b9991","updated":"2026-01-22 15:21:22.000000000","message":"Done","commit_id":"fbdaca9291194609e6990750956a3492e861da98"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"2caa3a190a273b085293aed278b28b08a3689b8b","unresolved":true,"context_lines":[{"line_number":209,"context_line":"                )"},{"line_number":210,"context_line":"            elif self._manager_context.get_start_method() \u003d\u003d \"spawn\":"},{"line_number":211,"context_line":"                _ensure_spawn_picklable(service_instance)"},{"line_number":212,"context_line":"            self._manager.add("},{"line_number":213,"context_line":"                ServiceWrapper, workers, args\u003d(service_instance,))"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def stop(self):"},{"line_number":216,"context_line":"        with self._lock:"}],"source_content_type":"text/x-python","patch_set":19,"id":"9a488c5e_3f091cd9","line":213,"range":{"start_line":212,"start_character":0,"end_line":213,"end_character":66},"updated":"2026-01-22 21:53:30.000000000","message":"I do not think this does not need to be under lock, adding services in manager should be handled simulations by ServiceManager","commit_id":"a572997aeb98ac974f6f8f10958b12656bf56849"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"2c7140f32adcf94c53d574c6ec68bafd2cb11d3c","unresolved":false,"context_lines":[{"line_number":209,"context_line":"                )"},{"line_number":210,"context_line":"            elif self._manager_context.get_start_method() \u003d\u003d \"spawn\":"},{"line_number":211,"context_line":"                _ensure_spawn_picklable(service_instance)"},{"line_number":212,"context_line":"            self._manager.add("},{"line_number":213,"context_line":"                ServiceWrapper, workers, args\u003d(service_instance,))"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    def stop(self):"},{"line_number":216,"context_line":"        with self._lock:"}],"source_content_type":"text/x-python","patch_set":19,"id":"c9183526_2e2ad775","line":213,"range":{"start_line":212,"start_character":0,"end_line":213,"end_character":66},"in_reply_to":"9a488c5e_3f091cd9","updated":"2026-01-23 13:30:32.000000000","message":"Done","commit_id":"a572997aeb98ac974f6f8f10958b12656bf56849"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"2caa3a190a273b085293aed278b28b08a3689b8b","unresolved":true,"context_lines":[{"line_number":354,"context_line":"            elif self._manager_context.get_start_method() \u003d\u003d \"spawn\":"},{"line_number":355,"context_line":"                _ensure_spawn_picklable(service)"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"            self._manager.add(ServiceWrapper, workers, args\u003d(service,))"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    def wait(self):"},{"line_number":360,"context_line":"        if self.no_fork:"}],"source_content_type":"text/x-python","patch_set":19,"id":"a99e9684_d18b2277","line":357,"range":{"start_line":357,"start_character":4,"end_line":357,"end_character":71},"updated":"2026-01-22 21:53:30.000000000","message":"ditto","commit_id":"a572997aeb98ac974f6f8f10958b12656bf56849"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"2c7140f32adcf94c53d574c6ec68bafd2cb11d3c","unresolved":false,"context_lines":[{"line_number":354,"context_line":"            elif self._manager_context.get_start_method() \u003d\u003d \"spawn\":"},{"line_number":355,"context_line":"                _ensure_spawn_picklable(service)"},{"line_number":356,"context_line":""},{"line_number":357,"context_line":"            self._manager.add(ServiceWrapper, workers, args\u003d(service,))"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"    def wait(self):"},{"line_number":360,"context_line":"        if self.no_fork:"}],"source_content_type":"text/x-python","patch_set":19,"id":"28a87b56_f370fcdb","line":357,"range":{"start_line":357,"start_character":4,"end_line":357,"end_character":71},"in_reply_to":"a99e9684_d18b2277","updated":"2026-01-23 13:30:32.000000000","message":"Done","commit_id":"a572997aeb98ac974f6f8f10958b12656bf56849"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3c6942b43e4fa21648ad00318f649bec9e0d7009","unresolved":true,"context_lines":[{"line_number":23,"context_line":"import warnings"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"import cotyledon"},{"line_number":26,"context_line":"from cotyledon import oslo_config_glue"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from oslo_service._multiprocessing import get_spawn_context"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from oslo_service._i18n import _"},{"line_number":31,"context_line":"from oslo_service import _options"},{"line_number":32,"context_line":"from oslo_service.backend._common.constants import _LAUNCHER_RESTART_METHODS"},{"line_number":33,"context_line":"from oslo_service.backend._common.service \\"},{"line_number":34,"context_line":"    import check_service_base as _check_service_base"},{"line_number":35,"context_line":"from oslo_service.backend._common.service import get_signal_mappings"},{"line_number":36,"context_line":"from oslo_service.backend._common.service import Singleton"},{"line_number":37,"context_line":"from oslo_service.backend._threading import threadgroup"},{"line_number":38,"context_line":"from oslo_service.backend.base import ServiceBase"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"f1aea164_c5bf75ae","line":39,"range":{"start_line":26,"start_character":38,"end_line":39,"end_character":1},"updated":"2026-01-29 13:31:30.000000000","message":"nit:\n\n```suggestion\nfrom cotyledon import oslo_config_glue\n\nfrom oslo_service._multiprocessing import get_spawn_context\nfrom oslo_service._i18n import _\nfrom oslo_service import _options\nfrom oslo_service.backend._common.constants import _LAUNCHER_RESTART_METHODS\nfrom oslo_service.backend._common.service \\\n    import check_service_base as _check_service_base\nfrom oslo_service.backend._common.service import get_signal_mappings\nfrom oslo_service.backend._common.service import Singleton\nfrom oslo_service.backend._threading import threadgroup\nfrom oslo_service.backend.base import ServiceBase\n\n```","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"602732e7c542a2573aad891f68428e4c8448eb8d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"import warnings"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"import cotyledon"},{"line_number":26,"context_line":"from cotyledon import oslo_config_glue"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from oslo_service._multiprocessing import get_spawn_context"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"from oslo_service._i18n import _"},{"line_number":31,"context_line":"from oslo_service import _options"},{"line_number":32,"context_line":"from oslo_service.backend._common.constants import _LAUNCHER_RESTART_METHODS"},{"line_number":33,"context_line":"from oslo_service.backend._common.service \\"},{"line_number":34,"context_line":"    import check_service_base as _check_service_base"},{"line_number":35,"context_line":"from oslo_service.backend._common.service import get_signal_mappings"},{"line_number":36,"context_line":"from oslo_service.backend._common.service import Singleton"},{"line_number":37,"context_line":"from oslo_service.backend._threading import threadgroup"},{"line_number":38,"context_line":"from oslo_service.backend.base import ServiceBase"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"e65f0b6b_1c110b22","line":39,"range":{"start_line":26,"start_character":38,"end_line":39,"end_character":1},"in_reply_to":"f1aea164_c5bf75ae","updated":"2026-01-29 14:53:21.000000000","message":"Fix applied.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"8388bed96072e30fee11e8e27f20d8a6bdcbb264","unresolved":true,"context_lines":[{"line_number":45,"context_line":"        ForkingPickler.dumps(service_instance)"},{"line_number":46,"context_line":"    except Exception as exc:"},{"line_number":47,"context_line":"        if \"fork\" in multiprocessing.get_all_start_methods():"},{"line_number":48,"context_line":"            LOG.warning("},{"line_number":49,"context_line":"                \"Service %s is not picklable with spawn;\""},{"line_number":50,"context_line":"                \" falling back to fork.\","},{"line_number":51,"context_line":"                type(service_instance).__name__,"},{"line_number":52,"context_line":"                exc_info\u003dexc,"},{"line_number":53,"context_line":"            )"},{"line_number":54,"context_line":"            LOG.warning("},{"line_number":55,"context_line":"                \"Please make the service spawn-safe to avoid this fallback.\","},{"line_number":56,"context_line":"            )"},{"line_number":57,"context_line":"            return multiprocessing.get_context(\"fork\")"},{"line_number":58,"context_line":"        LOG.error("},{"line_number":59,"context_line":"            \"Service %s is not picklable with spawn and fork is unavailable.\","}],"source_content_type":"text/x-python","patch_set":21,"id":"edcc8944_3c69b110","line":56,"range":{"start_line":48,"start_character":0,"end_line":56,"end_character":13},"updated":"2026-01-28 14:44:41.000000000","message":"Can we merge these two into a single log line ?","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"3833cfcc672d2eddee4fb0586fc9d15598376bf8","unresolved":true,"context_lines":[{"line_number":45,"context_line":"        ForkingPickler.dumps(service_instance)"},{"line_number":46,"context_line":"    except Exception as exc:"},{"line_number":47,"context_line":"        if \"fork\" in multiprocessing.get_all_start_methods():"},{"line_number":48,"context_line":"            LOG.warning("},{"line_number":49,"context_line":"                \"Service %s is not picklable with spawn;\""},{"line_number":50,"context_line":"                \" falling back to fork.\","},{"line_number":51,"context_line":"                type(service_instance).__name__,"},{"line_number":52,"context_line":"                exc_info\u003dexc,"},{"line_number":53,"context_line":"            )"},{"line_number":54,"context_line":"            LOG.warning("},{"line_number":55,"context_line":"                \"Please make the service spawn-safe to avoid this fallback.\","},{"line_number":56,"context_line":"            )"},{"line_number":57,"context_line":"            return multiprocessing.get_context(\"fork\")"},{"line_number":58,"context_line":"        LOG.error("},{"line_number":59,"context_line":"            \"Service %s is not picklable with spawn and fork is unavailable.\","}],"source_content_type":"text/x-python","patch_set":21,"id":"d2a55859_c323b014","line":56,"range":{"start_line":48,"start_character":0,"end_line":56,"end_character":13},"in_reply_to":"0ad42f19_2e815532","updated":"2026-01-31 10:24:52.000000000","message":"Can you please check the last patchset, you comment on the patchset 21.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"39e50555f8a86000f8b3a57509e288ff53cb3f8a","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        ForkingPickler.dumps(service_instance)"},{"line_number":46,"context_line":"    except Exception as exc:"},{"line_number":47,"context_line":"        if \"fork\" in multiprocessing.get_all_start_methods():"},{"line_number":48,"context_line":"            LOG.warning("},{"line_number":49,"context_line":"                \"Service %s is not picklable with spawn;\""},{"line_number":50,"context_line":"                \" falling back to fork.\","},{"line_number":51,"context_line":"                type(service_instance).__name__,"},{"line_number":52,"context_line":"                exc_info\u003dexc,"},{"line_number":53,"context_line":"            )"},{"line_number":54,"context_line":"            LOG.warning("},{"line_number":55,"context_line":"                \"Please make the service spawn-safe to avoid this fallback.\","},{"line_number":56,"context_line":"            )"},{"line_number":57,"context_line":"            return multiprocessing.get_context(\"fork\")"},{"line_number":58,"context_line":"        LOG.error("},{"line_number":59,"context_line":"            \"Service %s is not picklable with spawn and fork is unavailable.\","}],"source_content_type":"text/x-python","patch_set":21,"id":"ffb720b7_966680db","line":56,"range":{"start_line":48,"start_character":0,"end_line":56,"end_character":13},"in_reply_to":"3aa2e4a9_1fa76b3b","updated":"2026-01-28 18:09:58.000000000","message":"proposed https://review.opendev.org/c/openstack/oslo.service/+/975064","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"e8d332c251e2f5640198b4ca456b752cae0bba32","unresolved":true,"context_lines":[{"line_number":45,"context_line":"        ForkingPickler.dumps(service_instance)"},{"line_number":46,"context_line":"    except Exception as exc:"},{"line_number":47,"context_line":"        if \"fork\" in multiprocessing.get_all_start_methods():"},{"line_number":48,"context_line":"            LOG.warning("},{"line_number":49,"context_line":"                \"Service %s is not picklable with spawn;\""},{"line_number":50,"context_line":"                \" falling back to fork.\","},{"line_number":51,"context_line":"                type(service_instance).__name__,"},{"line_number":52,"context_line":"                exc_info\u003dexc,"},{"line_number":53,"context_line":"            )"},{"line_number":54,"context_line":"            LOG.warning("},{"line_number":55,"context_line":"                \"Please make the service spawn-safe to avoid this fallback.\","},{"line_number":56,"context_line":"            )"},{"line_number":57,"context_line":"            return multiprocessing.get_context(\"fork\")"},{"line_number":58,"context_line":"        LOG.error("},{"line_number":59,"context_line":"            \"Service %s is not picklable with spawn and fork is unavailable.\","}],"source_content_type":"text/x-python","patch_set":21,"id":"0ad42f19_2e815532","line":56,"range":{"start_line":48,"start_character":0,"end_line":56,"end_character":13},"in_reply_to":"bf79d828_7f286bad","updated":"2026-01-31 00:41:38.000000000","message":"I think the fix for my original comment was somehow reverted. Do you intend to restore https://review.opendev.org/c/openstack/oslo.service/+/975064 to address that ?","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3c6942b43e4fa21648ad00318f649bec9e0d7009","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        ForkingPickler.dumps(service_instance)"},{"line_number":46,"context_line":"    except Exception as exc:"},{"line_number":47,"context_line":"        if \"fork\" in multiprocessing.get_all_start_methods():"},{"line_number":48,"context_line":"            LOG.warning("},{"line_number":49,"context_line":"                \"Service %s is not picklable with spawn;\""},{"line_number":50,"context_line":"                \" falling back to fork.\","},{"line_number":51,"context_line":"                type(service_instance).__name__,"},{"line_number":52,"context_line":"                exc_info\u003dexc,"},{"line_number":53,"context_line":"            )"},{"line_number":54,"context_line":"            LOG.warning("},{"line_number":55,"context_line":"                \"Please make the service spawn-safe to avoid this fallback.\","},{"line_number":56,"context_line":"            )"},{"line_number":57,"context_line":"            return multiprocessing.get_context(\"fork\")"},{"line_number":58,"context_line":"        LOG.error("},{"line_number":59,"context_line":"            \"Service %s is not picklable with spawn and fork is unavailable.\","}],"source_content_type":"text/x-python","patch_set":21,"id":"bf79d828_7f286bad","line":56,"range":{"start_line":48,"start_character":0,"end_line":56,"end_character":13},"in_reply_to":"cc2372a4_8914001b","updated":"2026-01-29 13:31:30.000000000","message":"I think you need to rework this somewhat. Can you please fold this in when you do?","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"da79d73b47ed573ac617bf083708d2eb65e47fda","unresolved":true,"context_lines":[{"line_number":45,"context_line":"        ForkingPickler.dumps(service_instance)"},{"line_number":46,"context_line":"    except Exception as exc:"},{"line_number":47,"context_line":"        if \"fork\" in multiprocessing.get_all_start_methods():"},{"line_number":48,"context_line":"            LOG.warning("},{"line_number":49,"context_line":"                \"Service %s is not picklable with spawn;\""},{"line_number":50,"context_line":"                \" falling back to fork.\","},{"line_number":51,"context_line":"                type(service_instance).__name__,"},{"line_number":52,"context_line":"                exc_info\u003dexc,"},{"line_number":53,"context_line":"            )"},{"line_number":54,"context_line":"            LOG.warning("},{"line_number":55,"context_line":"                \"Please make the service spawn-safe to avoid this fallback.\","},{"line_number":56,"context_line":"            )"},{"line_number":57,"context_line":"            return multiprocessing.get_context(\"fork\")"},{"line_number":58,"context_line":"        LOG.error("},{"line_number":59,"context_line":"            \"Service %s is not picklable with spawn and fork is unavailable.\","}],"source_content_type":"text/x-python","patch_set":21,"id":"3aa2e4a9_1fa76b3b","line":56,"range":{"start_line":48,"start_character":0,"end_line":56,"end_character":13},"in_reply_to":"edcc8944_3c69b110","updated":"2026-01-28 17:52:34.000000000","message":"++, I will push follow up for this to avoid the rebase the signal handler","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"413788a916257341724264b9cdab3a17041e833b","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        ForkingPickler.dumps(service_instance)"},{"line_number":46,"context_line":"    except Exception as exc:"},{"line_number":47,"context_line":"        if \"fork\" in multiprocessing.get_all_start_methods():"},{"line_number":48,"context_line":"            LOG.warning("},{"line_number":49,"context_line":"                \"Service %s is not picklable with spawn;\""},{"line_number":50,"context_line":"                \" falling back to fork.\","},{"line_number":51,"context_line":"                type(service_instance).__name__,"},{"line_number":52,"context_line":"                exc_info\u003dexc,"},{"line_number":53,"context_line":"            )"},{"line_number":54,"context_line":"            LOG.warning("},{"line_number":55,"context_line":"                \"Please make the service spawn-safe to avoid this fallback.\","},{"line_number":56,"context_line":"            )"},{"line_number":57,"context_line":"            return multiprocessing.get_context(\"fork\")"},{"line_number":58,"context_line":"        LOG.error("},{"line_number":59,"context_line":"            \"Service %s is not picklable with spawn and fork is unavailable.\","}],"source_content_type":"text/x-python","patch_set":21,"id":"cc2372a4_8914001b","line":56,"range":{"start_line":48,"start_character":0,"end_line":56,"end_character":13},"in_reply_to":"ffb720b7_966680db","updated":"2026-01-29 10:23:55.000000000","message":"I have rebased it here.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"8388bed96072e30fee11e8e27f20d8a6bdcbb264","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"2acf9ad5_09906f34","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"updated":"2026-01-28 14:44:41.000000000","message":"In the commit message you mentioned that you use oslo_config_glue.link and register to register the shutdown option but this register_opts call also registers graceful_shutdown_timeout. Which one do you really intend ?\n\nAlso I oslo_config_glue.link does not register options. you should call oslo_config_glue.register_opts instead.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"12dff41aef33b23ab5d51529b9205f11daefa0b0","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"411a7fdc_aa78eac1","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"1a9d0bdd_40195d9e","updated":"2026-01-31 00:31:44.000000000","message":"An example case I\u0027m concerned about is that cotyledon introduces a new option and adds new logic to read it oslo_config_glue.link. In that case the new option is not registered , which results in hard failure.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"5f333d5cc4086bcec048efdba5dd9698892433d5","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"848dd4eb_3ab4af71","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"1aeb420c_2305b390","updated":"2026-01-28 15:29:47.000000000","message":"See https://review.opendev.org/c/openstack/oslo.service/+/975015","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"848cfc7cf7bc27777d838b34c9b3458f817b5e6b","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"1aeb420c_2305b390","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"2acf9ad5_09906f34","updated":"2026-01-28 15:12:33.000000000","message":"Hmm ok I think I understand what\u0027s happening... Let me dig into this....","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"249d641893d81bea844def244c490543964fa43b","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"830ab834_b980f4d4","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"38b0b7e7_249be7a0","updated":"2026-02-02 00:42:22.000000000","message":"++, That looks good to me. I added some comment there but agree on the direction, thanks for working on that.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"24bebfed9867eb81454247977abecfc13594ed6f","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"a7a4ad94_bdc42649","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"411a7fdc_aa78eac1","updated":"2026-01-31 00:40:22.000000000","message":"Note that oslo_config_glue is widely used in the project which introduced direct cotyledon usage (long time before we added threading implementation for oslo.service). In case we add a new config option to cotyledon we should also extend the existing glue interface for such projects while we don\u0027t need that in olso.service itself.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"447b759195aa5566267d00aff3980b64e42556d2","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"38b0b7e7_249be7a0","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"83205de3_c2b52c83","updated":"2026-02-01 04:36:37.000000000","message":"So I proposed https://review.opendev.org/c/openstack/oslo.service/+/975357 to get rid of oslo_config_glue. It looks quite hacky so let\u0027s see how the others feel about it.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"da79d73b47ed573ac617bf083708d2eb65e47fda","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"a84bbb77_47b8e785","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"848dd4eb_3ab4af71","updated":"2026-01-28 17:52:34.000000000","message":"we should avoid using the oslo_config_glue for registration. oslo.service config options should be registered by the oslo.service itself and not the external lib cotyledon.\n\ngraceful_shutdown_timeout is required for the non-cotyledon case also (no_fork\u003dTrue) so we should have those available in all cases.\n\ncotyledon.ServiceManager() expect the graceful_shutdown_timeout  as one of the arg in __init__ and modifying it on direct object by oslo_config_glue is really not a good idea.\n\nI asked to change this in below comment, please check.\n\nhttps://review.opendev.org/c/openstack/oslo.service/+/965208/comment/190377e5_1d3d3681/","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"d1f99e82c39f9f8e2998dd1f233c39a0d6998696","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"d98b4a2e_7927b9df","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"a7a4ad94_bdc42649","updated":"2026-02-01 02:38:22.000000000","message":"You are saying if cotyledon add their own config option or oslo.service config option? If it is oslo.service config option then registering and handling them in cotyledon is wrong design. None of the 3rd party library should be registering/managing the other lib config. And that is why graceful_shutdown_timeout is taken as arg in cotyledon.ServiceManager() class.\n\nMy main point is how you will handle the non-cotyledon case? oslo.service let service to launch on their own process (service running on main process) no_fork\u003dTrue that is use case of compute service. In that case, graceful_shutdown_timeout is needed for SIGTERM handling\n\n- https://review.opendev.org/c/openstack/oslo.service/+/974024/5/oslo_service/backend/_threading/service.py#388\n\nIn that case (no_fork\u003dTrue), oslo.service run service on main process and cotyledon is not in picture at all [1]. In that case, using cotyledon *ONLY* to register oslo.service config option does not make sense. That is my main point that oslo.service should register their config options and available to be used for anyone.\n\n[1] https://github.com/openstack/oslo.service/blob/3d0a8ffb459be8a9b183cb3671155555f207e878/oslo_service/backend/_threading/service.py#L264","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3c6942b43e4fa21648ad00318f649bec9e0d7009","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"ddc16bb8_37e43ad0","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"a84bbb77_47b8e785","updated":"2026-01-29 13:31:30.000000000","message":"Ack. Could you add a comment here explaining why we\u0027re registering these here, for future reviewers.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"68d1446848a8d209787cfd09c03917c51774b95e","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"d421df23_18c87bfa","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"b08ea1ca_1e918dbd","updated":"2026-02-01 03:23:26.000000000","message":"\u003e And if cotyledon need more config option then oslo.service or the user of cotyledon should make sure those are registered and available to use in the passed conf file or arg to cotyledon.\n\nThat\u0027s true for direct usage but does not work for users using cotyledon via oslo.service.\n\nImagine the case that cotyledon introduces a new option and adds a new logic to oslo_config_glue.link to read option. Then usage via oslo.service is broken because oslo.service does not register that option because it does not use oslo_config_glue.register which registers the required options including the new one.\n\nTechnically we can \"fix\" the problem by updating oslo.service timely everytime such update is made in cotyledon but IMO this is too fragile dependency and we should avoid it.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"cafb2ab6a0408a6251a93d1ca6dce7a107ba8924","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"027e9a9a_91ca5412","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"b08ea1ca_1e918dbd","updated":"2026-02-01 03:22:40.000000000","message":"Yeah. I think requirtement of cotyledon\u0027s oslo_config_glue.link is that config options are registered, either by oslo_config_glue.register or oslo.service user itself. And if we see oslo_config_glue.register does exactly same as what we are doing here \"self.conf.register_opts(_options.service_opts)\", So I am not sure where is the gap? By calling the oslo_config_glue.register, we are just calling a wrapper method of doing the exactly same things what this change prospoing, right?\n- https://github.com/sileht/cotyledon/blob/981d3bae5b7ea403184db1eb1616785d50f1d38a/cotyledon/oslo_config_glue.py#L97","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a94e09abc00689f1f4e953625e4c6631d2fed168","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"83205de3_c2b52c83","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"d421df23_18c87bfa","updated":"2026-02-01 03:26:00.000000000","message":"yeah, so that will be the valie error and we should fix that by registering the required config options in right way instead of extending the glue","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"9531cf1ba40d4faa3e1303231ee034c199a41431","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"b08ea1ca_1e918dbd","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"d98b4a2e_7927b9df","updated":"2026-02-01 03:18:20.000000000","message":"\u003e You are saying if cotyledon add their own config option or oslo.service config option? If it is oslo.service config option then registering and handling them in cotyledon is wrong design.\n\nI\u0027m talking about both.\nCurrently oslo.service and cotyledon[1] register the same set of options but they can diverse at any point.\nThe current version uses oslo.service to register these service options, but actually use these options by cotyledon\u0027s logic[2]. If we register these options by oslo.service\u0027s logic then we should use these only in oslo.service\u0027s logic.\n\n[1] https://github.com/sileht/cotyledon/blob/981d3bae5b7ea403184db1eb1616785d50f1d38a/cotyledon/oslo_config_glue.py#L32-L48\n[2] https://github.com/sileht/cotyledon/blob/981d3bae5b7ea403184db1eb1616785d50f1d38a/cotyledon/oslo_config_glue.py#L57-L58\n\n\u003e My main point is how you will handle the non-cotyledon case?\n\nI\u0027m not agaist letting oslo.service to register and use its service options and I agree that\u0027s the right approach if we need these options outside of cotyledon\u0027s handling. My point has been only about **using cotyledon\u0027s oslo_config_glue.link** , which assumes that the required options are registered by oslo_config_glue.register.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"740d04cd24223c32156f3b1713b5a93fc18790bf","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"3b046b32_cc41749f","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"d98b4a2e_7927b9df","updated":"2026-02-01 03:12:29.000000000","message":"And if cotyledon need more config option then oslo.service or the user of cotyledon should make sure those are registered and available to use in the passed conf file or arg to cotyledon. cotyledon as a lib resigtering its users config option is not something we should make as a usage practice.\n\nI know oslo_config_glue is added way long back but as we are improving the usage of cotyledon in oslo.service then usage should be done in proper way.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"8f7f626849da3e832f0dd6a7a8dcd1692a8d5309","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"e613ab0b_b76ae28b","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"ddc16bb8_37e43ad0","updated":"2026-01-29 14:21:13.000000000","message":"If we do not let cotyledon\u0027s implementation to register these options then IMO we should NOT use oslo_config_glue.link and should implement it by ourselves.\n\nMaintaining the options in oslo.service while using the logic to apply these to oslo_config_glue can easily cause problems caused by diverge between these.","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"a9128b18c8e33102b610e9d5f7f0186eda6b4092","unresolved":true,"context_lines":[{"line_number":183,"context_line":"class ServiceLauncher:"},{"line_number":184,"context_line":"    def __init__(self, conf, restart_method\u003d\u0027reload\u0027):"},{"line_number":185,"context_line":"        self.conf \u003d conf"},{"line_number":186,"context_line":"        self.conf.register_opts(_options.service_opts)"},{"line_number":187,"context_line":"        self.restart_method \u003d restart_method"},{"line_number":188,"context_line":"        self.backdoor_port \u003d None"},{"line_number":189,"context_line":"        self._manager \u003d None"}],"source_content_type":"text/x-python","patch_set":21,"id":"1a9d0bdd_40195d9e","line":186,"range":{"start_line":186,"start_character":8,"end_line":186,"end_character":54},"in_reply_to":"e613ab0b_b76ae28b","updated":"2026-01-29 16:11:59.000000000","message":"I am not sure how it will cause the problem, the below PR made those interface separate so that link() can be called directly. Though i agree with the idea of not using oslo_config_glue and fix things in oslo.service only. Having oslo_config_glue is very odd thing for me for cotyledon as well as oslo.service side.\n\n- https://github.com/sileht/cotyledon/pull/87/changes\n\nabout registration of oslo.service config, i do not think we should restrict oslo.service to register their own config. also, I mentioned it in my previous comment, that this config options are required for graceful shutdown signal handler also (non-cotyledon case) so we need to register them here.\n\n- https://review.opendev.org/c/openstack/oslo.service/+/974024/5","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3c6942b43e4fa21648ad00318f649bec9e0d7009","unresolved":true,"context_lines":[{"line_number":196,"context_line":"        if not isinstance(workers, int) or workers \u003c 1:"},{"line_number":197,"context_line":"            raise ValueError(\"Number of workers must be \u003e\u003d 1\")"},{"line_number":198,"context_line":"        with self._lock:"},{"line_number":199,"context_line":"            if self._manager is None:"},{"line_number":200,"context_line":"                self._manager_context \u003d _select_service_manager_context("},{"line_number":201,"context_line":"                    service_instance)"},{"line_number":202,"context_line":"                self._manager \u003d cotyledon.ServiceManager("},{"line_number":203,"context_line":"                    mp_context\u003dself._manager_context,"},{"line_number":204,"context_line":"                    graceful_shutdown_timeout\u003d("},{"line_number":205,"context_line":"                        self.conf.graceful_shutdown_timeout))"},{"line_number":206,"context_line":"                oslo_config_glue.link("},{"line_number":207,"context_line":"                    self._manager, self.conf,"},{"line_number":208,"context_line":"                    reload_method\u003dself.restart_method,"},{"line_number":209,"context_line":"                )"},{"line_number":210,"context_line":"            elif self._manager_context.get_start_method() \u003d\u003d \"spawn\":"},{"line_number":211,"context_line":"                _ensure_spawn_picklable(service_instance)"},{"line_number":212,"context_line":"        # ServiceManager.add() is thread-safe, no need to hold lock"}],"source_content_type":"text/x-python","patch_set":21,"id":"aa94f8ff_28a37da8","line":209,"range":{"start_line":199,"start_character":37,"end_line":209,"end_character":17},"updated":"2026-01-29 13:31:30.000000000","message":"This code is identical to `ProcessLauncher.launch_service` implementation. Could we provide a base class for both and move this into a common e.g. `_get_manager` method? That or rename `_select_service_manager_context` to `_get_service_manager` and pass in `service` / `service_instance`, `self.conf.graceful_shutdown_timeout`, `self.conf` and `self.restart_method`?\n\nNote I\u0027d prefer the base class approach (ideally using `abc.ABC` if possible) but if we do adopt that, it should be a separate prelude change","commit_id":"a8298863dec04cb8143ce0be24d774e9ad18ae47"}],"oslo_service/tests/test_service.py":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"1356ebe8872fe0ff278c3fcd2579591199e82bd0","unresolved":true,"context_lines":[{"line_number":657,"context_line":"        try:"},{"line_number":658,"context_line":"            kwargs[\u0027graceful_shutdown_timeout\u0027] \u003d ("},{"line_number":659,"context_line":"                self.conf.graceful_shutdown_timeout)"},{"line_number":660,"context_line":"        except (AttributeError, cfg.NoSuchOptError):"},{"line_number":661,"context_line":"            pass"},{"line_number":662,"context_line":"        proc \u003d multiprocessing.Process(target\u003deventlet_service.run,"},{"line_number":663,"context_line":"                                       args\u003d(queue,),"},{"line_number":664,"context_line":"                                       kwargs\u003dkwargs)"}],"source_content_type":"text/x-python","patch_set":18,"id":"f82029a6_65eee0fc","line":661,"range":{"start_line":660,"start_character":0,"end_line":661,"end_character":16},"updated":"2026-01-22 18:33:23.000000000","message":"let\u0027s not ignore these error and if they occur we miss registering the required conf somewhere","commit_id":"834e16ddd0e1e7407fc9286dcf0688cca4038c19"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"2c7140f32adcf94c53d574c6ec68bafd2cb11d3c","unresolved":false,"context_lines":[{"line_number":657,"context_line":"        try:"},{"line_number":658,"context_line":"            kwargs[\u0027graceful_shutdown_timeout\u0027] \u003d ("},{"line_number":659,"context_line":"                self.conf.graceful_shutdown_timeout)"},{"line_number":660,"context_line":"        except (AttributeError, cfg.NoSuchOptError):"},{"line_number":661,"context_line":"            pass"},{"line_number":662,"context_line":"        proc \u003d multiprocessing.Process(target\u003deventlet_service.run,"},{"line_number":663,"context_line":"                                       args\u003d(queue,),"},{"line_number":664,"context_line":"                                       kwargs\u003dkwargs)"}],"source_content_type":"text/x-python","patch_set":18,"id":"6def1b75_57ef9e71","line":661,"range":{"start_line":660,"start_character":0,"end_line":661,"end_character":16},"in_reply_to":"f82029a6_65eee0fc","updated":"2026-01-23 13:30:32.000000000","message":"Done","commit_id":"834e16ddd0e1e7407fc9286dcf0688cca4038c19"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"1356ebe8872fe0ff278c3fcd2579591199e82bd0","unresolved":false,"context_lines":[{"line_number":720,"context_line":"        os.kill(proc.pid, signal.SIGTERM)"},{"line_number":721,"context_line":"        self.assertTrue(proc.is_alive())"},{"line_number":722,"context_line":"        # Wait with timeout to avoid infinite hang if config is wrong"},{"line_number":723,"context_line":"        proc.join(timeout\u003dgraceful_shutdown_timeout + 10)"},{"line_number":724,"context_line":"        self.assertFalse(proc.is_alive(),"},{"line_number":725,"context_line":"                         \"Process should have exited after graceful timeout\")"},{"line_number":726,"context_line":"        time_after \u003d time.time()"}],"source_content_type":"text/x-python","patch_set":18,"id":"a9b4ed6b_e459c4c7","line":723,"range":{"start_line":723,"start_character":0,"end_line":723,"end_character":57},"updated":"2026-01-22 18:33:23.000000000","message":"I think we should not add timeout here otherwise it can false result this test. graceful_shutdown_timeout terminate the server, it that does not and test hang that means this test found the issue in code.","commit_id":"834e16ddd0e1e7407fc9286dcf0688cca4038c19"}],"oslo_service/tests/test_spawn_context_integration.py":[{"author":{"_account_id":28522,"name":"Hervé Beraud","email":"herveberaud.pro@gmail.com","username":"hberaud"},"change_message_id":"f88462c9d703f3387f11ab26607a8028359b28c0","unresolved":true,"context_lines":[{"line_number":19,"context_line":"from oslo_service.tests import base"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestSpawnContextIntegration(base.ServiceBaseTestCase):"},{"line_number":23,"context_line":"    \"\"\"Test spawn context integration with service launcher.\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def test_spawn_context_is_spawn_safe(self):"},{"line_number":26,"context_line":"        \"\"\"Test that get_spawn_context returns a spawn context.\"\"\""},{"line_number":27,"context_line":"        ctx \u003d get_spawn_context()"},{"line_number":28,"context_line":"        self.assertEqual(ctx.get_start_method(), \"spawn\")"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def test_spawn_pool_creates_spawn_based_pool(self):"},{"line_number":31,"context_line":"        \"\"\"Test that get_spawn_pool creates a pool with spawn context.\"\"\""},{"line_number":32,"context_line":"        pool \u003d get_spawn_pool()"},{"line_number":33,"context_line":"        self.assertIsInstance(pool, multiprocessing.pool.Pool)"},{"line_number":34,"context_line":"        self.assertEqual(pool._ctx.get_start_method(), \"spawn\")"},{"line_number":35,"context_line":"        pool.close()"},{"line_number":36,"context_line":"        pool.join()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def test_processlauncher_uses_spawn_context(self):"},{"line_number":39,"context_line":"        \"\"\"Test that ProcessLauncher initializes with spawn context.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"db2fcd0a_a5e9c206","line":36,"range":{"start_line":22,"start_character":0,"end_line":36,"end_character":19},"updated":"2025-11-06 09:33:03.000000000","message":"The intent of this test class seems more related to the intent of your parent patch. I\u0027d suggest to merge it with your previous patch.\n\nHowever, the test below seems to fit well with the intent of this current patch, hence, I\u0027d suggest to keep only this test here.","commit_id":"46aeade081ddde6b31107367890f8817304861cb"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"e762a549affdee358716fc5268b1127cb06cbfd2","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from oslo_service.tests import base"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestSpawnContextIntegration(base.ServiceBaseTestCase):"},{"line_number":23,"context_line":"    \"\"\"Test spawn context integration with service launcher.\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def test_spawn_context_is_spawn_safe(self):"},{"line_number":26,"context_line":"        \"\"\"Test that get_spawn_context returns a spawn context.\"\"\""},{"line_number":27,"context_line":"        ctx \u003d get_spawn_context()"},{"line_number":28,"context_line":"        self.assertEqual(ctx.get_start_method(), \"spawn\")"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def test_spawn_pool_creates_spawn_based_pool(self):"},{"line_number":31,"context_line":"        \"\"\"Test that get_spawn_pool creates a pool with spawn context.\"\"\""},{"line_number":32,"context_line":"        pool \u003d get_spawn_pool()"},{"line_number":33,"context_line":"        self.assertIsInstance(pool, multiprocessing.pool.Pool)"},{"line_number":34,"context_line":"        self.assertEqual(pool._ctx.get_start_method(), \"spawn\")"},{"line_number":35,"context_line":"        pool.close()"},{"line_number":36,"context_line":"        pool.join()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def test_processlauncher_uses_spawn_context(self):"},{"line_number":39,"context_line":"        \"\"\"Test that ProcessLauncher initializes with spawn context.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"e3a00d6b_cc235e87","line":36,"range":{"start_line":22,"start_character":0,"end_line":36,"end_character":19},"in_reply_to":"b0a9bc25_52eb7993","updated":"2026-01-14 19:06:55.000000000","message":"Done","commit_id":"46aeade081ddde6b31107367890f8817304861cb"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"11deafb6ee6d7c5407671e78adb1c5beed3e1711","unresolved":true,"context_lines":[{"line_number":19,"context_line":"from oslo_service.tests import base"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestSpawnContextIntegration(base.ServiceBaseTestCase):"},{"line_number":23,"context_line":"    \"\"\"Test spawn context integration with service launcher.\"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    def test_spawn_context_is_spawn_safe(self):"},{"line_number":26,"context_line":"        \"\"\"Test that get_spawn_context returns a spawn context.\"\"\""},{"line_number":27,"context_line":"        ctx \u003d get_spawn_context()"},{"line_number":28,"context_line":"        self.assertEqual(ctx.get_start_method(), \"spawn\")"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def test_spawn_pool_creates_spawn_based_pool(self):"},{"line_number":31,"context_line":"        \"\"\"Test that get_spawn_pool creates a pool with spawn context.\"\"\""},{"line_number":32,"context_line":"        pool \u003d get_spawn_pool()"},{"line_number":33,"context_line":"        self.assertIsInstance(pool, multiprocessing.pool.Pool)"},{"line_number":34,"context_line":"        self.assertEqual(pool._ctx.get_start_method(), \"spawn\")"},{"line_number":35,"context_line":"        pool.close()"},{"line_number":36,"context_line":"        pool.join()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def test_processlauncher_uses_spawn_context(self):"},{"line_number":39,"context_line":"        \"\"\"Test that ProcessLauncher initializes with spawn context.\"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"b0a9bc25_52eb7993","line":36,"range":{"start_line":22,"start_character":0,"end_line":36,"end_character":19},"in_reply_to":"db2fcd0a_a5e9c206","updated":"2025-11-07 13:34:47.000000000","message":"Thanks a lot for the feedback!\nI understand your point, but these integration tests are intentionally kept here since they validate how the new spawn context is used inside ProcessLauncher and not the generic helpers themselves.\nThe lower-level unit tests for get_spawn_context and get_spawn_pool already live in the parent patch.\n\nThis class focuses on verifying that the service layer correctly initializes and uses the spawn-safe multiprocessing context, which aligns with the intent of this patch.","commit_id":"46aeade081ddde6b31107367890f8817304861cb"}],"pyproject.toml":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ae9ffa52e7a827ed87c04e848ea8a483cf8db7ae","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"[project.optional-dependencies]"},{"line_number":35,"context_line":"threading \u003d ["},{"line_number":36,"context_line":"    \"cotyledon\u003e\u003d2.2.0\",  # Apache-2.0"},{"line_number":37,"context_line":"    \"futurist\u003e\u003d3.1.1\",  # Apache-2.0"},{"line_number":38,"context_line":"]"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-toml","patch_set":15,"id":"99b13a4d_28a7b558","line":36,"range":{"start_line":36,"start_character":4,"end_line":36,"end_character":23},"updated":"2026-01-21 17:13:15.000000000","message":"ohk its here, I was trying adding it in requirements.txt","commit_id":"fbdaca9291194609e6990750956a3492e861da98"}],"releasenotes/notes/refactor-service-spawn-safe.yaml":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"1356ebe8872fe0ff278c3fcd2579591199e82bd0","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Refactored ``backend/_threading/service.py`` to initialize"},{"line_number":5,"context_line":"    process management using spawn-safe multiprocessing helpers."},{"line_number":6,"context_line":"    This prevents inherited locks during worker respawn and"},{"line_number":7,"context_line":"    improves compatibility with Python 3.12."},{"line_number":8,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":18,"id":"7280f3da_f593f6a8","line":5,"range":{"start_line":4,"start_character":2,"end_line":5,"end_character":64},"updated":"2026-01-22 18:33:23.000000000","message":"I will repharase this line from user perspective, something like below:\n\nThe oslo.service threading backend supports the multiprocessing `spawn`_ as process start mehtod. If service is spawn-safe, then ``spawn`` will the default start method for process. Otherwise, oslo.service will automatically fallback to ``fork`` method.\n\nThis prevents inherited locks during worker respawn and improves compatibility with Python 3.12.\n\n.. _spawn: https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods","commit_id":"834e16ddd0e1e7407fc9286dcf0688cca4038c19"},{"author":{"_account_id":31245,"name":"Daniel Bengtsson","email":"dbengt@redhat.com","username":"damani42"},"change_message_id":"2c7140f32adcf94c53d574c6ec68bafd2cb11d3c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Refactored ``backend/_threading/service.py`` to initialize"},{"line_number":5,"context_line":"    process management using spawn-safe multiprocessing helpers."},{"line_number":6,"context_line":"    This prevents inherited locks during worker respawn and"},{"line_number":7,"context_line":"    improves compatibility with Python 3.12."},{"line_number":8,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":18,"id":"592e7992_be7198bb","line":5,"range":{"start_line":4,"start_character":2,"end_line":5,"end_character":64},"in_reply_to":"7280f3da_f593f6a8","updated":"2026-01-23 13:30:32.000000000","message":"Done","commit_id":"834e16ddd0e1e7407fc9286dcf0688cca4038c19"}]}
