)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"64fe5c74e19998be3c94876b908bc063d41b7de1","unresolved":true,"context_lines":[{"line_number":13,"context_line":"(20% of startup)."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Fix: add ProviderTree.subtree(name_or_uuid) which deep-copies only"},{"line_number":16,"context_line":"the O(K) providers rooted at the requested node (K ≈ 1–5 for a"},{"line_number":17,"context_line":"baremetal node plus any PCI children), then wire it up via new"},{"line_number":18,"context_line":"subtree_only\u003dTrue parameter on get_provider_tree_and_ensure_root()."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"update_from_provider_tree() gains a matching scope_rp_uuid parameter"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"285c24e8_b53492ab","line":17,"range":{"start_line":16,"start_character":3,"end_line":17,"end_character":39},"updated":"2026-03-23 17:04:28.000000000","message":"actully for bearmetal nodes today we dont use nested resouce providers\n\nbwe ened up with many root rps\n\nso this is really a forest data stucure with a lot of single node trees in the ironic case\n\nand a forset of a small number (typically 1) tree with nesting in the libvirt case.\n\nwe only have multipel root rps in the libvirt case if we are considing somehting like sharing resouce providers","commit_id":"157cff3408e4501c87f2e8d348031d73aa12489d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c51c419e9d6848b019ef96499a4ec010f35c75bb","unresolved":true,"context_lines":[{"line_number":13,"context_line":"(20% of startup)."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Fix: add ProviderTree.subtree(name_or_uuid) which deep-copies only"},{"line_number":16,"context_line":"the O(K) providers rooted at the requested node (K ≈ 1–5 for a"},{"line_number":17,"context_line":"baremetal node plus any PCI children), then wire it up via new"},{"line_number":18,"context_line":"subtree_only\u003dTrue parameter on get_provider_tree_and_ensure_root()."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"update_from_provider_tree() gains a matching scope_rp_uuid parameter"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"d937c933_ed3294dd","line":17,"range":{"start_line":16,"start_character":3,"end_line":17,"end_character":39},"in_reply_to":"285c24e8_b53492ab","updated":"2026-08-05 17:34:04.000000000","message":"it would be nice to adress this also\n\n```\nFix: add ProviderTree.subtree(name_or_uuid) which deep-copies only\nthe O(K) providers rooted at the requested node instead fo the full\nforest of trees,  then wire it up via new subtree_only\u003dTrue parameter\non get_provider_tree_and_ensure_root().\n```","commit_id":"157cff3408e4501c87f2e8d348031d73aa12489d"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"a5df6e446f3b7ff0b99620c57d51bf74550bb2d5","unresolved":false,"context_lines":[{"line_number":13,"context_line":"(20% of startup)."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Fix: add ProviderTree.subtree(name_or_uuid) which deep-copies only"},{"line_number":16,"context_line":"the O(K) providers rooted at the requested node (K ≈ 1–5 for a"},{"line_number":17,"context_line":"baremetal node plus any PCI children), then wire it up via new"},{"line_number":18,"context_line":"subtree_only\u003dTrue parameter on get_provider_tree_and_ensure_root()."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"update_from_provider_tree() gains a matching scope_rp_uuid parameter"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"00634126_cefa2378","line":17,"range":{"start_line":16,"start_character":3,"end_line":17,"end_character":39},"in_reply_to":"9b1b77b5_58a465e3","updated":"2026-08-21 13:52:31.000000000","message":"Done","commit_id":"157cff3408e4501c87f2e8d348031d73aa12489d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7e509f0d905bc843d6700a9fa95be8918580f994","unresolved":true,"context_lines":[{"line_number":13,"context_line":"(20% of startup)."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Fix: add ProviderTree.subtree(name_or_uuid) which deep-copies only"},{"line_number":16,"context_line":"the O(K) providers rooted at the requested node (K ≈ 1–5 for a"},{"line_number":17,"context_line":"baremetal node plus any PCI children), then wire it up via new"},{"line_number":18,"context_line":"subtree_only\u003dTrue parameter on get_provider_tree_and_ensure_root()."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"update_from_provider_tree() gains a matching scope_rp_uuid parameter"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9b1b77b5_58a465e3","line":17,"range":{"start_line":16,"start_character":3,"end_line":17,"end_character":39},"in_reply_to":"d937c933_ed3294dd","updated":"2026-08-18 19:53:42.000000000","message":"can you fix this in the next revsions\n\nit still says\n\n```\n(K ≈ 1–5 for a baremetal node plus any PCI children\n```\n\ntoday baremental node rps never have childered\n\nk will be 1 for each invockation for baremetal nods and the subtree copy will be invoked once per ironic node managed by this agent.","commit_id":"157cff3408e4501c87f2e8d348031d73aa12489d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c51c419e9d6848b019ef96499a4ec010f35c75bb","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Clif Houck \u003cme@clifhouck.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-08-05 10:03:51 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"perf(ironic): eliminate O(N²) ProviderTree deepcopy at startup (B6)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"get_provider_tree_and_ensure_root() previously returned"},{"line_number":10,"context_line":"copy.deepcopy(self._provider_tree) — a full copy of every provider"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"c54c73c0_7c554be7","line":7,"range":{"start_line":7,"start_character":62,"end_line":7,"end_character":67},"updated":"2026-08-05 17:34:04.000000000","message":"if you update this you can drop this\nit a leftover reference to the initial performance review based\non the profiler run.\n\nso by itself its not really useful to keep.","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"a5df6e446f3b7ff0b99620c57d51bf74550bb2d5","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Clif Houck \u003cme@clifhouck.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-08-05 10:03:51 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"perf(ironic): eliminate O(N²) ProviderTree deepcopy at startup (B6)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"get_provider_tree_and_ensure_root() previously returned"},{"line_number":10,"context_line":"copy.deepcopy(self._provider_tree) — a full copy of every provider"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"b9f37235_00a16ff2","line":7,"range":{"start_line":7,"start_character":62,"end_line":7,"end_character":67},"in_reply_to":"c54c73c0_7c554be7","updated":"2026-08-21 13:52:31.000000000","message":"Acknowledged","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7e509f0d905bc843d6700a9fa95be8918580f994","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Clif Houck \u003cme@clifhouck.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-08-05 10:03:51 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"perf(ironic): eliminate O(N²) ProviderTree deepcopy at startup (B6)"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"get_provider_tree_and_ensure_root() previously returned"},{"line_number":10,"context_line":"copy.deepcopy(self._provider_tree) — a full copy of every provider"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"add8a7c9_30317734","line":7,"range":{"start_line":7,"start_character":62,"end_line":7,"end_character":67},"in_reply_to":"c54c73c0_7c554be7","updated":"2026-08-18 19:53:42.000000000","message":"Done","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c51c419e9d6848b019ef96499a4ec010f35c75bb","unresolved":true,"context_lines":[{"line_number":26,"context_line":"to get the full tree as before; only the per-node resource-tracker"},{"line_number":27,"context_line":"path uses the new subtree copy."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Unit tests added for all subtree() behaviours: correct extraction,"},{"line_number":30,"context_line":"deepcopy isolation, child inclusion, sibling exclusion, and error"},{"line_number":31,"context_line":"cases for non-root / missing providers."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expected saving: ~49 s at N\u003d1000, turning O(N²) into O(N)."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Generated-by: Cursor sonnet 4.6"},{"line_number":36,"context_line":"Change-Id: I334f80ed76ae869fe241d468c0bf5dd3d0634bbd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"f15fff57_b77a2c14","line":33,"range":{"start_line":29,"start_character":0,"end_line":33,"end_character":58},"updated":"2026-08-05 17:34:04.000000000","message":"nite: we could also drop this. the savign will be very hardware dependet.\n\nand it already covered above in the into so we dont really need to repteat it here","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"a5df6e446f3b7ff0b99620c57d51bf74550bb2d5","unresolved":false,"context_lines":[{"line_number":26,"context_line":"to get the full tree as before; only the per-node resource-tracker"},{"line_number":27,"context_line":"path uses the new subtree copy."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Unit tests added for all subtree() behaviours: correct extraction,"},{"line_number":30,"context_line":"deepcopy isolation, child inclusion, sibling exclusion, and error"},{"line_number":31,"context_line":"cases for non-root / missing providers."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expected saving: ~49 s at N\u003d1000, turning O(N²) into O(N)."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Generated-by: Cursor sonnet 4.6"},{"line_number":36,"context_line":"Change-Id: I334f80ed76ae869fe241d468c0bf5dd3d0634bbd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"3aca92f0_9fa12ec9","line":33,"range":{"start_line":29,"start_character":0,"end_line":33,"end_character":58},"in_reply_to":"f15fff57_b77a2c14","updated":"2026-08-21 13:52:31.000000000","message":"Acknowledged","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c51c419e9d6848b019ef96499a4ec010f35c75bb","unresolved":true,"context_lines":[{"line_number":31,"context_line":"cases for non-root / missing providers."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expected saving: ~49 s at N\u003d1000, turning O(N²) into O(N)."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Generated-by: Cursor sonnet 4.6"},{"line_number":36,"context_line":"Change-Id: I334f80ed76ae869fe241d468c0bf5dd3d0634bbd"},{"line_number":37,"context_line":"Signed-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"c1c3ec14_6ea4b9f2","line":34,"updated":"2026-08-05 17:34:04.000000000","message":"what proably more important then all of that is we shoudl proably actully file this as its own bug in launchpad just to have the tracker for back-porting ill go do that now and comment back once its filed","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"a5df6e446f3b7ff0b99620c57d51bf74550bb2d5","unresolved":false,"context_lines":[{"line_number":31,"context_line":"cases for non-root / missing providers."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expected saving: ~49 s at N\u003d1000, turning O(N²) into O(N)."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Generated-by: Cursor sonnet 4.6"},{"line_number":36,"context_line":"Change-Id: I334f80ed76ae869fe241d468c0bf5dd3d0634bbd"},{"line_number":37,"context_line":"Signed-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"462f5b1d_217846b0","line":34,"in_reply_to":"6a9b0473_b987f263","updated":"2026-08-21 13:52:31.000000000","message":"Acknowledged","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7e509f0d905bc843d6700a9fa95be8918580f994","unresolved":false,"context_lines":[{"line_number":31,"context_line":"cases for non-root / missing providers."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expected saving: ~49 s at N\u003d1000, turning O(N²) into O(N)."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Generated-by: Cursor sonnet 4.6"},{"line_number":36,"context_line":"Change-Id: I334f80ed76ae869fe241d468c0bf5dd3d0634bbd"},{"line_number":37,"context_line":"Signed-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"1571ce01_3962d437","line":34,"in_reply_to":"6a9b0473_b987f263","updated":"2026-08-18 19:53:42.000000000","message":"Done","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"407b04dfcbfc23fe20e52cffdfb2152565b0d96c","unresolved":true,"context_lines":[{"line_number":31,"context_line":"cases for non-root / missing providers."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Expected saving: ~49 s at N\u003d1000, turning O(N²) into O(N)."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Generated-by: Cursor sonnet 4.6"},{"line_number":36,"context_line":"Change-Id: I334f80ed76ae869fe241d468c0bf5dd3d0634bbd"},{"line_number":37,"context_line":"Signed-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"6a9b0473_b987f263","line":34,"in_reply_to":"c1c3ec14_6ea4b9f2","updated":"2026-08-05 17:42:57.000000000","message":"ok you can use https://bugs.launchpad.net/nova/+bug/2162924 for the commit and release note\n\ni woudl proably use Close-Bug for this change and Related-Bug for https://review.opendev.org/c/openstack/nova/+/980679","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ab8eb9c5fd6329103aea28a816253d68281873af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"d9013639_5445205d","updated":"2026-05-13 17:10:11.000000000","message":"just a rebase via the ui to get new results","commit_id":"33c5e1fba0ac36f3069f3030bc699189fdb150f3"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"df4a33cf71759a77c8c31b68f007f3d2e78adcd9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"9a530087_e755c70f","updated":"2026-05-27 16:01:50.000000000","message":"recheck kernel panic ...","commit_id":"33c5e1fba0ac36f3069f3030bc699189fdb150f3"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"0e46e1a590b37e2bbe047d388ed745f156894f31","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"ecc273c7_2fbc555a","updated":"2026-07-20 21:53:46.000000000","message":"recheck unrelated post failure","commit_id":"88493bec306f09d61a02d61aa7247a13c0e19a11"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"1dda87634aeeceb064d3d0a02e6c9179a41bcd64","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":8,"id":"cd9fa739_75d344ac","updated":"2026-08-05 17:06:16.000000000","message":"Does this need a release note? It\u0027s a pretty significant speedup.","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"107e8519dde50ec0580a6d48a711d8601b7b0181","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"b75b2a9f_dd41ea61","updated":"2026-08-12 10:28:04.000000000","message":"I also agree with the bulk of Sean\u0027s comments on the commit message. Could you please respin to address those?","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"a5df6e446f3b7ff0b99620c57d51bf74550bb2d5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"0ae9a966_b5cd52b8","in_reply_to":"3c2bc26e_6c586138","updated":"2026-08-21 13:52:31.000000000","message":"Done","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c51c419e9d6848b019ef96499a4ec010f35c75bb","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3c2bc26e_6c586138","in_reply_to":"cd9fa739_75d344ac","updated":"2026-08-05 17:34:04.000000000","message":"adding one dosent hurt but i would not block on its absence but tis certenly nice to have when backproting","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"270d95ef7bd747a67622722a2536b8ecedb5cbf6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"da3207d9_fcf98b67","updated":"2026-08-24 13:39:23.000000000","message":"All my issues (bar the one nit, which is just that) have been addressed","commit_id":"1508188a844eaf1ae4718727d65f5a5e6ee40766"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"618e386a9d770ff9cb7fb40352f01b78835ba48a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"593335ff_2f78c7b1","updated":"2026-08-24 13:44:16.000000000","message":"I do have some additional notes mind you. All things we could fix in follow-ups though","commit_id":"1508188a844eaf1ae4718727d65f5a5e6ee40766"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"a5df6e446f3b7ff0b99620c57d51bf74550bb2d5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"d8808abf_24ea1b98","updated":"2026-08-21 13:52:31.000000000","message":"I\u0027ve endeavored to address all comments, please take a look.","commit_id":"1508188a844eaf1ae4718727d65f5a5e6ee40766"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6fb110087f6e0e8fc9b2ff9c2247ebb0f75c7e47","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"61ffe4f3_078c286a","updated":"2026-08-22 20:59:26.000000000","message":"Will properly review next week. Just addressing one comment.","commit_id":"1508188a844eaf1ae4718727d65f5a5e6ee40766"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"8f0ef24d6ec788737e389cf0c19eb7798574a4f1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"39e81036_9d629dbe","updated":"2026-08-27 14:51:50.000000000","message":"There is a typo \"allers\" \u003d\u003e \"callers\" and some wrong indentation in test_resource_tracker.py (that I\u0027m surprised pep8 does not complain about 😑) but other than that, the updates look good.","commit_id":"853efa4c96982baf7385ce67ae779050eaecf98b"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"4d5e274a967336807345777748c9c69fa0428fde","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"c86a2728_8bfd5638","updated":"2026-08-26 19:24:46.000000000","message":"recheck flake","commit_id":"853efa4c96982baf7385ce67ae779050eaecf98b"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"715eacf612f89dcca6af7b10d49b7bc897145a07","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"4956f2f2_70b90586","updated":"2026-08-27 16:03:17.000000000","message":"Typo and formatting have been fixed, update looks good, Stephen was previously +2, so approving.","commit_id":"318ca9ee790e5c39d9c4b342f2ae85d05c280990"}],"nova/compute/provider_tree.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b127a73b6394c7e739e1012fd32efe6e8bfa3d67","unresolved":true,"context_lines":[{"line_number":728,"context_line":"            provider \u003d self._find_with_lock(name_or_uuid)"},{"line_number":729,"context_line":"            return provider.update_resources(resources)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":"    def subtree(self, name_or_uuid):"},{"line_number":732,"context_line":"        \"\"\"Return a new ProviderTree containing only the subtree rooted at the"},{"line_number":733,"context_line":"        provider identified by name_or_uuid."},{"line_number":734,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"d63d6d77_3fa7d09a","line":731,"range":{"start_line":731,"start_character":8,"end_line":731,"end_character":15},"updated":"2026-03-23 17:49:02.000000000","message":"note this can be subtree in teh case of the livbirt driver but in the ironic cass its a seprate root tree\n\nhttps://en.wikipedia.org/wiki/Tree_(graph_theory)\n\nplacements datamodels is best dsecriped as a forest fo provider trees\n\nfor libvirt we have a signel root provider with nested child providers for pci devices ectra per compute agent.\n\nso its a forest of 1 tree with depth of 2-3 and a breath per layer in the 10s\n\nfor the ironic driver its a depth of 1 were each ironic node is a root rp with no nested resocues.\n\nthe subtree funciton will allow us to only copyt the rp we are modifyting instead fo all the rps for the sibling ironic nodes which shoudl eb a massive win\n\nim not sure if this will be useful for livbirt or other virt driver to use but maybe.","commit_id":"157cff3408e4501c87f2e8d348031d73aa12489d"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"4677da3bed2834fee9cd96a5c95704583403b281","unresolved":false,"context_lines":[{"line_number":728,"context_line":"            provider \u003d self._find_with_lock(name_or_uuid)"},{"line_number":729,"context_line":"            return provider.update_resources(resources)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":"    def subtree(self, name_or_uuid):"},{"line_number":732,"context_line":"        \"\"\"Return a new ProviderTree containing only the subtree rooted at the"},{"line_number":733,"context_line":"        provider identified by name_or_uuid."},{"line_number":734,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ca129d59_68994ac1","line":731,"range":{"start_line":731,"start_character":8,"end_line":731,"end_character":15},"in_reply_to":"b9e6e0b5_0b9dcc39","updated":"2026-08-25 17:52:05.000000000","message":"Yeah, unfortunate for the existing naming ProviderTree actually means multiple separate trees ...  I would not have expected that.","commit_id":"157cff3408e4501c87f2e8d348031d73aa12489d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7cd52585b074fd576dca7ba8339cc1e394942aa6","unresolved":false,"context_lines":[{"line_number":728,"context_line":"            provider \u003d self._find_with_lock(name_or_uuid)"},{"line_number":729,"context_line":"            return provider.update_resources(resources)"},{"line_number":730,"context_line":""},{"line_number":731,"context_line":"    def subtree(self, name_or_uuid):"},{"line_number":732,"context_line":"        \"\"\"Return a new ProviderTree containing only the subtree rooted at the"},{"line_number":733,"context_line":"        provider identified by name_or_uuid."},{"line_number":734,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"b9e6e0b5_0b9dcc39","line":731,"range":{"start_line":731,"start_character":8,"end_line":731,"end_character":15},"in_reply_to":"d63d6d77_3fa7d09a","updated":"2026-07-06 09:36:25.000000000","message":"Acknowledged","commit_id":"157cff3408e4501c87f2e8d348031d73aa12489d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b127a73b6394c7e739e1012fd32efe6e8bfa3d67","unresolved":true,"context_lines":[{"line_number":732,"context_line":"        \"\"\"Return a new ProviderTree containing only the subtree rooted at the"},{"line_number":733,"context_line":"        provider identified by name_or_uuid."},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"        For the Ironic (1:N) driver this is a single root provider plus any"},{"line_number":736,"context_line":"        PCI child providers -- typically O(1-5) entries regardless of N."},{"line_number":737,"context_line":"        Callers that only need to inspect or mutate one node\u0027s data should use"},{"line_number":738,"context_line":"        this instead of copy.deepcopy(whole_tree) to avoid O(N²) behaviour."},{"line_number":739,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"bbef0d57_d1ed45b8","line":736,"range":{"start_line":735,"start_character":67,"end_line":736,"end_character":72},"updated":"2026-03-23 17:49:02.000000000","message":"as noted above this bit i belive is an ai huliscation in the context of ironic.\n\nthere is no conceptaul reason that ironic nodes coudl not have nested resouce provider but they do not today so it will just be the root rp for the relevent ironic node","commit_id":"157cff3408e4501c87f2e8d348031d73aa12489d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ab8eb9c5fd6329103aea28a816253d68281873af","unresolved":false,"context_lines":[{"line_number":732,"context_line":"        \"\"\"Return a new ProviderTree containing only the subtree rooted at the"},{"line_number":733,"context_line":"        provider identified by name_or_uuid."},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"        For the Ironic (1:N) driver this is a single root provider plus any"},{"line_number":736,"context_line":"        PCI child providers -- typically O(1-5) entries regardless of N."},{"line_number":737,"context_line":"        Callers that only need to inspect or mutate one node\u0027s data should use"},{"line_number":738,"context_line":"        this instead of copy.deepcopy(whole_tree) to avoid O(N²) behaviour."},{"line_number":739,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"98d0d0e7_d050d67e","line":736,"range":{"start_line":735,"start_character":67,"end_line":736,"end_character":72},"in_reply_to":"bbef0d57_d1ed45b8","updated":"2026-05-13 17:10:11.000000000","message":"Done","commit_id":"157cff3408e4501c87f2e8d348031d73aa12489d"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7e509f0d905bc843d6700a9fa95be8918580f994","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"84ecb5c3_8f178951","line":788,"range":{"start_line":787,"start_character":8,"end_line":788,"end_character":1},"updated":"2026-08-18 19:53:42.000000000","message":"i guess that is a valid use fo Final type \nhttps://docs.python.org/3/library/typing.html#typing.Final\n\nthis is not a a property however, it will work but stpehn was orginally suggeting using the final decorator on a property\n\nhttps://docs.python.org/3/library/typing.html#typing.final\nrather then type hint on the initaliser.\n\nif we have it as a subclass this is fine\n\ni orginally suggested a property as that allows use to make it readonly without relying on typeing","commit_id":"375be0325f816220ef591fae04030961d37df86a"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"a5df6e446f3b7ff0b99620c57d51bf74550bb2d5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"9f6fa4e7_99789b1a","line":788,"range":{"start_line":787,"start_character":8,"end_line":788,"end_character":1},"in_reply_to":"84ecb5c3_8f178951","updated":"2026-08-21 13:52:31.000000000","message":"It doesn\u0027t seem like the `@final` decorator is supposed to indicate a read-only properly, from the docs: `Decorating a method with @final indicates to a type checker that the method cannot be overridden in a subclass.`.\n\nI decided to move it behind a `@property` though and keep the `Final` type on `self._scope_rp_uuid`.","commit_id":"375be0325f816220ef591fae04030961d37df86a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"270d95ef7bd747a67622722a2536b8ecedb5cbf6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"2e77f363_590f90f3","line":788,"range":{"start_line":787,"start_character":8,"end_line":788,"end_character":1},"in_reply_to":"9f6fa4e7_99789b1a","updated":"2026-08-24 13:39:23.000000000","message":"\u003e It doesn\u0027t seem like the `@final` decorator is supposed to indicate a read-only properly, from the docs: `Decorating a method with @final indicates to a type checker that the method cannot be overridden in a subclass.`.\n\nApologies for the misdirection: I\u0027ve used it on methods and assumed it could be used on properties (which are just special methods after all)\n\n\u003e I decided to move it behind a `@property` though and keep the `Final` type on `self._scope_rp_uuid`.\n\nAck","commit_id":"375be0325f816220ef591fae04030961d37df86a"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"4677da3bed2834fee9cd96a5c95704583403b281","unresolved":true,"context_lines":[{"line_number":779,"context_line":"class ProviderSubTree(ProviderTree):"},{"line_number":780,"context_line":"    \"\"\"Represents a subtree of a ProviderTree."},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    Helpful in doing proficient updates in Ironic driver\u0027s case."},{"line_number":783,"context_line":"    \"\"\""},{"line_number":784,"context_line":""},{"line_number":785,"context_line":"    def __init__(self, scope_rp_uuid: str):"}],"source_content_type":"text/x-python","patch_set":13,"id":"56d6ec2c_1d560d6a","line":782,"updated":"2026-08-25 17:52:05.000000000","message":"Unfortunately I don\u0027t think this sentence is too helpful in explaining the helpfulness of ProviderSubTree. Could we add any more words to include the \"why\"?","commit_id":"2dd126318e72bcb6e4f1d2c2e142d9ea0ccb9347"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"2a9c884fced6130aff880bd675d0af76b6cc64fc","unresolved":false,"context_lines":[{"line_number":779,"context_line":"class ProviderSubTree(ProviderTree):"},{"line_number":780,"context_line":"    \"\"\"Represents a subtree of a ProviderTree."},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    Helpful in doing proficient updates in Ironic driver\u0027s case."},{"line_number":783,"context_line":"    \"\"\""},{"line_number":784,"context_line":""},{"line_number":785,"context_line":"    def __init__(self, scope_rp_uuid: str):"}],"source_content_type":"text/x-python","patch_set":13,"id":"255a3a28_6c0e0533","line":782,"in_reply_to":"56d6ec2c_1d560d6a","updated":"2026-08-26 17:12:47.000000000","message":"Done","commit_id":"2dd126318e72bcb6e4f1d2c2e142d9ea0ccb9347"}],"nova/compute/resource_tracker.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"618e386a9d770ff9cb7fb40352f01b78835ba48a","unresolved":true,"context_lines":[{"line_number":1310,"context_line":"        # Retrieve the provider tree associated with this compute node.  If"},{"line_number":1311,"context_line":"        # it doesn\u0027t exist yet, this will create it with a (single, root)"},{"line_number":1312,"context_line":"        # provider corresponding to the compute node."},{"line_number":1313,"context_line":"        prov_tree \u003d self.reportclient.get_provider_tree_and_ensure_root("},{"line_number":1314,"context_line":"            context, compute_node.uuid, name\u003dcompute_node.hypervisor_hostname,"},{"line_number":1315,"context_line":"            subtree_only\u003dTrue)"},{"line_number":1316,"context_line":"        # Let the virt driver rearrange the provider tree and set/update"},{"line_number":1317,"context_line":"        # the inventory, traits, and aggregates throughout."},{"line_number":1318,"context_line":"        allocs \u003d self.reportclient.get_allocations_for_provider_tree("}],"source_content_type":"text/x-python","patch_set":11,"id":"a2bc20c6_a5144cc1","line":1315,"range":{"start_line":1313,"start_character":0,"end_line":1315,"end_character":30},"updated":"2026-08-24 13:44:16.000000000","message":"based on my suggestion in the next file, you could simplify this to:\n\n```suggestion\n        prov_tree \u003d self.reportclient.get_provider_subtree_and_ensure_root(\n            context, compute_node.uuid, name\u003dcompute_node.hypervisor_hostname)\n```","commit_id":"1508188a844eaf1ae4718727d65f5a5e6ee40766"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"2a9c884fced6130aff880bd675d0af76b6cc64fc","unresolved":false,"context_lines":[{"line_number":1310,"context_line":"        # Retrieve the provider tree associated with this compute node.  If"},{"line_number":1311,"context_line":"        # it doesn\u0027t exist yet, this will create it with a (single, root)"},{"line_number":1312,"context_line":"        # provider corresponding to the compute node."},{"line_number":1313,"context_line":"        prov_tree \u003d self.reportclient.get_provider_tree_and_ensure_root("},{"line_number":1314,"context_line":"            context, compute_node.uuid, name\u003dcompute_node.hypervisor_hostname,"},{"line_number":1315,"context_line":"            subtree_only\u003dTrue)"},{"line_number":1316,"context_line":"        # Let the virt driver rearrange the provider tree and set/update"},{"line_number":1317,"context_line":"        # the inventory, traits, and aggregates throughout."},{"line_number":1318,"context_line":"        allocs \u003d self.reportclient.get_allocations_for_provider_tree("}],"source_content_type":"text/x-python","patch_set":11,"id":"1e7fb7aa_12e87574","line":1315,"range":{"start_line":1313,"start_character":0,"end_line":1315,"end_character":30},"in_reply_to":"a2bc20c6_a5144cc1","updated":"2026-08-26 17:12:47.000000000","message":"Done","commit_id":"1508188a844eaf1ae4718727d65f5a5e6ee40766"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"618e386a9d770ff9cb7fb40352f01b78835ba48a","unresolved":true,"context_lines":[{"line_number":1394,"context_line":"            self.reportclient.update_from_provider_tree("},{"line_number":1395,"context_line":"                context,"},{"line_number":1396,"context_line":"                prov_tree,"},{"line_number":1397,"context_line":"                allocations\u003d("},{"line_number":1398,"context_line":"                    allocs if driver_reshaped or pci_reshaped else None),"},{"line_number":1399,"context_line":"            )"},{"line_number":1400,"context_line":"        except exception.InventoryInUse as e:"},{"line_number":1401,"context_line":"            # This means an inventory reconfiguration (e.g.: removing a parent"}],"source_content_type":"text/x-python","patch_set":11,"id":"6aad653b_6a608f4c","line":1398,"range":{"start_line":1397,"start_character":2,"end_line":1398,"end_character":73},"updated":"2026-08-24 13:44:16.000000000","message":"You can probably revert this now?","commit_id":"1508188a844eaf1ae4718727d65f5a5e6ee40766"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"4677da3bed2834fee9cd96a5c95704583403b281","unresolved":true,"context_lines":[{"line_number":1394,"context_line":"            self.reportclient.update_from_provider_tree("},{"line_number":1395,"context_line":"                context,"},{"line_number":1396,"context_line":"                prov_tree,"},{"line_number":1397,"context_line":"                allocations\u003d("},{"line_number":1398,"context_line":"                    allocs if driver_reshaped or pci_reshaped else None),"},{"line_number":1399,"context_line":"            )"},{"line_number":1400,"context_line":"        except exception.InventoryInUse as e:"},{"line_number":1401,"context_line":"            # This means an inventory reconfiguration (e.g.: removing a parent"}],"source_content_type":"text/x-python","patch_set":11,"id":"fac29b25_28850d4a","line":1398,"range":{"start_line":1397,"start_character":2,"end_line":1398,"end_character":73},"in_reply_to":"6aad653b_6a608f4c","updated":"2026-08-25 17:52:05.000000000","message":"+1","commit_id":"1508188a844eaf1ae4718727d65f5a5e6ee40766"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"2a9c884fced6130aff880bd675d0af76b6cc64fc","unresolved":false,"context_lines":[{"line_number":1394,"context_line":"            self.reportclient.update_from_provider_tree("},{"line_number":1395,"context_line":"                context,"},{"line_number":1396,"context_line":"                prov_tree,"},{"line_number":1397,"context_line":"                allocations\u003d("},{"line_number":1398,"context_line":"                    allocs if driver_reshaped or pci_reshaped else None),"},{"line_number":1399,"context_line":"            )"},{"line_number":1400,"context_line":"        except exception.InventoryInUse as e:"},{"line_number":1401,"context_line":"            # This means an inventory reconfiguration (e.g.: removing a parent"}],"source_content_type":"text/x-python","patch_set":11,"id":"d78f29d7_0c1e6803","line":1398,"range":{"start_line":1397,"start_character":2,"end_line":1398,"end_character":73},"in_reply_to":"fac29b25_28850d4a","updated":"2026-08-26 17:12:47.000000000","message":"Done","commit_id":"1508188a844eaf1ae4718727d65f5a5e6ee40766"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cebd1f7dfc90dbb757e300c76e52355485311319","unresolved":true,"context_lines":[{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def get_provider_tree_and_ensure_root(self, context, rp_uuid, name\u003dNone,"},{"line_number":892,"context_line":"                                          parent_provider_uuid\u003dNone,"},{"line_number":893,"context_line":"                                          subtree_only\u003dFalse):"},{"line_number":894,"context_line":"        \"\"\"Returns a fresh ProviderTree representing all providers which are in"},{"line_number":895,"context_line":"        the same tree or in the same aggregate as the specified provider,"},{"line_number":896,"context_line":"        including their aggregates, traits, and inventories."}],"source_content_type":"text/x-python","patch_set":8,"id":"52c50f5b_1368b8cf","line":893,"updated":"2026-08-12 10:27:34.000000000","message":"nit: could make this kwarg-only. I don\u0027t expect us to ever call this positionally.","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"95f1288e6a4b66920efc0e308d592fe90b9038ed","unresolved":true,"context_lines":[{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def get_provider_tree_and_ensure_root(self, context, rp_uuid, name\u003dNone,"},{"line_number":892,"context_line":"                                          parent_provider_uuid\u003dNone,"},{"line_number":893,"context_line":"                                          subtree_only\u003dFalse):"},{"line_number":894,"context_line":"        \"\"\"Returns a fresh ProviderTree representing all providers which are in"},{"line_number":895,"context_line":"        the same tree or in the same aggregate as the specified provider,"},{"line_number":896,"context_line":"        including their aggregates, traits, and inventories."}],"source_content_type":"text/x-python","patch_set":8,"id":"69a1e2fe_22a950bb","line":893,"in_reply_to":"52c50f5b_1368b8cf","updated":"2026-08-12 12:31:50.000000000","message":"yep nova has not really adopted that convetnion yet but i have no issue with doing it","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"a5df6e446f3b7ff0b99620c57d51bf74550bb2d5","unresolved":true,"context_lines":[{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def get_provider_tree_and_ensure_root(self, context, rp_uuid, name\u003dNone,"},{"line_number":892,"context_line":"                                          parent_provider_uuid\u003dNone,"},{"line_number":893,"context_line":"                                          subtree_only\u003dFalse):"},{"line_number":894,"context_line":"        \"\"\"Returns a fresh ProviderTree representing all providers which are in"},{"line_number":895,"context_line":"        the same tree or in the same aggregate as the specified provider,"},{"line_number":896,"context_line":"        including their aggregates, traits, and inventories."}],"source_content_type":"text/x-python","patch_set":8,"id":"fb1c61e4_746e87d8","line":893,"in_reply_to":"69a1e2fe_22a950bb","updated":"2026-08-21 13:52:31.000000000","message":"I\u0027m not sure I really understand the benefit.\n\nIIUC, I would need to specify a default value for each argument to make each argument a keyword argument? Wouldn\u0027t I want to do that for the rest of the methods in the file/class in order to keep things consistent?","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"2a9c884fced6130aff880bd675d0af76b6cc64fc","unresolved":false,"context_lines":[{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def get_provider_tree_and_ensure_root(self, context, rp_uuid, name\u003dNone,"},{"line_number":892,"context_line":"                                          parent_provider_uuid\u003dNone,"},{"line_number":893,"context_line":"                                          subtree_only\u003dFalse):"},{"line_number":894,"context_line":"        \"\"\"Returns a fresh ProviderTree representing all providers which are in"},{"line_number":895,"context_line":"        the same tree or in the same aggregate as the specified provider,"},{"line_number":896,"context_line":"        including their aggregates, traits, and inventories."}],"source_content_type":"text/x-python","patch_set":8,"id":"3a84cb38_31ef2030","line":893,"in_reply_to":"7fa13b57_330c26a2","updated":"2026-08-26 17:12:47.000000000","message":"Done","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6fb110087f6e0e8fc9b2ff9c2247ebb0f75c7e47","unresolved":true,"context_lines":[{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def get_provider_tree_and_ensure_root(self, context, rp_uuid, name\u003dNone,"},{"line_number":892,"context_line":"                                          parent_provider_uuid\u003dNone,"},{"line_number":893,"context_line":"                                          subtree_only\u003dFalse):"},{"line_number":894,"context_line":"        \"\"\"Returns a fresh ProviderTree representing all providers which are in"},{"line_number":895,"context_line":"        the same tree or in the same aggregate as the specified provider,"},{"line_number":896,"context_line":"        including their aggregates, traits, and inventories."}],"source_content_type":"text/x-python","patch_set":8,"id":"7fa13b57_330c26a2","line":893,"in_reply_to":"fb1c61e4_746e87d8","updated":"2026-08-22 20:59:26.000000000","message":"no no, you just need to make this change:\n\n```suggestion\n                                          *, subtree_only\u003dFalse):\n```\n\nIt just means you have to use the argument name when calling `get_provider_tree_and_ensure_root`:\n\n```\nget_provider_tree_and_ensure_root(ctx, \u0027a-uuid\u0027, subtree_only\u003dTrue)\n```","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cebd1f7dfc90dbb757e300c76e52355485311319","unresolved":true,"context_lines":[{"line_number":913,"context_line":"                             tree.  Callers that will only modify one node\u0027s"},{"line_number":914,"context_line":"                             sub-tree (e.g. the resource tracker\u0027s per-node"},{"line_number":915,"context_line":"                             Placement sync) should pass subtree_only\u003dTrue to"},{"line_number":916,"context_line":"                             avoid O(N²) deepcopy cost.  The caller must then"},{"line_number":917,"context_line":"                             also pass scope_rp_uuid\u003drp_uuid to"},{"line_number":918,"context_line":"                             update_from_provider_tree so that providers"},{"line_number":919,"context_line":"                             outside the sub-tree are not incorrectly removed."},{"line_number":920,"context_line":"        :return: A new ProviderTree object."},{"line_number":921,"context_line":"        \"\"\""},{"line_number":922,"context_line":"        # TODO(efried): We would like to have the caller handle create-and/or-"}],"source_content_type":"text/x-python","patch_set":8,"id":"91fde72d_55b34e3b","line":919,"range":{"start_line":916,"start_character":56,"end_line":919,"end_character":78},"updated":"2026-08-12 10:27:34.000000000","message":"This feels error prone/dangerous. Rather than insisting people hold this right, would it be practical to place a sentinel value on the `ProviderTree` object instead (e.g. `is_subtree`), that the `update_from_provider_tree` method could read and respect?","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"a5df6e446f3b7ff0b99620c57d51bf74550bb2d5","unresolved":false,"context_lines":[{"line_number":913,"context_line":"                             tree.  Callers that will only modify one node\u0027s"},{"line_number":914,"context_line":"                             sub-tree (e.g. the resource tracker\u0027s per-node"},{"line_number":915,"context_line":"                             Placement sync) should pass subtree_only\u003dTrue to"},{"line_number":916,"context_line":"                             avoid O(N²) deepcopy cost.  The caller must then"},{"line_number":917,"context_line":"                             also pass scope_rp_uuid\u003drp_uuid to"},{"line_number":918,"context_line":"                             update_from_provider_tree so that providers"},{"line_number":919,"context_line":"                             outside the sub-tree are not incorrectly removed."},{"line_number":920,"context_line":"        :return: A new ProviderTree object."},{"line_number":921,"context_line":"        \"\"\""},{"line_number":922,"context_line":"        # TODO(efried): We would like to have the caller handle create-and/or-"}],"source_content_type":"text/x-python","patch_set":8,"id":"c887d8ac_3a13aa0c","line":919,"range":{"start_line":916,"start_character":56,"end_line":919,"end_character":78},"in_reply_to":"56459995_bc9389d6","updated":"2026-08-21 13:52:31.000000000","message":"Addressed this by using a subclass of `ProviderTree`: `ProviderSubTree`.","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7e509f0d905bc843d6700a9fa95be8918580f994","unresolved":true,"context_lines":[{"line_number":913,"context_line":"                             tree.  Callers that will only modify one node\u0027s"},{"line_number":914,"context_line":"                             sub-tree (e.g. the resource tracker\u0027s per-node"},{"line_number":915,"context_line":"                             Placement sync) should pass subtree_only\u003dTrue to"},{"line_number":916,"context_line":"                             avoid O(N²) deepcopy cost.  The caller must then"},{"line_number":917,"context_line":"                             also pass scope_rp_uuid\u003drp_uuid to"},{"line_number":918,"context_line":"                             update_from_provider_tree so that providers"},{"line_number":919,"context_line":"                             outside the sub-tree are not incorrectly removed."},{"line_number":920,"context_line":"        :return: A new ProviderTree object."},{"line_number":921,"context_line":"        \"\"\""},{"line_number":922,"context_line":"        # TODO(efried): We would like to have the caller handle create-and/or-"}],"source_content_type":"text/x-python","patch_set":8,"id":"56459995_bc9389d6","line":919,"range":{"start_line":916,"start_character":56,"end_line":919,"end_character":78},"in_reply_to":"8becbd0d_a6815a3d","updated":"2026-08-18 19:53:42.000000000","message":"i proabvly sould not have used a subclasse to avoid needing to do an isInstance check but its a valid approch.\n\ni would have prefered to jsut have ProviderTree and then have scope_rp_uuid be None by default so we could just alwasy pass\n\n`old_uuids \u003d old_tree.get_provider_uuids(new_tree.scope_rp_uuid)`\n\nunconditionally.\n\nthen this because datadiven rahter then branching.","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"95f1288e6a4b66920efc0e308d592fe90b9038ed","unresolved":true,"context_lines":[{"line_number":913,"context_line":"                             tree.  Callers that will only modify one node\u0027s"},{"line_number":914,"context_line":"                             sub-tree (e.g. the resource tracker\u0027s per-node"},{"line_number":915,"context_line":"                             Placement sync) should pass subtree_only\u003dTrue to"},{"line_number":916,"context_line":"                             avoid O(N²) deepcopy cost.  The caller must then"},{"line_number":917,"context_line":"                             also pass scope_rp_uuid\u003drp_uuid to"},{"line_number":918,"context_line":"                             update_from_provider_tree so that providers"},{"line_number":919,"context_line":"                             outside the sub-tree are not incorrectly removed."},{"line_number":920,"context_line":"        :return: A new ProviderTree object."},{"line_number":921,"context_line":"        \"\"\""},{"line_number":922,"context_line":"        # TODO(efried): We would like to have the caller handle create-and/or-"}],"source_content_type":"text/x-python","patch_set":8,"id":"d83c44cc_28f5d759","line":919,"range":{"start_line":916,"start_character":56,"end_line":919,"end_character":78},"in_reply_to":"91fde72d_55b34e3b","updated":"2026-08-12 12:31:50.000000000","message":"that is an interesting question.\nim not sure that would provide the correct semantics.\ni would have to think about the implcations.\n\ni guess the suggetion woudl be to add a proeprty to the ProviderTree class\nand here \nhttps://review.opendev.org/c/openstack/nova/+/980676/8/nova/compute/provider_tree.py\n\nwhen we constuct the subtree we woudl set that\n\nand later update_from_provider_tree could check that property to know if its a subtree or full tree update.\n\nthat should work","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"70cb1fd6d7708cb41563054a6bd6f245ff2cf94d","unresolved":true,"context_lines":[{"line_number":913,"context_line":"                             tree.  Callers that will only modify one node\u0027s"},{"line_number":914,"context_line":"                             sub-tree (e.g. the resource tracker\u0027s per-node"},{"line_number":915,"context_line":"                             Placement sync) should pass subtree_only\u003dTrue to"},{"line_number":916,"context_line":"                             avoid O(N²) deepcopy cost.  The caller must then"},{"line_number":917,"context_line":"                             also pass scope_rp_uuid\u003drp_uuid to"},{"line_number":918,"context_line":"                             update_from_provider_tree so that providers"},{"line_number":919,"context_line":"                             outside the sub-tree are not incorrectly removed."},{"line_number":920,"context_line":"        :return: A new ProviderTree object."},{"line_number":921,"context_line":"        \"\"\""},{"line_number":922,"context_line":"        # TODO(efried): We would like to have the caller handle create-and/or-"}],"source_content_type":"text/x-python","patch_set":8,"id":"8becbd0d_a6815a3d","line":919,"range":{"start_line":916,"start_character":56,"end_line":919,"end_character":78},"in_reply_to":"d83c44cc_28f5d759","updated":"2026-08-12 13:01:42.000000000","message":"\u003e i guess the suggetion woudl be to add a proeprty to the ProviderTree class\n\u003e and here \n\u003e https://review.opendev.org/c/openstack/nova/+/980676/8/nova/compute/provider_tree.py\n\u003e \n\u003e when we constuct the subtree we woudl set that\n\u003e \n\u003e and later update_from_provider_tree could check that property to know if its a subtree or full tree update.\n\u003e \n\u003e that should work\n\nYes, exactly. If we did this via a property, we would ideally hide said property behind `@property` and maybe `@final` too. We could also use a subclass of `ProviderTree` (`ProviderSubtree`?) and rely on a simple `isinstance` check if we preferred that.","commit_id":"706e5823f311805b77d8f358dab3d5bb3d8eb668"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"618e386a9d770ff9cb7fb40352f01b78835ba48a","unresolved":true,"context_lines":[{"line_number":888,"context_line":"            return False"},{"line_number":889,"context_line":"        return (time.time() - refresh_time) \u003e rpar"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def get_provider_tree_and_ensure_root(self, context, rp_uuid, name\u003dNone,"},{"line_number":892,"context_line":"                                          parent_provider_uuid\u003dNone,"},{"line_number":893,"context_line":"                                          subtree_only\u003dFalse):"},{"line_number":894,"context_line":"        \"\"\"Returns a fresh ProviderTree representing all providers which are in"}],"source_content_type":"text/x-python","patch_set":11,"id":"4a790e6b_0de598f8","line":891,"updated":"2026-08-24 13:44:16.000000000","message":"We could/should probably avoid the [flag argument](https://martinfowler.com/bliki/FlagArgument.html) and just provide a separate `get_provider_subtree_and_ensure_root` method now","commit_id":"1508188a844eaf1ae4718727d65f5a5e6ee40766"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"2a9c884fced6130aff880bd675d0af76b6cc64fc","unresolved":false,"context_lines":[{"line_number":888,"context_line":"            return False"},{"line_number":889,"context_line":"        return (time.time() - refresh_time) \u003e rpar"},{"line_number":890,"context_line":""},{"line_number":891,"context_line":"    def get_provider_tree_and_ensure_root(self, context, rp_uuid, name\u003dNone,"},{"line_number":892,"context_line":"                                          parent_provider_uuid\u003dNone,"},{"line_number":893,"context_line":"                                          subtree_only\u003dFalse):"},{"line_number":894,"context_line":"        \"\"\"Returns a fresh ProviderTree representing all providers which are in"}],"source_content_type":"text/x-python","patch_set":11,"id":"724a899a_a7ff5938","line":891,"in_reply_to":"4a790e6b_0de598f8","updated":"2026-08-26 17:12:47.000000000","message":"Done","commit_id":"1508188a844eaf1ae4718727d65f5a5e6ee40766"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"8f0ef24d6ec788737e389cf0c19eb7798574a4f1","unresolved":true,"context_lines":[{"line_number":928,"context_line":""},{"line_number":929,"context_line":"        The subtree rooted at rp_uuid is a deep-copy of"},{"line_number":930,"context_line":"        O(K) providers where K is the subtree size rather than a deep-copy of"},{"line_number":931,"context_line":"        the entire shared tree. This benefits allers that will only modify"},{"line_number":932,"context_line":"        one node\u0027s sub-tree (e.g. the resource tracker\u0027s per-node Placement"},{"line_number":933,"context_line":"        sync)."},{"line_number":934,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"ae0a9cbb_a4f7182f","line":931,"range":{"start_line":931,"start_character":46,"end_line":931,"end_character":52},"updated":"2026-08-27 14:51:50.000000000","message":"callers\n\nThis paragraph text could also stand to be re-wrapped since it seems to end the line very early on L929.","commit_id":"853efa4c96982baf7385ce67ae779050eaecf98b"}],"nova/tests/unit/compute/test_resource_tracker.py":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"8f0ef24d6ec788737e389cf0c19eb7798574a4f1","unresolved":true,"context_lines":[{"line_number":2024,"context_line":"        upt.assert_called_once_with("},{"line_number":2025,"context_line":"    mock.sentinel.ctx,"},{"line_number":2026,"context_line":"    subtree,"},{"line_number":2027,"context_line":"     allocations\u003dmock_get_allocs.return_value)"},{"line_number":2028,"context_line":""},{"line_number":2029,"context_line":"    @mock.patch("},{"line_number":2030,"context_line":"        \u0027nova.compute.resource_tracker.ResourceTracker.\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"bb61c370_ea34e20f","line":2027,"updated":"2026-08-27 14:51:50.000000000","message":"Line wrapping and indentation got weird here.","commit_id":"853efa4c96982baf7385ce67ae779050eaecf98b"}]}
