)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"49349c845bb0cce7cb0e47615910d28539cfb658","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"fc03a656_78e04b01","updated":"2026-10-26 17:52:18.000000000","message":"Might be good to get Kamil to comment here as well","commit_id":"383105a4eb96e5c0598da2a92a394f509dc597e4"},{"author":{"_account_id":11583,"name":"Arnaud Morin","email":"arnaud.morin@gmail.com","username":"arnaudmorin"},"change_message_id":"54937fc4758553a1b9486a0889b7030d64200c44","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"cebccbb9_3b54aba0","in_reply_to":"d4be653e_ff3f49c9","updated":"2026-10-30 16:12:20.000000000","message":"Ack, in the mean time, I found some other fixes doing the same:\nhttps://review.opendev.org/c/openstack/nova/+/983676\nhttps://review.opendev.org/c/openstack/nova/+/1010106\n\nSo I believe we should try to merge one of them, this is affecting deployments a lot.","commit_id":"383105a4eb96e5c0598da2a92a394f509dc597e4"},{"author":{"_account_id":11082,"name":"Kamil Sambor","email":"ksambor@redhat.com","username":"ksambor"},"change_message_id":"2dfa5d57e707eab98b722baca7d504ec361dfd5b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"d4be653e_ff3f49c9","in_reply_to":"fc03a656_78e04b01","updated":"2026-10-28 12:49:26.000000000","message":"We already have https://review.opendev.org/c/openstack/nova/+/1000956 which cuts the creation edge: it moves all manager construction into start(), which runs post-fork, so there is no socket to inherit. That should fix this case too, so it is worth putting some attention there and reviewing it.\nI would still land this one. It is six lines in serve() versus a lifecycle change, and especialy if we would want to backport it 2026.2. 1000956 is the broader fix and worth reviewing on its own merits, but this should not wait for it.","commit_id":"383105a4eb96e5c0598da2a92a394f509dc597e4"},{"author":{"_account_id":11583,"name":"Arnaud Morin","email":"arnaud.morin@gmail.com","username":"arnaudmorin"},"change_message_id":"44a7735d757f8dc9235e2fc98db02c80b17ac56f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"bbdf7ff3_bd4e591d","updated":"2026-10-31 21:06:52.000000000","message":"Recheck","commit_id":"c7d6df83814c740a347f08f4d70c59f807464cbe"}],"nova/cmd/scheduler.py":[{"author":{"_account_id":39509,"name":"Lucas HENRY","display_name":"Lucas HENRY","email":"lucas.henry@ovhcloud.com","username":"polyedre"},"change_message_id":"62738b04f26781d20989ac7a6e6443e6b9d89381","unresolved":false,"context_lines":[{"line_number":66,"context_line":"    # initialization, which leaves keep-alive connections to placement open"},{"line_number":67,"context_line":"    # in the master process. Close them before forking, otherwise all the"},{"line_number":68,"context_line":"    # workers share the same sockets and read each other\u0027s responses."},{"line_number":69,"context_line":"    report.reset_report_client_singleton()"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    service.serve(server, workers\u003dworkers)"},{"line_number":72,"context_line":"    service.wait()"}],"source_content_type":"text/x-python","patch_set":1,"id":"82d35806_485984ca","line":69,"updated":"2026-10-23 08:53:23.000000000","message":"It seems that nova-conductor has the same bug: ComputeTaskManager.__init__() also tests report_client_singleton() (nova/conductor/manager.py:281-284) while the service is created in the master, and nova/cmd/conductor.py then forks CONF.conductor.workers processes the same way.\n\nMaybe you could put the reset in nova.service.serve(), just before service.launch(): that is the single place nova hands off to the forking launcher, so every forking service, now and later, would be covered?","commit_id":"86f5a081dbe931b6c7ba1865c3cb695ab90cb89e"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":39509,"name":"Lucas HENRY","display_name":"Lucas HENRY","email":"lucas.henry@ovhcloud.com","username":"polyedre"},"change_message_id":"47c30ff36b2df91f04259b21ff8447db8151fd84","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        # self._client is a keystoneauth1 Adapter: its session is the"},{"line_number":294,"context_line":"        # keystoneauth1 Session, which wraps the requests.Session that owns"},{"line_number":295,"context_line":"        # the connection pool."},{"line_number":296,"context_line":"        self._client.session.session.close()"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def _create_client(self):"},{"line_number":299,"context_line":"        \"\"\"Create the HTTP session accessing the placement service.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"aebf2c78_85e93ed4","line":296,"updated":"2026-10-26 09:33:53.000000000","message":"keystoneauth1 5.18.0 added a public Session.close(): it closes the requests.Session that the ksa Session owns, swallows the OSError/RequestException a close can raise, and leaves the session usable. Please bump requirements.txt to keystoneauth1\u003e\u003d5.18.0 and call self._client.session.close() here. Nova then no longer depends on ksa\u0027s internal `.session` attribute, and you can drop the three-line comment above. TestClose should then assert adapter.session.close.","commit_id":"383105a4eb96e5c0598da2a92a394f509dc597e4"},{"author":{"_account_id":11583,"name":"Arnaud Morin","email":"arnaud.morin@gmail.com","username":"arnaudmorin"},"change_message_id":"54937fc4758553a1b9486a0889b7030d64200c44","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        # self._client is a keystoneauth1 Adapter: its session is the"},{"line_number":294,"context_line":"        # keystoneauth1 Session, which wraps the requests.Session that owns"},{"line_number":295,"context_line":"        # the connection pool."},{"line_number":296,"context_line":"        self._client.session.session.close()"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def _create_client(self):"},{"line_number":299,"context_line":"        \"\"\"Create the HTTP session accessing the placement service.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"ea6363df_a276ae41","line":296,"in_reply_to":"16a2a83b_ab3cc9cf","updated":"2026-10-30 16:12:20.000000000","message":"Done","commit_id":"383105a4eb96e5c0598da2a92a394f509dc597e4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"49349c845bb0cce7cb0e47615910d28539cfb658","unresolved":true,"context_lines":[{"line_number":293,"context_line":"        # self._client is a keystoneauth1 Adapter: its session is the"},{"line_number":294,"context_line":"        # keystoneauth1 Session, which wraps the requests.Session that owns"},{"line_number":295,"context_line":"        # the connection pool."},{"line_number":296,"context_line":"        self._client.session.session.close()"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"    def _create_client(self):"},{"line_number":299,"context_line":"        \"\"\"Create the HTTP session accessing the placement service.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"16a2a83b_ab3cc9cf","line":296,"in_reply_to":"aebf2c78_85e93ed4","updated":"2026-10-26 17:52:18.000000000","message":"Yeah, this would be good if it works for this case.","commit_id":"383105a4eb96e5c0598da2a92a394f509dc597e4"}],"nova/service.py":[{"author":{"_account_id":39509,"name":"Lucas HENRY","display_name":"Lucas HENRY","email":"lucas.henry@ovhcloud.com","username":"polyedre"},"change_message_id":"c540ee10534999950c0e3fea29c7176f1c725a9a","unresolved":false,"context_lines":[{"line_number":511,"context_line":"    if not no_fork:"},{"line_number":512,"context_line":"        # NOTE(amorin): close the placement connections opened by the manager"},{"line_number":513,"context_line":"        # at startup, so that the forked workers do not share them."},{"line_number":514,"context_line":"        report.reset_report_client_singleton()"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"    _launcher \u003d service.launch(CONF, server, workers\u003dworkers,"},{"line_number":517,"context_line":"                               restart_method\u003d\u0027mutate\u0027, no_fork\u003dno_fork)"}],"source_content_type":"text/x-python","patch_set":2,"id":"2ab04b97_dc80b818","line":514,"updated":"2026-10-26 09:35:19.000000000","message":"Small consistency point: nova/cmd/scheduler.py and nova/cmd/conductor.py already reset forked state just before serve(), with thread_pool_factory.reset_all_executors() and gibi\u0027s NOTE. This change resets other forked state, placement this time, but does it inside serve(). That leaves two pre-fork resets living in two different layers. A follow-up could move reset_all_executors() under this same `if not no_fork:` and drop it from the cmd modules, so that any future forking service gets both resets.","commit_id":"383105a4eb96e5c0598da2a92a394f509dc597e4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"49349c845bb0cce7cb0e47615910d28539cfb658","unresolved":true,"context_lines":[{"line_number":511,"context_line":"    if not no_fork:"},{"line_number":512,"context_line":"        # NOTE(amorin): close the placement connections opened by the manager"},{"line_number":513,"context_line":"        # at startup, so that the forked workers do not share them."},{"line_number":514,"context_line":"        report.reset_report_client_singleton()"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"    _launcher \u003d service.launch(CONF, server, workers\u003dworkers,"},{"line_number":517,"context_line":"                               restart_method\u003d\u0027mutate\u0027, no_fork\u003dno_fork)"}],"source_content_type":"text/x-python","patch_set":2,"id":"630e5ed3_596ca5c4","line":514,"in_reply_to":"2ab04b97_dc80b818","updated":"2026-10-26 17:52:18.000000000","message":"By the same token, the commit message mentions only conductor and scheduler, but place this reset in the common module. What other services will this affect by being here -- any but these two?\n\nIt almost seems like it would be better to put this where the thread pool factory reset is for those two services to be explicit. But if this is already only hitting those two (because they\u0027re the only ones that fork?) then combining here makes sense.\n\nAs more of these things surface it\u0027s probably best to keep similar \"clean up before fork\" fixes in a single place.","commit_id":"383105a4eb96e5c0598da2a92a394f509dc597e4"},{"author":{"_account_id":11583,"name":"Arnaud Morin","email":"arnaud.morin@gmail.com","username":"arnaudmorin"},"change_message_id":"54937fc4758553a1b9486a0889b7030d64200c44","unresolved":false,"context_lines":[{"line_number":511,"context_line":"    if not no_fork:"},{"line_number":512,"context_line":"        # NOTE(amorin): close the placement connections opened by the manager"},{"line_number":513,"context_line":"        # at startup, so that the forked workers do not share them."},{"line_number":514,"context_line":"        report.reset_report_client_singleton()"},{"line_number":515,"context_line":""},{"line_number":516,"context_line":"    _launcher \u003d service.launch(CONF, server, workers\u003dworkers,"},{"line_number":517,"context_line":"                               restart_method\u003d\u0027mutate\u0027, no_fork\u003dno_fork)"}],"source_content_type":"text/x-python","patch_set":2,"id":"b0bde5f4_61e08354","line":514,"in_reply_to":"630e5ed3_596ca5c4","updated":"2026-10-30 16:12:20.000000000","message":"Agreed, and only scheduler and conductor are callers of serve() that fork.\nnova-compute calls serve with no_fork\u003dTrue. Other services are not calling it it seems.\n\nAlso agreed on a single place for that code. Since that\u0027s a pure move, I\u0027ll do it in a follow-up stacked on this fix, so the bug fix stays small to eventualy backport, does that sounds good?","commit_id":"383105a4eb96e5c0598da2a92a394f509dc597e4"}]}
