)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bc91f18f1d72a729905be31b1bd5deec59fa95db","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-03-16 10:35:52 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] perf(compute): parallelise per-node update_available_resource loop (B2)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The update_available_resource periodic task iterates all managed nodes"},{"line_number":10,"context_line":"serially.  For the Ironic driver with N\u003d1000 nodes and ~2 s per node"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"e452a2ac_fc30c683","line":7,"range":{"start_line":7,"start_character":20,"end_line":7,"end_character":72},"updated":"2026-03-23 17:58:03.000000000","message":"ignoring the deepcopy patch this is really the one i think that would add the most value.\n\nmainly because it will give operators a way to tune this based on the scale they operate at.\n\nif they are at small sacle the can stay with the defautl of worker thread if they see this perodic is takign minutes they can tweak it and make the memory/cpu cost tradefoff themselves.","commit_id":"82a836f74430d217ca05df41795bceee86a8517a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2f3d3ca7bc479274abfe5a512d5287c1823a0dc0","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-03-16 10:35:52 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] perf(compute): parallelise per-node update_available_resource loop (B2)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The update_available_resource periodic task iterates all managed nodes"},{"line_number":10,"context_line":"serially.  For the Ironic driver with N\u003d1000 nodes and ~2 s per node"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9b4107b5_3e4f0824","line":7,"range":{"start_line":7,"start_character":20,"end_line":7,"end_character":72},"in_reply_to":"e452a2ac_fc30c683","updated":"2026-07-06 12:39:26.000000000","message":"Acknowledged","commit_id":"82a836f74430d217ca05df41795bceee86a8517a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bc91f18f1d72a729905be31b1bd5deec59fa95db","unresolved":true,"context_lines":[{"line_number":7,"context_line":"[WIP] perf(compute): parallelise per-node update_available_resource loop (B2)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The update_available_resource periodic task iterates all managed nodes"},{"line_number":10,"context_line":"serially.  For the Ironic driver with N\u003d1000 nodes and ~2 s per node"},{"line_number":11,"context_line":"this takes ~33 minutes — nearly the entire periodic interval."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Add [compute] update_resources_max_workers (default 1) which creates a"},{"line_number":14,"context_line":"futurist thread-pool executor and fans out per-node updates through"},{"line_number":15,"context_line":"nova.utils.spawn_on().  When the option is 1 (default) the original"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"cf76d385_4a81a829","line":12,"range":{"start_line":10,"start_character":10,"end_line":12,"end_character":1},"updated":"2026-03-23 17:58:03.000000000","message":"actully the default for the peroc is 5 minutes but ironic deployment obviously do not use the default.","commit_id":"82a836f74430d217ca05df41795bceee86a8517a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2f3d3ca7bc479274abfe5a512d5287c1823a0dc0","unresolved":false,"context_lines":[{"line_number":7,"context_line":"[WIP] perf(compute): parallelise per-node update_available_resource loop (B2)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The update_available_resource periodic task iterates all managed nodes"},{"line_number":10,"context_line":"serially.  For the Ironic driver with N\u003d1000 nodes and ~2 s per node"},{"line_number":11,"context_line":"this takes ~33 minutes — nearly the entire periodic interval."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Add [compute] update_resources_max_workers (default 1) which creates a"},{"line_number":14,"context_line":"futurist thread-pool executor and fans out per-node updates through"},{"line_number":15,"context_line":"nova.utils.spawn_on().  When the option is 1 (default) the original"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"b7d061cd_8f83c576","line":12,"range":{"start_line":10,"start_character":10,"end_line":12,"end_character":1},"in_reply_to":"cf76d385_4a81a829","updated":"2026-07-06 12:39:26.000000000","message":"Acknowledged","commit_id":"82a836f74430d217ca05df41795bceee86a8517a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4565ece69fded6e3694f6c64821f46fddf1450dc","unresolved":true,"context_lines":[{"line_number":27,"context_line":"startup and resource-reporting improvements in this series as performance bug"},{"line_number":28,"context_line":"fixes for large Ironic deployments."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Generated-By: Cursor sonnet 4.6"},{"line_number":31,"context_line":"Change-Id: I36163947a09b82cfc40ab4b522d82ffb503a0b84"},{"line_number":32,"context_line":"Signed-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"f3fe1a6d_fd61076e","line":30,"updated":"2026-08-05 17:58:41.000000000","message":"im inclied to add \n\nRelated-Bug: #2162924\n\nand use that as the tracker for the general startup performance bug","commit_id":"b3ef7801533c9872a2b3b95a02830b2f88f8f1bb"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"3ce5e4f9643e9638e6c715c72f1df9785ab53c93","unresolved":false,"context_lines":[{"line_number":27,"context_line":"startup and resource-reporting improvements in this series as performance bug"},{"line_number":28,"context_line":"fixes for large Ironic deployments."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Generated-By: Cursor sonnet 4.6"},{"line_number":31,"context_line":"Change-Id: I36163947a09b82cfc40ab4b522d82ffb503a0b84"},{"line_number":32,"context_line":"Signed-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"d354a5ad_6661186d","line":30,"in_reply_to":"f3fe1a6d_fd61076e","updated":"2026-08-21 16:20:40.000000000","message":"Done","commit_id":"b3ef7801533c9872a2b3b95a02830b2f88f8f1bb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"99c93cf73dc5662218bd1842b264523b415cf4e6","unresolved":true,"context_lines":[{"line_number":26,"context_line":"Document the Ironic tuning guidance and add a release note that frames the"},{"line_number":27,"context_line":"startup and resource-reporting improvements in this series as performance bug"},{"line_number":28,"context_line":"fixes for large Ironic deployments."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Related-Bug: 2162924"},{"line_number":31,"context_line":"Generated-By: Cursor sonnet 4.6"},{"line_number":32,"context_line":"Change-Id: I36163947a09b82cfc40ab4b522d82ffb503a0b84"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"628f7569_c5bbd242","line":29,"updated":"2026-08-25 21:41:28.000000000","message":"FYI: text in commit messages should be wrapped at 72 chars so it doesn\u0027t render weird in the Gerrit web UI.","commit_id":"2f243f4e44ae7787ecf553a19014d8c028b89c64"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"1e97ae7636a6f3488e3e063ac3f0c48916a53730","unresolved":false,"context_lines":[{"line_number":26,"context_line":"Document the Ironic tuning guidance and add a release note that frames the"},{"line_number":27,"context_line":"startup and resource-reporting improvements in this series as performance bug"},{"line_number":28,"context_line":"fixes for large Ironic deployments."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Related-Bug: 2162924"},{"line_number":31,"context_line":"Generated-By: Cursor sonnet 4.6"},{"line_number":32,"context_line":"Change-Id: I36163947a09b82cfc40ab4b522d82ffb503a0b84"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"3b796ee5_80bf69ae","line":29,"in_reply_to":"628f7569_c5bbd242","updated":"2026-08-26 16:57:42.000000000","message":"Done","commit_id":"2f243f4e44ae7787ecf553a19014d8c028b89c64"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"54d13f6b7a1ad5890e14b75556eef4ab2dfce536","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"2176b3ce_68fc52d0","updated":"2026-07-20 21:55:03.000000000","message":"recheck ceph job failed before dpeloying","commit_id":"98f74e88a213ff7f0110b253b2286d3e2c740748"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cafcedd3666f743fd57702f76bf82562291954fd","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"0b60d8d3_b0c670f6","updated":"2026-08-12 13:04:51.000000000","message":"General idea seems fine. Sean has a few nits and I have a question. The -1 is more to catch your attention than anything else","commit_id":"b3ef7801533c9872a2b3b95a02830b2f88f8f1bb"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"3ce5e4f9643e9638e6c715c72f1df9785ab53c93","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"a68d2d83_7114a56c","updated":"2026-08-21 16:20:40.000000000","message":"Responded to all comments.","commit_id":"18d30ac601f2b99b5b6b4c37bd6b8d2413f2b73b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"84a1e2db741aa6c233f5638f537f385cc60f9ea2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"c647110e_fd3ecb43","updated":"2026-08-24 13:52:54.000000000","message":"I have one further request. Apologies for not calling it out earlier: it became more obvious once the code was simplified. -1 purely on the basis that we clearly need to make changes here anyway","commit_id":"4499febfb9e980177e1acb98dd9a03a0b0a5efd3"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"27494a299fb4d37d29651907a374412d86d747fc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"17161c2d_1206958b","updated":"2026-08-24 21:37:59.000000000","message":"Ok, I think I actually resolved everything this time.","commit_id":"3cdd8e096b8c75cf1cf71d5431904466f06d790c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8990fdf4a0e04032cca87f3f0f84a84f626cf44f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"fb46e255_83931c75","updated":"2026-08-25 16:51:47.000000000","message":"assuming CI is happy","commit_id":"2f243f4e44ae7787ecf553a19014d8c028b89c64"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"99c93cf73dc5662218bd1842b264523b415cf4e6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"d2ceca50_6ff63e80","updated":"2026-08-25 21:41:28.000000000","message":"recheck `openstack-tox-cover` TIMED_OUT twice in a row","commit_id":"2f243f4e44ae7787ecf553a19014d8c028b89c64"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"8f7061ce77f92dad229fa9c325a6d0574b712945","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"745c8220_0dfb7212","updated":"2026-08-26 19:23:39.000000000","message":"recheck flake","commit_id":"818c264450048f4aebeb08966443e1d033e3ce73"}],"doc/source/admin/configuration/hypervisor-ironic.rst":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"303b7d8b8bff649babdc2d76aa2207518292f097","unresolved":true,"context_lines":[{"line_number":56,"context_line":"  a conductor group within your deployment."},{"line_number":57,"context_line":"- The ``update_available_resource`` periodic task reports all the resources"},{"line_number":58,"context_line":"  managed by Ironic. Depending the number of nodes, it can take a lot of time."},{"line_number":59,"context_line":"  You can use conductor groups to help shard your deployment between multiple"},{"line_number":60,"context_line":"  nova-compute processes by setting"},{"line_number":61,"context_line":"  :oslo.config:option:`ironic.conductor_group`."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"  Large Ironic deployments can also tune"}],"source_content_type":"text/x-rst","patch_set":7,"id":"fe7e20db_2cb7b065","line":60,"range":{"start_line":59,"start_character":2,"end_line":60,"end_character":35},"updated":"2026-08-18 20:03:32.000000000","message":"you could but that not the correct way to shard you ironic deployment between multipel nova comptues.\n\nif we are updating this we shoudl really recommend the use fo the dedicated \n```\n[ironic] \nshard_key\n```\nfeature tha twas developed specificly to supprot that use case.\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/2023.2/approved/ironic-shards.html\nhttps://review.opendev.org/c/openstack/ironic-specs/+/861803\n\nconductor groups are a seperate ironic scaling mechanium \nthe shard key is how you restict a nova-compute agent to manage a subset of ironic nodes so you can have other nova-comptue manage other shards.\n\ntechinially fixing the doc is our of scope but i feel like we shoudl really call out the shared key as the primary way to do this while we are updating this doc.\n\nhttps://docs.openstack.org/nova/latest/configuration/config.html#ironic.conductor_group\nhttps://docs.openstack.org/nova/latest/configuration/config.html#ironic.shard","commit_id":"0340d6ef9cca2b2e0412e525a41f753ec6085bbd"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"27494a299fb4d37d29651907a374412d86d747fc","unresolved":false,"context_lines":[{"line_number":56,"context_line":"  a conductor group within your deployment."},{"line_number":57,"context_line":"- The ``update_available_resource`` periodic task reports all the resources"},{"line_number":58,"context_line":"  managed by Ironic. Depending the number of nodes, it can take a lot of time."},{"line_number":59,"context_line":"  You can use conductor groups to help shard your deployment between multiple"},{"line_number":60,"context_line":"  nova-compute processes by setting"},{"line_number":61,"context_line":"  :oslo.config:option:`ironic.conductor_group`."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"  Large Ironic deployments can also tune"}],"source_content_type":"text/x-rst","patch_set":7,"id":"13ccd87e_70e26a5a","line":60,"range":{"start_line":59,"start_character":2,"end_line":60,"end_character":35},"in_reply_to":"fe7e20db_2cb7b065","updated":"2026-08-24 21:37:59.000000000","message":"Done","commit_id":"0340d6ef9cca2b2e0412e525a41f753ec6085bbd"}],"nova/compute/manager.py":[{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"63fcbed3d1b65faa61049c35ebaa83cffac348a3","unresolved":false,"context_lines":[{"line_number":11505,"context_line":"                    \"re-raising the first failure from node %(node)s.\","},{"line_number":11506,"context_line":"                    {\u0027count\u0027: len(failed_nodes), \u0027node\u0027: failed_nodes[0]})"},{"line_number":11507,"context_line":"                exc \u003d first_exc_info[1]"},{"line_number":11508,"context_line":"                raise exc.with_traceback(first_exc_info[2])"},{"line_number":11509,"context_line":"        else:"},{"line_number":11510,"context_line":"            for nodename in nodenames:"},{"line_number":11511,"context_line":"                self._update_available_resource_for_node(context, nodename,"}],"source_content_type":"text/x-python","patch_set":2,"id":"6c910c6d_1e947395","line":11508,"updated":"2026-07-06 12:07:48.000000000","message":"pep8: error: Item \"None\" of \"BaseException | None\" has no attribute \"with_traceback\"  [union-attr]","commit_id":"82427231e66fbb9c78d343486386cc0a1c0eaa4b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"54d13f6b7a1ad5890e14b75556eef4ab2dfce536","unresolved":false,"context_lines":[{"line_number":11505,"context_line":"                    \"re-raising the first failure from node %(node)s.\","},{"line_number":11506,"context_line":"                    {\u0027count\u0027: len(failed_nodes), \u0027node\u0027: failed_nodes[0]})"},{"line_number":11507,"context_line":"                exc \u003d first_exc_info[1]"},{"line_number":11508,"context_line":"                raise exc.with_traceback(first_exc_info[2])"},{"line_number":11509,"context_line":"        else:"},{"line_number":11510,"context_line":"            for nodename in nodenames:"},{"line_number":11511,"context_line":"                self._update_available_resource_for_node(context, nodename,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7f9f2f23_df3539d2","line":11508,"in_reply_to":"057c1916_8ef284cd","updated":"2026-07-20 21:55:03.000000000","message":"Done","commit_id":"82427231e66fbb9c78d343486386cc0a1c0eaa4b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2f3d3ca7bc479274abfe5a512d5287c1823a0dc0","unresolved":true,"context_lines":[{"line_number":11505,"context_line":"                    \"re-raising the first failure from node %(node)s.\","},{"line_number":11506,"context_line":"                    {\u0027count\u0027: len(failed_nodes), \u0027node\u0027: failed_nodes[0]})"},{"line_number":11507,"context_line":"                exc \u003d first_exc_info[1]"},{"line_number":11508,"context_line":"                raise exc.with_traceback(first_exc_info[2])"},{"line_number":11509,"context_line":"        else:"},{"line_number":11510,"context_line":"            for nodename in nodenames:"},{"line_number":11511,"context_line":"                self._update_available_resource_for_node(context, nodename,"}],"source_content_type":"text/x-python","patch_set":2,"id":"057c1916_8ef284cd","line":11508,"in_reply_to":"6c910c6d_1e947395","updated":"2026-07-06 12:39:26.000000000","message":"hum you know what let me just simpfy this\n\nwe dont need to use sys.exc_info abov ewe can just save and rerais the exepction","commit_id":"82427231e66fbb9c78d343486386cc0a1c0eaa4b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cafcedd3666f743fd57702f76bf82562291954fd","unresolved":true,"context_lines":[{"line_number":11473,"context_line":"                            \"Failed to delete compute node resource provider \""},{"line_number":11474,"context_line":"                            \"for compute node %s: %s\", cn.uuid, str(e))"},{"line_number":11475,"context_line":""},{"line_number":11476,"context_line":"        if CONF.compute.update_resources_max_workers \u003e 1:"},{"line_number":11477,"context_line":"            # Run per-node updates in parallel.  Each node\u0027s update touches"},{"line_number":11478,"context_line":"            # only its own ResourceTracker state and its own ProviderTree"},{"line_number":11479,"context_line":"            # subtree (protected by the report client\u0027s lock), so concurrent"}],"source_content_type":"text/x-python","patch_set":5,"id":"bff8aaea_5208966a","line":11476,"updated":"2026-08-12 13:04:51.000000000","message":"Question: is the cost of creating the future significant enough to warrant the second code path? Could we remove the `else`?","commit_id":"b3ef7801533c9872a2b3b95a02830b2f88f8f1bb"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"3ce5e4f9643e9638e6c715c72f1df9785ab53c93","unresolved":false,"context_lines":[{"line_number":11473,"context_line":"                            \"Failed to delete compute node resource provider \""},{"line_number":11474,"context_line":"                            \"for compute node %s: %s\", cn.uuid, str(e))"},{"line_number":11475,"context_line":""},{"line_number":11476,"context_line":"        if CONF.compute.update_resources_max_workers \u003e 1:"},{"line_number":11477,"context_line":"            # Run per-node updates in parallel.  Each node\u0027s update touches"},{"line_number":11478,"context_line":"            # only its own ResourceTracker state and its own ProviderTree"},{"line_number":11479,"context_line":"            # subtree (protected by the report client\u0027s lock), so concurrent"}],"source_content_type":"text/x-python","patch_set":5,"id":"3610dd0b_7a6e35fa","line":11476,"in_reply_to":"6cf7148b_dcb743d0","updated":"2026-08-21 16:20:40.000000000","message":"Removed the `if/else` in favor of just always using futures to call `_update_available_resource_for_node`.","commit_id":"b3ef7801533c9872a2b3b95a02830b2f88f8f1bb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"bc6f8829dfb7f6009d86fa579695c4418c38b6c8","unresolved":true,"context_lines":[{"line_number":11473,"context_line":"                            \"Failed to delete compute node resource provider \""},{"line_number":11474,"context_line":"                            \"for compute node %s: %s\", cn.uuid, str(e))"},{"line_number":11475,"context_line":""},{"line_number":11476,"context_line":"        if CONF.compute.update_resources_max_workers \u003e 1:"},{"line_number":11477,"context_line":"            # Run per-node updates in parallel.  Each node\u0027s update touches"},{"line_number":11478,"context_line":"            # only its own ResourceTracker state and its own ProviderTree"},{"line_number":11479,"context_line":"            # subtree (protected by the report client\u0027s lock), so concurrent"}],"source_content_type":"text/x-python","patch_set":5,"id":"6cf7148b_dcb743d0","line":11476,"in_reply_to":"bff8aaea_5208966a","updated":"2026-08-18 20:06:31.000000000","message":"we need the else if we keep teh if but i i think we can remove\nboth and just alwasy use the thread pool.\n\nin the default case it will be a thread pool of 1 worker but semanticly that is valid so we coudl remove the branch","commit_id":"b3ef7801533c9872a2b3b95a02830b2f88f8f1bb"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"0086d43749794b20b01e5f2ea8e692a869761b48","unresolved":false,"context_lines":[{"line_number":11555,"context_line":""},{"line_number":11556,"context_line":"        This cleanup task is a cross-hypervisor utility for finding these"},{"line_number":11557,"context_line":"        zombied instances and either logging the discrepancy (likely what you"},{"line_number":11558,"context_line":"        should do in production), or automatically reaping the instances (more"},{"line_number":11559,"context_line":"        appropriate for dev environments)."},{"line_number":11560,"context_line":"        \"\"\""},{"line_number":11561,"context_line":"        action \u003d CONF.running_deleted_instance_action"}],"source_content_type":"text/x-python","patch_set":8,"id":"7d202b9e_3ffaac67","line":11558,"updated":"2026-08-21 15:02:49.000000000","message":"pep8: error: Module has no attribute \"spawn_on\"  [attr-defined]","commit_id":"18d30ac601f2b99b5b6b4c37bd6b8d2413f2b73b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"84a1e2db741aa6c233f5638f537f385cc60f9ea2","unresolved":true,"context_lines":[{"line_number":11491,"context_line":"        # than being silently lost. Keep draining after the first failure"},{"line_number":11492,"context_line":"        # so all scheduled per-node updates finish before we preserve the"},{"line_number":11493,"context_line":"        # sequential path\u0027s exception propagation semantics."},{"line_number":11494,"context_line":"        first_exc: Exception | None \u003d None"},{"line_number":11495,"context_line":"        failed_nodes \u003d []"},{"line_number":11496,"context_line":"        for nodename, fut in futures:"},{"line_number":11497,"context_line":"            try:"},{"line_number":11498,"context_line":"                fut.result()"},{"line_number":11499,"context_line":"            except Exception as exc:"},{"line_number":11500,"context_line":"                failed_nodes.append(nodename)"},{"line_number":11501,"context_line":"                if first_exc is None:"},{"line_number":11502,"context_line":"                    first_exc \u003d exc"},{"line_number":11503,"context_line":""},{"line_number":11504,"context_line":"        if first_exc is not None:"},{"line_number":11505,"context_line":"            LOG.error("},{"line_number":11506,"context_line":"                \"update_available_resource failed for %(count)d nodes; \""},{"line_number":11507,"context_line":"                \"re-raising the first failure from node %(node)s.\","},{"line_number":11508,"context_line":"                {\u0027count\u0027: len(failed_nodes), \u0027node\u0027: failed_nodes[0]})"},{"line_number":11509,"context_line":"            raise first_exc"},{"line_number":11510,"context_line":""},{"line_number":11511,"context_line":"    def _get_compute_nodes_in_db(self, context, nodenames, use_slave\u003dFalse,"},{"line_number":11512,"context_line":"                                 startup\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":9,"id":"a6f02680_f3646440","line":11509,"range":{"start_line":11494,"start_character":0,"end_line":11509,"end_character":27},"updated":"2026-08-24 13:52:54.000000000","message":"Our minimum Python version is 3.11 so we could use [exception groups](https://docs.python.org/3/library/exceptions.html#exception-groups) here. This avoids us losing info if exceptions differ. How about:\n\n```suggestion\n        exceptions: list[Exception] \u003d []\n        failed_nodes \u003d []\n        for nodename, fut in futures:\n            try:\n                fut.result()\n            except Exception as exc:\n                failed_nodes.append(nodename)\n                exceptions.append(exc)\n\n        if exceptions:\n            LOG.error(\n                \"update_available_resource failed for nodes: %(nodes)s.\",\n                {\u0027count\u0027: len(failed_nodes), \u0027nodes\u0027: \u0027, \u0027.join(failed_nodes)})\n            raise ExceptionGroup(\n                f\"Failures occurred in nodes: {\u0027, \u0027.join(failed_nodes)}\",\n                exceptions)\n```","commit_id":"4499febfb9e980177e1acb98dd9a03a0b0a5efd3"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"27494a299fb4d37d29651907a374412d86d747fc","unresolved":false,"context_lines":[{"line_number":11491,"context_line":"        # than being silently lost. Keep draining after the first failure"},{"line_number":11492,"context_line":"        # so all scheduled per-node updates finish before we preserve the"},{"line_number":11493,"context_line":"        # sequential path\u0027s exception propagation semantics."},{"line_number":11494,"context_line":"        first_exc: Exception | None \u003d None"},{"line_number":11495,"context_line":"        failed_nodes \u003d []"},{"line_number":11496,"context_line":"        for nodename, fut in futures:"},{"line_number":11497,"context_line":"            try:"},{"line_number":11498,"context_line":"                fut.result()"},{"line_number":11499,"context_line":"            except Exception as exc:"},{"line_number":11500,"context_line":"                failed_nodes.append(nodename)"},{"line_number":11501,"context_line":"                if first_exc is None:"},{"line_number":11502,"context_line":"                    first_exc \u003d exc"},{"line_number":11503,"context_line":""},{"line_number":11504,"context_line":"        if first_exc is not None:"},{"line_number":11505,"context_line":"            LOG.error("},{"line_number":11506,"context_line":"                \"update_available_resource failed for %(count)d nodes; \""},{"line_number":11507,"context_line":"                \"re-raising the first failure from node %(node)s.\","},{"line_number":11508,"context_line":"                {\u0027count\u0027: len(failed_nodes), \u0027node\u0027: failed_nodes[0]})"},{"line_number":11509,"context_line":"            raise first_exc"},{"line_number":11510,"context_line":""},{"line_number":11511,"context_line":"    def _get_compute_nodes_in_db(self, context, nodenames, use_slave\u003dFalse,"},{"line_number":11512,"context_line":"                                 startup\u003dFalse):"}],"source_content_type":"text/x-python","patch_set":9,"id":"8ef2b369_8714e625","line":11509,"range":{"start_line":11494,"start_character":0,"end_line":11509,"end_character":27},"in_reply_to":"a6f02680_f3646440","updated":"2026-08-24 21:37:59.000000000","message":"Fix applied.","commit_id":"4499febfb9e980177e1acb98dd9a03a0b0a5efd3"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"c2e13072e2c1b9fd1f9e1febc17cfda8447d621b","unresolved":false,"context_lines":[{"line_number":11554,"context_line":"        appropriate for dev environments)."},{"line_number":11555,"context_line":"        \"\"\""},{"line_number":11556,"context_line":"        action \u003d CONF.running_deleted_instance_action"},{"line_number":11557,"context_line":""},{"line_number":11558,"context_line":"        if action \u003d\u003d \"noop\":"},{"line_number":11559,"context_line":"            return"},{"line_number":11560,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"c869ea95_fa3771d5","line":11557,"updated":"2026-08-21 17:15:00.000000000","message":"pep8: error: Module has no attribute \"spawn_on\"  [attr-defined]","commit_id":"4499febfb9e980177e1acb98dd9a03a0b0a5efd3"}],"nova/conf/compute.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4565ece69fded6e3694f6c64821f46fddf1450dc","unresolved":true,"context_lines":[{"line_number":1094,"context_line":"increasing this value allows node updates to proceed concurrently and"},{"line_number":1095,"context_line":"dramatically reduces startup and periodic-task latency."},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"Suggested value for Ironic deployments: number of nodes divided by the"},{"line_number":1098,"context_line":"expected per-node update time (2-5 s for a warm Placement cache), capped"},{"line_number":1099,"context_line":"at the number of available CPU cores.  For example, for 500 nodes with a"},{"line_number":1100,"context_line":"2 s update time a value of 32 gives a theoretical speedup of ~16×."},{"line_number":1101,"context_line":""},{"line_number":1102,"context_line":"Setting this to 1 (the default) preserves the original sequential"},{"line_number":1103,"context_line":"behaviour."}],"source_content_type":"text/x-python","patch_set":5,"id":"c950a643_234c6f9d","line":1100,"range":{"start_line":1097,"start_character":0,"end_line":1100,"end_character":66},"updated":"2026-08-05 17:58:41.000000000","message":"@me@clifhouck.com i know ye have done some testing with this downstream\nif you have any better guidance to give on how to tune this that you can share here\nthat would improve the patch\n\nin general i prefer to avoid givng operator math problems if we can insted give concrete exampels\n\ne.g. \n\nfor 0-50 nodes keep the default\nfor 100-500 node use 4-8\nfor 1000+ set this to 16\n\nim kind of making those number up but if we have any concreate\nrecomendation we can make then that would be good.\n\nwe expect this to be governed to soem degree by Amdahl\u0027s law\n\nhttps://en.wikipedia.org/wiki/Amdahl%27s_law\n\ngiven the treads are still goveren by the gil so seting this to 100 proably wont be any faster then seting it to 8-16\n\nif not this is fine but im tempeted to just remove this paragraph entrily","commit_id":"b3ef7801533c9872a2b3b95a02830b2f88f8f1bb"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"27494a299fb4d37d29651907a374412d86d747fc","unresolved":false,"context_lines":[{"line_number":1094,"context_line":"increasing this value allows node updates to proceed concurrently and"},{"line_number":1095,"context_line":"dramatically reduces startup and periodic-task latency."},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"Suggested value for Ironic deployments: number of nodes divided by the"},{"line_number":1098,"context_line":"expected per-node update time (2-5 s for a warm Placement cache), capped"},{"line_number":1099,"context_line":"at the number of available CPU cores.  For example, for 500 nodes with a"},{"line_number":1100,"context_line":"2 s update time a value of 32 gives a theoretical speedup of ~16×."},{"line_number":1101,"context_line":""},{"line_number":1102,"context_line":"Setting this to 1 (the default) preserves the original sequential"},{"line_number":1103,"context_line":"behaviour."}],"source_content_type":"text/x-python","patch_set":5,"id":"e7454dba_bf721b4e","line":1100,"range":{"start_line":1097,"start_character":0,"end_line":1100,"end_character":66},"in_reply_to":"3ff6b51a_db36ecc0","updated":"2026-08-24 21:37:59.000000000","message":"Ok, the problem is essentially the speedup observations generated from real-world experience is not for this patch only. Though the speed-up is signficant and it seems saturation of thread workers is achieved. I\u0027m going to remove this for now unless we get a chance to independently verify numbers.","commit_id":"b3ef7801533c9872a2b3b95a02830b2f88f8f1bb"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"3ce5e4f9643e9638e6c715c72f1df9785ab53c93","unresolved":true,"context_lines":[{"line_number":1094,"context_line":"increasing this value allows node updates to proceed concurrently and"},{"line_number":1095,"context_line":"dramatically reduces startup and periodic-task latency."},{"line_number":1096,"context_line":""},{"line_number":1097,"context_line":"Suggested value for Ironic deployments: number of nodes divided by the"},{"line_number":1098,"context_line":"expected per-node update time (2-5 s for a warm Placement cache), capped"},{"line_number":1099,"context_line":"at the number of available CPU cores.  For example, for 500 nodes with a"},{"line_number":1100,"context_line":"2 s update time a value of 32 gives a theoretical speedup of ~16×."},{"line_number":1101,"context_line":""},{"line_number":1102,"context_line":"Setting this to 1 (the default) preserves the original sequential"},{"line_number":1103,"context_line":"behaviour."}],"source_content_type":"text/x-python","patch_set":5,"id":"3ff6b51a_db36ecc0","line":1100,"range":{"start_line":1097,"start_character":0,"end_line":1100,"end_character":66},"in_reply_to":"c950a643_234c6f9d","updated":"2026-08-21 16:20:40.000000000","message":"I\u0027m asking for feedback internally, will update this when I get a response. In the meantime, we could leave this (or remove it) and just update it once I get a satisfactory response?","commit_id":"b3ef7801533c9872a2b3b95a02830b2f88f8f1bb"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"99c93cf73dc5662218bd1842b264523b415cf4e6","unresolved":true,"context_lines":[{"line_number":1330,"context_line":"* 0: Will run at the default periodic interval."},{"line_number":1331,"context_line":"* Any value \u003c 0: Disables the option."},{"line_number":1332,"context_line":"* Any positive integer in seconds."},{"line_number":1333,"context_line":"\"\"\"),"},{"line_number":1334,"context_line":"]"},{"line_number":1335,"context_line":""},{"line_number":1336,"context_line":"timeout_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":13,"id":"9bc3bac1_24f248ca","line":1333,"updated":"2026-08-25 21:41:28.000000000","message":"Unrelated change?","commit_id":"2f243f4e44ae7787ecf553a19014d8c028b89c64"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"1e97ae7636a6f3488e3e063ac3f0c48916a53730","unresolved":false,"context_lines":[{"line_number":1330,"context_line":"* 0: Will run at the default periodic interval."},{"line_number":1331,"context_line":"* Any value \u003c 0: Disables the option."},{"line_number":1332,"context_line":"* Any positive integer in seconds."},{"line_number":1333,"context_line":"\"\"\"),"},{"line_number":1334,"context_line":"]"},{"line_number":1335,"context_line":""},{"line_number":1336,"context_line":"timeout_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":13,"id":"1d6fabea_80f3ef25","line":1333,"in_reply_to":"9bc3bac1_24f248ca","updated":"2026-08-26 16:57:42.000000000","message":"Done","commit_id":"2f243f4e44ae7787ecf553a19014d8c028b89c64"}]}
