)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-05-29 04:51:46 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add cpu-teiring with cpu_shares spec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"0d443253_96e973a9","line":7,"updated":"2025-05-29 22:40:01.000000000","message":"cpu-tiering","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-05-29 04:51:46 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add cpu-teiring with cpu_shares spec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"deab98c6_6b26956e","line":7,"in_reply_to":"0d443253_96e973a9","updated":"2025-11-07 15:24:28.000000000","message":"Done","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":true,"context_lines":[{"line_number":7,"context_line":"Add cpu-teiring with cpu_shares spec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"},{"line_number":11,"context_line":"weigher to allow operators to create flavor with"},{"line_number":12,"context_line":"differnt service levels."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"656878e0_0cb51620","line":10,"updated":"2025-05-29 22:40:01.000000000","message":"using","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add cpu-teiring with cpu_shares spec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"},{"line_number":11,"context_line":"weigher to allow operators to create flavor with"},{"line_number":12,"context_line":"differnt service levels."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"c0ed65e5_73ab35f0","line":10,"in_reply_to":"656878e0_0cb51620","updated":"2025-11-07 15:24:28.000000000","message":"Done","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"},{"line_number":11,"context_line":"weigher to allow operators to create flavor with"},{"line_number":12,"context_line":"differnt service levels."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Assisted-By: deepseek-r1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"3b096fab_0bc1551b","line":11,"updated":"2025-05-29 22:40:01.000000000","message":"flavors","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"},{"line_number":11,"context_line":"weigher to allow operators to create flavor with"},{"line_number":12,"context_line":"differnt service levels."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Assisted-By: deepseek-r1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"e4ce0dfc_e44b8b28","line":11,"in_reply_to":"3b096fab_0bc1551b","updated":"2025-11-07 15:24:28.000000000","message":"Done","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":true,"context_lines":[{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"},{"line_number":11,"context_line":"weigher to allow operators to create flavor with"},{"line_number":12,"context_line":"differnt service levels."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Assisted-By: deepseek-r1"},{"line_number":15,"context_line":"Assisted-By: google-gemini-flash-2.5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"19deed48_72236850","line":12,"updated":"2025-05-29 22:40:01.000000000","message":"different","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"},{"line_number":11,"context_line":"weigher to allow operators to create flavor with"},{"line_number":12,"context_line":"differnt service levels."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Assisted-By: deepseek-r1"},{"line_number":15,"context_line":"Assisted-By: google-gemini-flash-2.5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ec897507_0202e614","line":12,"in_reply_to":"19deed48_72236850","updated":"2025-11-07 15:24:28.000000000","message":"Done","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e9813e7ba088b20e0f01b044447348b266911fa9","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-05-30 02:13:21 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add cpu-teiring with cpu_shares spec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"64ad5970_5146a51e","line":7,"range":{"start_line":7,"start_character":8,"end_line":7,"end_character":15},"updated":"2025-06-26 14:18:25.000000000","message":"\"tiering\"","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d54d94d3d181e8dbc74b8d1959773851bfc3882a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Sean Mooney \u003cwork@seanmooney.info\u003e"},{"line_number":5,"context_line":"CommitDate: 2025-05-30 02:13:21 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add cpu-teiring with cpu_shares spec"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"8ad4129d_e5a7d1cf","line":7,"range":{"start_line":7,"start_character":8,"end_line":7,"end_character":15},"in_reply_to":"64ad5970_5146a51e","updated":"2025-10-21 17:46:42.000000000","message":"Acknowledged","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e9813e7ba088b20e0f01b044447348b266911fa9","unresolved":true,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"},{"line_number":11,"context_line":"weigher to allow operators to create flavor with"},{"line_number":12,"context_line":"differnt service levels."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Assisted-By: deepseek-r1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"f8b591ac_a4def29d","line":11,"range":{"start_line":11,"start_character":37,"end_line":11,"end_character":43},"updated":"2025-06-26 14:18:25.000000000","message":"\"flavors\"","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d54d94d3d181e8dbc74b8d1959773851bfc3882a","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"},{"line_number":11,"context_line":"weigher to allow operators to create flavor with"},{"line_number":12,"context_line":"differnt service levels."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Assisted-By: deepseek-r1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"ad568e38_44b6aff3","line":11,"range":{"start_line":11,"start_character":37,"end_line":11,"end_character":43},"in_reply_to":"f8b591ac_a4def29d","updated":"2025-10-21 17:46:42.000000000","message":"Acknowledged","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e9813e7ba088b20e0f01b044447348b266911fa9","unresolved":true,"context_lines":[{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"},{"line_number":11,"context_line":"weigher to allow operators to create flavor with"},{"line_number":12,"context_line":"differnt service levels."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Assisted-By: deepseek-r1"},{"line_number":15,"context_line":"Assisted-By: google-gemini-flash-2.5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"02c9cba3_82c23780","line":12,"range":{"start_line":12,"start_character":0,"end_line":12,"end_character":8},"updated":"2025-06-26 14:18:25.000000000","message":"\"different\"","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d54d94d3d181e8dbc74b8d1959773851bfc3882a","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This change introduces the concept of cpu performance"},{"line_number":10,"context_line":"level usign cgroups, cpu_shares, placement and a new"},{"line_number":11,"context_line":"weigher to allow operators to create flavor with"},{"line_number":12,"context_line":"differnt service levels."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Assisted-By: deepseek-r1"},{"line_number":15,"context_line":"Assisted-By: google-gemini-flash-2.5"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9f28f8d1_f4d93800","line":12,"range":{"start_line":12,"start_character":0,"end_line":12,"end_character":8},"in_reply_to":"02c9cba3_82c23780","updated":"2025-10-21 17:46:42.000000000","message":"Acknowledged","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e9813e7ba088b20e0f01b044447348b266911fa9","unresolved":true,"context_lines":[{"line_number":12,"context_line":"differnt service levels."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Assisted-By: deepseek-r1"},{"line_number":15,"context_line":"Assisted-By: google-gemini-flash-2.5"},{"line_number":16,"context_line":"Change-Id: Ic614df373121642ccc634adb4aba26a3067e58e6"},{"line_number":17,"context_line":"Signed-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"6da6dfb9_c5bb9e11","line":15,"updated":"2025-06-26 14:18:25.000000000","message":"Glad you put this here because it helped explain why the word count is through the roof, but not happy you put this here because of ... the same :/","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":12,"context_line":"differnt service levels."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Assisted-By: deepseek-r1"},{"line_number":15,"context_line":"Assisted-By: google-gemini-flash-2.5"},{"line_number":16,"context_line":"Change-Id: Ic614df373121642ccc634adb4aba26a3067e58e6"},{"line_number":17,"context_line":"Signed-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"c48c8ccf_ea7881d5","line":15,"in_reply_to":"6da6dfb9_c5bb9e11","updated":"2025-06-26 19:57:05.000000000","message":"That is not why this is this length.\n\nIt would have been shorter, but probably at most 10-20% shorter.\n\n\nThat delta is because I would not have taken the time to add things that I think made the spec clearer if I were writing it by hand. \nThe definition section is something I added that I would have skipped, as is the pseudo code for the weigher. I also would not have added as many alternatives.\nits not that i would not have considered them, but at most I would have added\na short paragraph to summarize the approach and left it at that.\n\nthere would have been a lot more spelling and grammar issues too.\n\nai didn\u0027t write the commit message, and I thought I spellchecked it, but not well enough it seems.\n\nThis was what the LLMs first created\nhttps://paste.opendev.org/show/828278/\n\ni rewrote almost everything, partly with ai but also by hand.\nif your interested in how  i documented it here\nhttps://www.seanmooney.info/blog/ai-to-spec/#the-iterative-refinement-process\n\nI spent as much time, if not more time, on this spec than any other one I have written at least when it comes to the first public draft.\n\nwith that siad it is logner then the last spec i wrote https://specs.openstack.org/openstack/nova-specs/specs/2024.2/approved/per-process-healthchecks.html\n\nbut i was actully using\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/2023.1/implemented/pci-device-tracking-in-placement.html\nhttps://specs.openstack.org/openstack/nova-specs/specs/train/implemented/cpu-resources.html\nand\nhttps://specs.openstack.org/openstack/nova-specs/specs/victoria/approved/numa-topology-with-rps.html\n\nas my primary reference and those are some of the longest spec we have ever had.\n\nthat proably influnceed the lenght mroe then anything else.\n\nwell that and we often change them alot in the review process.\n\nif i had reread the healtcheck spec befor wrting this it would have be shorter as i dont hink this is nessisarly more complex then that althoguh it does have palcement interactions that it does not.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":false,"context_lines":[{"line_number":12,"context_line":"differnt service levels."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Assisted-By: deepseek-r1"},{"line_number":15,"context_line":"Assisted-By: google-gemini-flash-2.5"},{"line_number":16,"context_line":"Change-Id: Ic614df373121642ccc634adb4aba26a3067e58e6"},{"line_number":17,"context_line":"Signed-off-by: Sean Mooney \u003cwork@seanmooney.info\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"f38c90c0_36b98af1","line":15,"in_reply_to":"c48c8ccf_ea7881d5","updated":"2025-10-21 17:45:51.000000000","message":"Acknowledged","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"d4cee38b_74d2956f","updated":"2025-05-29 22:40:01.000000000","message":"Thank you for putting this spec together - it\u0027s a significant work product to get this all down, spec\u0027ed and explained.","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6ab5e70ca82d3a22afb05daa5ca985d988106155","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"94d47795_e2b531d8","updated":"2025-06-26 20:31:17.000000000","message":"I\u0027m almost done for the week, haven\u0027t read all this, but skimmed a few of the comments and wanted to reply to two I saw before I disappear.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"30ac3928_4e40ad86","updated":"2025-06-26 14:15:34.000000000","message":"Sean, I assume it\u0027s the fault of the AI, which assumes more convincing-sounding words the better, but this seems beyond the reasonable limit for verbosity. The length and very low SNR is what keeps turning me off from doing a first pass review versus skim. Could we cut this way, way down in size and increase the SNR please?","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"6dcb441ffa2aa2f53d6b384b5aee4f6f11911fac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"b09f5942_d8d93ffc","updated":"2025-06-26 14:52:01.000000000","message":"To clarify my -1, I think the spec is too large : we should split it by twice, one for the weigher and one for the cpu share use case.\n\nFor the cpu shares usage, we should only explain that even if we already have a way to ask for CPU shares by a flavor, we can\u0027t verify the capacity of CPU shares per host and that would be the proposal (resource classes, etc.)","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c2f9fe6f5b17787cc2f24372ead3b07bd34e207b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"8a3f3ce4_a29b4beb","updated":"2025-06-26 20:08:43.000000000","message":"by the way at this point i am not expecting this to be approved by the spec freeze.\n\nill split this and revise it but im more expecting this to be a topic for next cycle at this point. we set a soft spec freeze for june 3rd\nhttps://releases.openstack.org/flamingo/schedule.html#f-nova-spec-soft-freeze\nso i spent a lot of effort to get it ready for that with very little time to do so which started to burn me out.\n\ni had hoped to make alot more progress on this this cycle but im not willing to brun myself out to try and push for this this cycle.\neven if i think we could deliver it this cycle we have enoguh on our plates.\n\ncoming back to it fresh i see ways to simplify it so i really do appropriate the feedback.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"30fc11ba689a980c772f9618f4944a007e928612","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a0c46cb4_d6dd0d80","updated":"2025-05-30 15:40:55.000000000","message":"hum i tought i fixed these locally already.\n\ni did get a clean tox -e docs run before i pushed this but i guess i either didnt save or didnint commit\n\n\n/home/zuul/src/opendev.org/openstack/nova-specs/doc/source/specs/2025.2/approved/cpu-performance-service-level.rst:85: ERROR: Unexpected indentation. [docutils]\n/home/zuul/src/opendev.org/openstack/nova-specs/doc/source/specs/2025.2/approved/cpu-performance-service-level.rst:243: WARNING: Enumerated list ends without a blank line; unexpected unindent. [docutils]\n/home/zuul/src/opendev.org/openstack/nova-specs/doc/source/specs/2025.2/approved/cpu-performance-service-level.rst:252: WARNING: Enumerated list ends without a blank line; unexpected unindent. [docutils]\n/home/zuul/src/opendev.org/openstack/nova-specs/doc/source/specs/2025.2/approved/cpu-performance-service-level.rst:252: WARNING: Inline literal start-string without end-string. [docutils]\n/home/zuul/src/opendev.org/openstack/nova-specs/doc/source/specs/2025.2/approved/cpu-performance-service-level.rst:253: WARNING: Block quote ends without a blank line; unexpected unindent. [docutils]\n/home/zuul/src/opendev.org/openstack/nova-specs/doc/source/specs/2025.2/approved/cpu-performance-service-level.rst:508: WARNING: Bullet list ends without a blank line; unexpected unindent. [docutils]\n/home/zuul/src/opendev.org/openstack/nova-specs/doc/source/specs/2025.2/approved/cpu-performance-service-level.rst:545: WARNING: Bullet list ends without a blank line; unexpected unindent. [docutils]\n/home/zuul/src/opendev.org/openstack/nova-specs/doc/source/specs/2025.2/approved/cpu-performance-service-level.rst:658: WARNING: Bullet list ends without a blank line; unexpected unindent. [docutils]","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a75f4567_f39c6ac3","updated":"2025-06-26 13:22:40.000000000","message":"thanks for taking the time to review.\n\nkey takeaways, \n\n1 the usecase need to be more explicit\n-  cpu pinning is not an option because oversubcription is required.\n- partiion workloads between tiers using aggregates is not desirable as the intent is to increase utilization of the hardware by allowing lower priority workload to fully use the host resources when higher priority worklaods are idle.\n\n2 while i tired to call out that its possible to do this today i did not properly convey that the exiting approach were evaluated and consider not viable to implement by non expert admisntirator. Part of the goal of this propsoal is to ensure that everyone can use this.\n\n3 i shoudl split the wegiher into its own spec and have this depend on or at least be related to that. i see the weigher as the most valuabel part fo this prosoal because its useful for many other usecase sepslcily if i supprot prefered/avoid traits as part fo the sepreate spec.\n\nover all i think i did not convay the intended audiance fo this feature well.\n\nit is expclity not a telco focus or other advanced user target feature its for public cloud adn small enterprise clouds, vmware expats or other cases wehre\ncpu pinnign and realtiem are not the driving factor.\n\nthink universities where tehy want to run batch processing workload ro distibtuated comptue worklaod liek folading@home or boinc in the background  or enterprises cloud with prod(gold)/dev(silver)/ci(bronze) workload sharing a single set of host without needing to partition the compute to do that.\n\nthis should have minimal impact on day 2 operation liek how upgrades are done ensuring its trival to still live migrate worklaod betwen hsot rather then requiring extra cpastiy within specific aggregates.\n\nthe ux i was amining for is something we can confidently recommend to even new users to opesntack without needing years of operational experience to build the solution out of the primitives we offer.i had hopped it could serve as a building block for similar use-cases for disk or network or other qos/capstiyt aware work in the future.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"77cd9ab9_f50dc7bd","updated":"2025-10-14 17:17:16.000000000","message":"I have couple of things inline but I haven\u0027t finished the review yet.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"fb1f4153_2c13f37d","updated":"2025-10-20 15:45:23.000000000","message":"I think I finished the initial review. I would like to see a bit more realistic example maybe with CPU shares to evaluate the logic of the weigher a bit better.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"043e7922_9779b04a","updated":"2025-11-07 15:24:28.000000000","message":"new update pendign shortly","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5691958a2c32841114b1dd936579adf161378f3d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"345d90dc_d92b65e5","updated":"2025-10-14 17:45:53.000000000","message":"thanks gibi. revising this was done pretty quickly to have somethign to dicuss before the ptg. ill be away for the next week so if other want to update this in the mean time please do.\n\ni wont have time to adress your comments until i return but i tried to repsonce inline","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"58981a7eb086167d3f35acd38ceea102d3116f2b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"470b181f_d64f9fce","updated":"2025-11-18 16:00:07.000000000","message":"I crafted a small example inline and I have questions","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":6,"id":"3c79e505_4d7a3bca","updated":"2025-11-07 16:10:41.000000000","message":"this is a highlevel summary of the changes between v5 and v6\n```\nNew use case: Preferred and avoided traits support\n\nFuture work section covering:\nPreferred/avoided traits with scoring algorithm\nPRESSURE_* traits for host pressure reporting\nFour approaches to CPU performance tier levels \n(custom resource classes, traits-based, CPU time microseconds, hybrid)\n\nEnhanced documentation:\nAlgorithm explanations (why requested/free_capacity vs absolute utilization)\nExpanded example calculations with multiple resources\nReference to implementation review\n\nTesting: Mention of scheduler simulator for scale testing\n\nMajor simplifications:\nSequence diagram: Removed implementation-specific code blocks and line numbers\nHostState section: Removed code examples, kept conceptual description\nPerformance section: Simplified and added note about potentially replacing existing weighers\n\nData structure change:\nResource format changed from tuple (capacity, used) to dict {\u0027capacity\u0027: int, \u0027used\u0027: int}\n```\nand here is a more detailed ai generated summary\n\nhttps://gist.github.com/SeanMooney/5a4d7515127bb5c3e617807af1c5abf6\n\ni have tried to resolve most of the preio comment ot make it easier to review and incompeate what i coudl from the ptg dicssion form memory.\n\nwe did not take detailed notes for this topic \n\nhttps://etherpad.opendev.org/p/r.9bac75a686ab0941572757b205c9415c#L809\n\nso i may have missed something but i spend a lot of time trying to call out the conencton to the wider cpu teiring usecase at the cost of makeign the spec longer.\n\nthat is one of the many usecase this treis to enable but we can refine that now that we have the base content to work from.","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"}],"specs/2025.2/approved/cpu-performance-service-level.rst":[{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":true,"context_lines":[{"line_number":102,"context_line":"  resources when there is low contention but reduce them to a lower level"},{"line_number":103,"context_line":"  of performance when higher priority workloads become active. For example,"},{"line_number":104,"context_line":"  running lower priority batch processing jobs when higher priority customer"},{"line_number":105,"context_line":"  workloads are idle."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Proposed change"},{"line_number":108,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"dc28b351_0d2061da","line":105,"updated":"2025-05-29 22:40:01.000000000","message":"This use case is written in a different style. The ones above reference a third party \"A cloud administrator\", \"A user\". This case is written as the first person, \"As a cloud administrator, I ...\"","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"886bb68eea89a17475ccebe335750b0b465be9cc","unresolved":true,"context_lines":[{"line_number":102,"context_line":"  resources when there is low contention but reduce them to a lower level"},{"line_number":103,"context_line":"  of performance when higher priority workloads become active. For example,"},{"line_number":104,"context_line":"  running lower priority batch processing jobs when higher priority customer"},{"line_number":105,"context_line":"  workloads are idle."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Proposed change"},{"line_number":108,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"252526d0_18a575f9","line":105,"in_reply_to":"dc28b351_0d2061da","updated":"2025-05-30 01:32:35.000000000","message":":) thats because this is the use case i wrote by hand in the style i normally uses and the other are derived form the ones uses greg described via ai.\n\ni should proably reword the others to follow this style also for concistency.","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":true,"context_lines":[{"line_number":250,"context_line":"   - Calculate ratio: ``(count of requested traits present on provider) /"},{"line_number":251,"context_line":"     (count of all available traits on provider)``"},{"line_number":252,"context_line":"Introduction"},{"line_number":253,"context_line":"------------"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"4. **Weight Composition**:"}],"source_content_type":"text/x-rst","patch_set":1,"id":"ac41c6a7_bdb8df55","line":253,"updated":"2025-05-29 22:40:01.000000000","message":"This looks misplaced.","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"886bb68eea89a17475ccebe335750b0b465be9cc","unresolved":false,"context_lines":[{"line_number":250,"context_line":"   - Calculate ratio: ``(count of requested traits present on provider) /"},{"line_number":251,"context_line":"     (count of all available traits on provider)``"},{"line_number":252,"context_line":"Introduction"},{"line_number":253,"context_line":"------------"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":""},{"line_number":256,"context_line":"4. **Weight Composition**:"}],"source_content_type":"text/x-rst","patch_set":1,"id":"921d67b4_3c105a8e","line":253,"in_reply_to":"ac41c6a7_bdb8df55","updated":"2025-05-30 01:32:35.000000000","message":"yep removed","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":true,"context_lines":[{"line_number":302,"context_line":"                else:"},{"line_number":303,"context_line":"                    # If no free capacity, this resource class contributes 0 to the score"},{"line_number":304,"context_line":"                    resource_ratios.append(0.0)"},{"line_number":305,"context_line":"        "},{"line_number":306,"context_line":"                    # Calculate the arithmetic mean of ratios across all available"},{"line_number":307,"context_line":"                    # resource classes"},{"line_number":308,"context_line":"                    resource_score \u003d sum(resource_ratios) / len(resource_ratios) \\"}],"source_content_type":"text/x-rst","patch_set":1,"id":"cdd5b66a_67cc8e93","line":305,"updated":"2025-05-29 22:40:01.000000000","message":"extra spacing","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"886bb68eea89a17475ccebe335750b0b465be9cc","unresolved":false,"context_lines":[{"line_number":302,"context_line":"                else:"},{"line_number":303,"context_line":"                    # If no free capacity, this resource class contributes 0 to the score"},{"line_number":304,"context_line":"                    resource_ratios.append(0.0)"},{"line_number":305,"context_line":"        "},{"line_number":306,"context_line":"                    # Calculate the arithmetic mean of ratios across all available"},{"line_number":307,"context_line":"                    # resource classes"},{"line_number":308,"context_line":"                    resource_score \u003d sum(resource_ratios) / len(resource_ratios) \\"}],"source_content_type":"text/x-rst","patch_set":1,"id":"0fb14f6d_65481118","line":305,"in_reply_to":"cdd5b66a_67cc8e93","updated":"2025-05-30 01:32:35.000000000","message":"Done","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":true,"context_lines":[{"line_number":358,"context_line":"    [filter_scheduler]"},{"line_number":359,"context_line":"    # Weight multiplier (default: 0.0)"},{"line_number":360,"context_line":"    resource_provider_weight_multiplier \u003d 1.0"},{"line_number":361,"context_line":"    "},{"line_number":362,"context_line":"    # Resource classes to consider (default: all)"},{"line_number":363,"context_line":"    resource_provider_resources \u003d VCPU_SHARES,MEMORY_MB"},{"line_number":364,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"00cb00d8_28b4cb2c","line":361,"updated":"2025-05-29 22:40:01.000000000","message":"spacing","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"886bb68eea89a17475ccebe335750b0b465be9cc","unresolved":false,"context_lines":[{"line_number":358,"context_line":"    [filter_scheduler]"},{"line_number":359,"context_line":"    # Weight multiplier (default: 0.0)"},{"line_number":360,"context_line":"    resource_provider_weight_multiplier \u003d 1.0"},{"line_number":361,"context_line":"    "},{"line_number":362,"context_line":"    # Resource classes to consider (default: all)"},{"line_number":363,"context_line":"    resource_provider_resources \u003d VCPU_SHARES,MEMORY_MB"},{"line_number":364,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"e1a843cb_7ea8dd6b","line":361,"in_reply_to":"00cb00d8_28b4cb2c","updated":"2025-05-30 01:32:35.000000000","message":"Done","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":true,"context_lines":[{"line_number":381,"context_line":"  .. code-block:: ascii"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"    +-----------------+   +-----------------+   +-----------------+"},{"line_number":384,"context_line":"    |   Gold Instance |   |  Silver Inst 1  |   |  Silver Inst 2  |"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"  .. code-block:: ascii"},{"line_number":387,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"4e5c4b83_3d44f13d","line":384,"updated":"2025-05-29 22:40:01.000000000","message":"Repeated/incomplete block above","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"886bb68eea89a17475ccebe335750b0b465be9cc","unresolved":false,"context_lines":[{"line_number":381,"context_line":"  .. code-block:: ascii"},{"line_number":382,"context_line":""},{"line_number":383,"context_line":"    +-----------------+   +-----------------+   +-----------------+"},{"line_number":384,"context_line":"    |   Gold Instance |   |  Silver Inst 1  |   |  Silver Inst 2  |"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"  .. code-block:: ascii"},{"line_number":387,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"64263f00_da6738fe","line":384,"in_reply_to":"4e5c4b83_3d44f13d","updated":"2025-05-30 01:32:35.000000000","message":"Done","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":true,"context_lines":[{"line_number":504,"context_line":"      the Nova scheduler approach by providing ongoing monitoring and"},{"line_number":505,"context_line":"      optimization, it is not ideal for strict deterministic enforcement"},{"line_number":506,"context_line":"      at the time of placement. The Placement-based approach prevents"},{"line_number":507,"context_line":"      violations from occurring in the first place."},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"* **Static Host Aggregates:** Using host aggregates to group hosts by"},{"line_number":510,"context_line":"  intended service tier capacity and relying on aggregate-specific"}],"source_content_type":"text/x-rst","patch_set":1,"id":"728be977_7aa06210","line":507,"updated":"2025-05-29 22:40:01.000000000","message":"so while Watcher is mot the primary service being proposed to enable this use case, this seems to take Watcher out of the picture entirely - ie: not even as a \"day 2\" operation to maintain a desired state.","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"886bb68eea89a17475ccebe335750b0b465be9cc","unresolved":true,"context_lines":[{"line_number":504,"context_line":"      the Nova scheduler approach by providing ongoing monitoring and"},{"line_number":505,"context_line":"      optimization, it is not ideal for strict deterministic enforcement"},{"line_number":506,"context_line":"      at the time of placement. The Placement-based approach prevents"},{"line_number":507,"context_line":"      violations from occurring in the first place."},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"* **Static Host Aggregates:** Using host aggregates to group hosts by"},{"line_number":510,"context_line":"  intended service tier capacity and relying on aggregate-specific"}],"source_content_type":"text/x-rst","patch_set":1,"id":"f8821ac4_62a98cdc","line":507,"in_reply_to":"728be977_7aa06210","updated":"2025-05-30 01:32:35.000000000","message":"in the scope of a nova spec we do not really need to detail how watcher could contibute to day two operations.\n\nthe more i think about how watcher could be invovled the less convinced i am that i needs to be. at least in the context of developing a new stagey. \n\ni think how the two would interact is that we would enhance watcher ot have a wareness of cpu shares adn then extend the existing workload stableisation strategy \nto be able to leaveage that awareness when blancing workload.\n\ni think where watcher has value in this space would be moving the workloads based on the cpu load to eigher consolidate or distirbute instance to optimise for\none of the following factors: \n- power usage\n- cpu utilisation\n- load distribution\n- contention reductions.\n\nwatcher could do all of the above today without modifyign nova.\nalthough the linx schduler on a hypervior will alwasy be more reactive at achiving an sla so watcher is only useful in this context if there is a gross imblance as it oeprates on the time sale of minutes or hours not seconds.","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":true,"context_lines":[{"line_number":548,"context_line":""},{"line_number":549,"context_line":"* The overhead of cgroup management by the compute driver should be"},{"line_number":550,"context_line":"  minimal, as it leverages existing kernel features and libvirt"},{"line_number":551,"context_line":"      functionality. As a result, it effectively amounts to reporting"},{"line_number":552,"context_line":"      inventories of ``VCPU_SHARES``, weighing hosts based on the available"},{"line_number":553,"context_line":"      resource classes in the provider summaries and generating the"},{"line_number":554,"context_line":"  appropriate libvirt xml to have it enforce cpu shares using the Linux"}],"source_content_type":"text/x-rst","patch_set":1,"id":"c09dd028_59ee8550","line":551,"updated":"2025-05-29 22:40:01.000000000","message":"reason for indentation?","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"886bb68eea89a17475ccebe335750b0b465be9cc","unresolved":true,"context_lines":[{"line_number":548,"context_line":""},{"line_number":549,"context_line":"* The overhead of cgroup management by the compute driver should be"},{"line_number":550,"context_line":"  minimal, as it leverages existing kernel features and libvirt"},{"line_number":551,"context_line":"      functionality. As a result, it effectively amounts to reporting"},{"line_number":552,"context_line":"      inventories of ``VCPU_SHARES``, weighing hosts based on the available"},{"line_number":553,"context_line":"      resource classes in the provider summaries and generating the"},{"line_number":554,"context_line":"  appropriate libvirt xml to have it enforce cpu shares using the Linux"}],"source_content_type":"text/x-rst","patch_set":1,"id":"0018f0db_fa310943","line":551,"in_reply_to":"c09dd028_59ee8550","updated":"2025-05-30 01:32:35.000000000","message":"i asked ai to spell check and it was failign to apply diffs properly 😊\nthis is unfortunatly one of the ways that manifests \n\ni have impvoed this but now it might eb dedented too much,\n\ni ll reviis this again manually.","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":true,"context_lines":[{"line_number":576,"context_line":""},{"line_number":577,"context_line":"Upgrade impact"},{"line_number":578,"context_line":"--------------"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"* Careful consideration is needed for rolling upgrades to ensure"},{"line_number":581,"context_line":"  compatibility with existing instances."},{"line_number":582,"context_line":"* Following the pattern established by the pci in Placement feature, a"}],"source_content_type":"text/x-rst","patch_set":1,"id":"51c8ba29_2aa77a57","line":579,"updated":"2025-05-29 22:40:01.000000000","message":"good thing to think through carefully.","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"886bb68eea89a17475ccebe335750b0b465be9cc","unresolved":false,"context_lines":[{"line_number":576,"context_line":""},{"line_number":577,"context_line":"Upgrade impact"},{"line_number":578,"context_line":"--------------"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"* Careful consideration is needed for rolling upgrades to ensure"},{"line_number":581,"context_line":"  compatibility with existing instances."},{"line_number":582,"context_line":"* Following the pattern established by the pci in Placement feature, a"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5fa90d70_8707bf01","line":579,"in_reply_to":"51c8ba29_2aa77a57","updated":"2025-05-30 01:32:35.000000000","message":"Acknowledged","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":9976,"name":"Ronelle Landy","email":"rlandy@redhat.com","username":"rlandy"},"change_message_id":"5da8d450868268e02910f97e12a71219237da4d7","unresolved":true,"context_lines":[{"line_number":655,"context_line":"  should be possible to add a Tempest test that creates a flavor that"},{"line_number":656,"context_line":"  uses the new flavor extra specs and assert that the instance allocations"},{"line_number":657,"context_line":"  contain the relevant VCPU_SHARES. Alternatively, we can tweak the"},{"line_number":658,"context_line":"  flavors in one of our existing jobs to use this feature for all tests."},{"line_number":659,"context_line":"Documentation Impact"},{"line_number":660,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":661,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"b0adb38a_6e833f83","line":658,"updated":"2025-05-29 22:40:01.000000000","message":"Line break","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"886bb68eea89a17475ccebe335750b0b465be9cc","unresolved":false,"context_lines":[{"line_number":655,"context_line":"  should be possible to add a Tempest test that creates a flavor that"},{"line_number":656,"context_line":"  uses the new flavor extra specs and assert that the instance allocations"},{"line_number":657,"context_line":"  contain the relevant VCPU_SHARES. Alternatively, we can tweak the"},{"line_number":658,"context_line":"  flavors in one of our existing jobs to use this feature for all tests."},{"line_number":659,"context_line":"Documentation Impact"},{"line_number":660,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":661,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"1cf3b45a_5bcfd653","line":658,"in_reply_to":"b0adb38a_6e833f83","updated":"2025-05-30 01:32:35.000000000","message":"Done","commit_id":"e7deb2618ad3ffc7fa58b6d988206a980bed3df9"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Users currently lack a standardized and reliable method within Nova to"},{"line_number":19,"context_line":"request and guarantee specific levels of CPU performance for their"},{"line_number":20,"context_line":"instances. While existing mechanisms like CPU pinning or NUMA topology"},{"line_number":21,"context_line":"awareness provide some control, they are often complex to manage and do not"},{"line_number":22,"context_line":"offer a simple,"},{"line_number":23,"context_line":"quantifiable way to express desired performance tiers across a shared"}],"source_content_type":"text/x-rst","patch_set":3,"id":"cff9eea0_9ded163f","line":20,"updated":"2025-06-25 16:52:37.000000000","message":"nova currently allows to express CPU shares per flavor https://docs.openstack.org/nova/latest/admin/resource-limits.html#cpu-limits\n\nWhat is the real missing bits then ?","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"6dcb441ffa2aa2f53d6b384b5aee4f6f11911fac","unresolved":true,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Users currently lack a standardized and reliable method within Nova to"},{"line_number":19,"context_line":"request and guarantee specific levels of CPU performance for their"},{"line_number":20,"context_line":"instances. While existing mechanisms like CPU pinning or NUMA topology"},{"line_number":21,"context_line":"awareness provide some control, they are often complex to manage and do not"},{"line_number":22,"context_line":"offer a simple,"},{"line_number":23,"context_line":"quantifiable way to express desired performance tiers across a shared"}],"source_content_type":"text/x-rst","patch_set":3,"id":"9bf800a8_659bc2b9","line":20,"in_reply_to":"7d94ebf9_69ce1c71","updated":"2025-06-26 14:52:01.000000000","message":"Right, nothing looks at the current capacity of existing CPU shares","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Users currently lack a standardized and reliable method within Nova to"},{"line_number":19,"context_line":"request and guarantee specific levels of CPU performance for their"},{"line_number":20,"context_line":"instances. While existing mechanisms like CPU pinning or NUMA topology"},{"line_number":21,"context_line":"awareness provide some control, they are often complex to manage and do not"},{"line_number":22,"context_line":"offer a simple,"},{"line_number":23,"context_line":"quantifiable way to express desired performance tiers across a shared"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7d94ebf9_69ce1c71","line":20,"in_reply_to":"cff9eea0_9ded163f","updated":"2025-06-26 13:22:40.000000000","message":"The scheduling and capacity awareness.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":28,"context_line":"The goal is to introduce a mechanism that allows users to request CPU"},{"line_number":29,"context_line":"performance service levels based on CPU shares, providing a more"},{"line_number":30,"context_line":"predictable and manageable approach to CPU resource allocation and"},{"line_number":31,"context_line":"performance guarantees."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Definitions"},{"line_number":34,"context_line":"-----------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7ef475d7_0ad77b8b","line":31,"updated":"2025-06-26 14:15:34.000000000","message":"As will be the theme with many of my comments, I think this section is highly duplicative of the first one such that I had to question if I had accidentally re-read the first one. I understand that AI thinks that more words is better, but this spec is beyond the most extreme level of verbosity I have seen for one of these. It\u0027s well past the point of \"more words makes things more confusing and harder to review.\" Can we trim it down please?","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":28,"context_line":"The goal is to introduce a mechanism that allows users to request CPU"},{"line_number":29,"context_line":"performance service levels based on CPU shares, providing a more"},{"line_number":30,"context_line":"predictable and manageable approach to CPU resource allocation and"},{"line_number":31,"context_line":"performance guarantees."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"Definitions"},{"line_number":34,"context_line":"-----------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"33ef9a59_522e142b","line":31,"in_reply_to":"7ef475d7_0ad77b8b","updated":"2025-06-26 19:57:05.000000000","message":"sure.\n\nnote that while I have used an LLM to help revise this, this is alreeady like version 15+.\n\nwhen i decied to push it i had got to the point where i could nolonger see what i wanted to change and wante dot get some genera feed back so im happy to make this more consie.\n\ni am/was tryign to distile a lot or knowlage into this spec after workingon this for a month on and off. i proably put the better part of 10 fully workdays into this before it was posted for review.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":82,"context_line":"    * Proportional CPU access during contention periods"},{"line_number":83,"context_line":"    * Fair distribution across all runnable threads"},{"line_number":84,"context_line":"    * Predictable performance through share-based prioritization"},{"line_number":85,"context_line":"      under contention"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"Use Cases"},{"line_number":88,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"8eea33d9_d63471e1","line":85,"updated":"2025-06-26 14:15:34.000000000","message":"I don\u0027t think we need these definitions here, They\u0027re highly unusual for a spec, and even the ones that are not core nova material don\u0027t seem to be defined in a detailed enough way to make any difference.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":82,"context_line":"    * Proportional CPU access during contention periods"},{"line_number":83,"context_line":"    * Fair distribution across all runnable threads"},{"line_number":84,"context_line":"    * Predictable performance through share-based prioritization"},{"line_number":85,"context_line":"      under contention"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"Use Cases"},{"line_number":88,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"81199548_b14ad7b4","line":85,"in_reply_to":"8eea33d9_d63471e1","updated":"2025-06-26 19:57:05.000000000","message":"i used \n\nhttps://specs.openstack.org/openstack/nova-specs/specs/train/implemented/cpu-resources.html\nhttps://specs.openstack.org/openstack/nova-specs/specs/ussuri/approved/numa-topology-with-rps.html\nand https://specs.openstack.org/openstack/nova-specs/specs/2023.1/implemented/pci-device-tracking-in-placement.html\n\nas the 3 spec that i wanted ot use to guide the style and lanague of the spec in addtion to the templeate.\n\n\ni added this because it was very well recived in https://specs.openstack.org/openstack/nova-specs/specs/train/implemented/cpu-resources.html#definitions\n\nso this was something i thought would help with clarity by front loading some of the context and definign some concepts peopel may not eb familar with.\n\ni can remove this if needed, but I didn\u0027t find it that unusual.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bb9584b1baca86be04d73fa7b6c4645c30da1d50","unresolved":true,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* A user wants to launch a database server instance and ensure it receives"},{"line_number":91,"context_line":"  a guaranteed minimum level of CPU performance, even under high load"},{"line_number":92,"context_line":"  from other instances on the same host."},{"line_number":93,"context_line":"* A user is running a batch processing job that requires a consistent amount"},{"line_number":94,"context_line":"  of CPU time to complete within a specific timeframe. They need to request"},{"line_number":95,"context_line":"  a performance tier that guarantees this."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3cf7f191_73d946d1","line":92,"updated":"2025-06-25 16:40:35.000000000","message":"Possible solutions:\n* cpu pinning\n* static cpu shares","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* A user wants to launch a database server instance and ensure it receives"},{"line_number":91,"context_line":"  a guaranteed minimum level of CPU performance, even under high load"},{"line_number":92,"context_line":"  from other instances on the same host."},{"line_number":93,"context_line":"* A user is running a batch processing job that requires a consistent amount"},{"line_number":94,"context_line":"  of CPU time to complete within a specific timeframe. They need to request"},{"line_number":95,"context_line":"  a performance tier that guarantees this."}],"source_content_type":"text/x-rst","patch_set":3,"id":"402ba4fb_1d79314c","line":92,"updated":"2025-06-25 16:52:37.000000000","message":"this can be done with CPU pinning or CPU shares definition as said above","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* A user wants to launch a database server instance and ensure it receives"},{"line_number":91,"context_line":"  a guaranteed minimum level of CPU performance, even under high load"},{"line_number":92,"context_line":"  from other instances on the same host."},{"line_number":93,"context_line":"* A user is running a batch processing job that requires a consistent amount"},{"line_number":94,"context_line":"  of CPU time to complete within a specific timeframe. They need to request"},{"line_number":95,"context_line":"  a performance tier that guarantees this."}],"source_content_type":"text/x-rst","patch_set":3,"id":"c539c85f_48a5ea5c","line":92,"in_reply_to":"3cf7f191_73d946d1","updated":"2025-06-26 13:22:40.000000000","message":"cpu pinning is not an alterinitive as it does not allow oversubscription which is a key aspect.\n\nthat why the peroblem description contains \n\"\"\"\n While existing mechanisms like CPU pinning or NUMA topology\nawareness provide some control, they are often complex to manage and do not\noffer a simple,\nquantifiable way to express desired performance tiers across a shared\ninfrastructure, leading to unpredictable performance, especially in\noversubscribed environments ...\n\"\"\"\"\n\nstattic cpu share was the baselien starting point.\ni.e. this spec still uses static cpu share enformce ment but\ntry to remove the need to strict partioning of the cloud into host aggreats.\n\nthat is a very valid alternative and i should capture that in detail in the alternitives section.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* A user wants to launch a database server instance and ensure it receives"},{"line_number":91,"context_line":"  a guaranteed minimum level of CPU performance, even under high load"},{"line_number":92,"context_line":"  from other instances on the same host."},{"line_number":93,"context_line":"* A user is running a batch processing job that requires a consistent amount"},{"line_number":94,"context_line":"  of CPU time to complete within a specific timeframe. They need to request"},{"line_number":95,"context_line":"  a performance tier that guarantees this."}],"source_content_type":"text/x-rst","patch_set":3,"id":"5cb17097_886cece2","line":92,"in_reply_to":"402ba4fb_1d79314c","updated":"2025-06-26 13:22:40.000000000","message":"CPU pinning is not an option for this use case at all because this is intended for an environment that will have a CPU allocation ratio\u003e 1.0\n\nstatic partioning was the ux/opex problem that we were tryign to reduce that the exitng capablities provide.\n\nPerhaps with enough detailed documentation we could elevate that painpoint but it currently very much is a pain point.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"6dcb441ffa2aa2f53d6b384b5aee4f6f11911fac","unresolved":true,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* A user wants to launch a database server instance and ensure it receives"},{"line_number":91,"context_line":"  a guaranteed minimum level of CPU performance, even under high load"},{"line_number":92,"context_line":"  from other instances on the same host."},{"line_number":93,"context_line":"* A user is running a batch processing job that requires a consistent amount"},{"line_number":94,"context_line":"  of CPU time to complete within a specific timeframe. They need to request"},{"line_number":95,"context_line":"  a performance tier that guarantees this."}],"source_content_type":"text/x-rst","patch_set":3,"id":"09e5109a_ffb25bae","line":92,"in_reply_to":"5cb17097_886cece2","updated":"2025-06-26 14:52:01.000000000","message":"Agreed, CPU pinning can\u0027t be done","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"6dcb441ffa2aa2f53d6b384b5aee4f6f11911fac","unresolved":true,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* A user wants to launch a database server instance and ensure it receives"},{"line_number":91,"context_line":"  a guaranteed minimum level of CPU performance, even under high load"},{"line_number":92,"context_line":"  from other instances on the same host."},{"line_number":93,"context_line":"* A user is running a batch processing job that requires a consistent amount"},{"line_number":94,"context_line":"  of CPU time to complete within a specific timeframe. They need to request"},{"line_number":95,"context_line":"  a performance tier that guarantees this."}],"source_content_type":"text/x-rst","patch_set":3,"id":"c077dcb4_eceb54ce","line":92,"in_reply_to":"c539c85f_48a5ea5c","updated":"2025-06-26 14:52:01.000000000","message":"yeah, we can\u0027t use CPU pinning if operators want CPU oversubscription and just CPU SLAs","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bb9584b1baca86be04d73fa7b6c4645c30da1d50","unresolved":true,"context_lines":[{"line_number":92,"context_line":"  from other instances on the same host."},{"line_number":93,"context_line":"* A user is running a batch processing job that requires a consistent amount"},{"line_number":94,"context_line":"  of CPU time to complete within a specific timeframe. They need to request"},{"line_number":95,"context_line":"  a performance tier that guarantees this."},{"line_number":96,"context_line":"* A cloud administrator wants to offer different tiers of compute service"},{"line_number":97,"context_line":"  (e.g., \"Bronze\", \"Silver\", \"Gold\") based on guaranteed CPU performance,"},{"line_number":98,"context_line":"  allowing users to choose the level that best suits their workload and"}],"source_content_type":"text/x-rst","patch_set":3,"id":"54bb9c86_c56181a1","line":95,"updated":"2025-06-25 16:40:35.000000000","message":"ditto","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"6dcb441ffa2aa2f53d6b384b5aee4f6f11911fac","unresolved":true,"context_lines":[{"line_number":92,"context_line":"  from other instances on the same host."},{"line_number":93,"context_line":"* A user is running a batch processing job that requires a consistent amount"},{"line_number":94,"context_line":"  of CPU time to complete within a specific timeframe. They need to request"},{"line_number":95,"context_line":"  a performance tier that guarantees this."},{"line_number":96,"context_line":"* A cloud administrator wants to offer different tiers of compute service"},{"line_number":97,"context_line":"  (e.g., \"Bronze\", \"Silver\", \"Gold\") based on guaranteed CPU performance,"},{"line_number":98,"context_line":"  allowing users to choose the level that best suits their workload and"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ea2d146d_cf1e41e5","line":95,"in_reply_to":"33970b48_bb3590c0","updated":"2025-06-26 14:52:01.000000000","message":"My personal thought was to use some aggregate with multiple metadata, each per GOLD, SILVER and BRONZE (for example).\nThat way, flavors asking for those specs would go to the same hosts, even if they use different tier.\n\nAs I tho said, this current possible usage wouldn\u0027t be able to look at the capacity of the CPU shares, so that\u0027s why I understand the main case.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":92,"context_line":"  from other instances on the same host."},{"line_number":93,"context_line":"* A user is running a batch processing job that requires a consistent amount"},{"line_number":94,"context_line":"  of CPU time to complete within a specific timeframe. They need to request"},{"line_number":95,"context_line":"  a performance tier that guarantees this."},{"line_number":96,"context_line":"* A cloud administrator wants to offer different tiers of compute service"},{"line_number":97,"context_line":"  (e.g., \"Bronze\", \"Silver\", \"Gold\") based on guaranteed CPU performance,"},{"line_number":98,"context_line":"  allowing users to choose the level that best suits their workload and"}],"source_content_type":"text/x-rst","patch_set":3,"id":"33970b48_bb3590c0","line":95,"in_reply_to":"54bb9c86_c56181a1","updated":"2025-06-26 13:22:40.000000000","message":"same repsoponce cpu pinning is not an option because of over subscription and static parttioning while effective is part of the operational knowlage gap that i was tryign to reduce. that is proably the best way to do it today.\n\none out come for this spec my be taking a step back and wrting a detailed doc to descibe how to configure nova to achvie this usecase that in itself woudl be valuabel btu we often get feed back form operator that composign the diffent feature in nova to acivhe a use case if very non obvious.\n\nto do this today we woudl need to use the error prone AggregateInstanceExtraSpecsFilter becasue the AggregateTypeExtraSpecsAffinityFilter was reverted https://review.opendev.org/c/openstack/nova/+/189279\n\nthe diffent in behavior is simple the AggregateInstanceExtraSpecsFilter\nwill allow flavors that dont have quota:cpu_shares set defiend spawn in the aggreate\n\nSo instead of using the extra spec that enforces the cpu shares as the thing we filter on in the host metadata we need to add another key.\n\nif we are doign that anwyway hten the better way to do that is to use https://docs.openstack.org/nova/latest/reference/isolate-aggregates.html\n\nso we would add  trait:CUSTOM_GOAL_CPUS\u003drequired as aggreate metadta and use provider.yaml to advertise the trait or do it via the api.\n\nopenstack --os-compute-api-version 2.53 aggregate set --property trait:CUSTOM_CPU_GOALD\u003drequired ABC\n\nWhere that starts to be a problem is with day 2 operations, such as upgrades, as instead of having 5% extra capacity in your cloud for live migration, you now need to do this per performance domain. That is hard today because, other than disabling the compute services to reserve that capacity, Nova does not provide a way to do that automatically.\n\nthat is part of the problem statement that im tryign to fix with static partioning using host aggrates.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":92,"context_line":"  from other instances on the same host."},{"line_number":93,"context_line":"* A user is running a batch processing job that requires a consistent amount"},{"line_number":94,"context_line":"  of CPU time to complete within a specific timeframe. They need to request"},{"line_number":95,"context_line":"  a performance tier that guarantees this."},{"line_number":96,"context_line":"* A cloud administrator wants to offer different tiers of compute service"},{"line_number":97,"context_line":"  (e.g., \"Bronze\", \"Silver\", \"Gold\") based on guaranteed CPU performance,"},{"line_number":98,"context_line":"  allowing users to choose the level that best suits their workload and"}],"source_content_type":"text/x-rst","patch_set":3,"id":"80e77d7a_15902ee5","line":95,"in_reply_to":"ea2d146d_cf1e41e5","updated":"2025-06-26 19:57:05.000000000","message":"Having an aggregate that can have multiple tiers helps to some degree.\nAlthough I\u0027m not sure that there would be any host not in the aggregate.\n\nWhen I was thinking about this, I was expecting this feature to be used on all hosts in the cloud. so all flavors that use hw:cpu_policy\u003dshared would use a performance tier flavor with hw:cpu_policy\u003ddedicated woudl also form a perfroamce teir of there own becuase of how pinning works but im not entirly sure if you would have both in the same cloud.\n\nThere is nothing preventing that from working, so maybe your diamond tier would just be using cpu pinning.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bb9584b1baca86be04d73fa7b6c4645c30da1d50","unresolved":true,"context_lines":[{"line_number":96,"context_line":"* A cloud administrator wants to offer different tiers of compute service"},{"line_number":97,"context_line":"  (e.g., \"Bronze\", \"Silver\", \"Gold\") based on guaranteed CPU performance,"},{"line_number":98,"context_line":"  allowing users to choose the level that best suits their workload and"},{"line_number":99,"context_line":"  budget."},{"line_number":100,"context_line":"* As a cloud administrator, I want to achieve higher utilization of my"},{"line_number":101,"context_line":"  infrastructure by allowing lower performance tier instances to use more"},{"line_number":102,"context_line":"  resources when there is low contention but reduce them to a lower"}],"source_content_type":"text/x-rst","patch_set":3,"id":"39703e11_1acb8b87","line":99,"updated":"2025-06-25 16:40:35.000000000","message":"flavors can be group by name to express the level of performance. Then the flavor extra spec can be used to implement the promise. Even if it is using pinning or shares.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":96,"context_line":"* A cloud administrator wants to offer different tiers of compute service"},{"line_number":97,"context_line":"  (e.g., \"Bronze\", \"Silver\", \"Gold\") based on guaranteed CPU performance,"},{"line_number":98,"context_line":"  allowing users to choose the level that best suits their workload and"},{"line_number":99,"context_line":"  budget."},{"line_number":100,"context_line":"* As a cloud administrator, I want to achieve higher utilization of my"},{"line_number":101,"context_line":"  infrastructure by allowing lower performance tier instances to use more"},{"line_number":102,"context_line":"  resources when there is low contention but reduce them to a lower"}],"source_content_type":"text/x-rst","patch_set":3,"id":"cb7d867f_62211d64","line":99,"updated":"2025-06-25 16:52:37.000000000","message":"this can be achieved with the flavor extraspec mentioned above","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":96,"context_line":"* A cloud administrator wants to offer different tiers of compute service"},{"line_number":97,"context_line":"  (e.g., \"Bronze\", \"Silver\", \"Gold\") based on guaranteed CPU performance,"},{"line_number":98,"context_line":"  allowing users to choose the level that best suits their workload and"},{"line_number":99,"context_line":"  budget."},{"line_number":100,"context_line":"* As a cloud administrator, I want to achieve higher utilization of my"},{"line_number":101,"context_line":"  infrastructure by allowing lower performance tier instances to use more"},{"line_number":102,"context_line":"  resources when there is low contention but reduce them to a lower"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ec374c44_8d0e8bdc","line":99,"in_reply_to":"39703e11_1acb8b87","updated":"2025-06-26 13:22:40.000000000","message":"yes it can","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"6dcb441ffa2aa2f53d6b384b5aee4f6f11911fac","unresolved":true,"context_lines":[{"line_number":96,"context_line":"* A cloud administrator wants to offer different tiers of compute service"},{"line_number":97,"context_line":"  (e.g., \"Bronze\", \"Silver\", \"Gold\") based on guaranteed CPU performance,"},{"line_number":98,"context_line":"  allowing users to choose the level that best suits their workload and"},{"line_number":99,"context_line":"  budget."},{"line_number":100,"context_line":"* As a cloud administrator, I want to achieve higher utilization of my"},{"line_number":101,"context_line":"  infrastructure by allowing lower performance tier instances to use more"},{"line_number":102,"context_line":"  resources when there is low contention but reduce them to a lower"}],"source_content_type":"text/x-rst","patch_set":3,"id":"668e4d85_32662a53","line":99,"in_reply_to":"aa907229_01a46761","updated":"2025-06-26 14:52:01.000000000","message":"I think I got your point which is \"we can do cpu shares but we miss capacity check of them\", but I\u0027m asking for a clarified spec.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":96,"context_line":"* A cloud administrator wants to offer different tiers of compute service"},{"line_number":97,"context_line":"  (e.g., \"Bronze\", \"Silver\", \"Gold\") based on guaranteed CPU performance,"},{"line_number":98,"context_line":"  allowing users to choose the level that best suits their workload and"},{"line_number":99,"context_line":"  budget."},{"line_number":100,"context_line":"* As a cloud administrator, I want to achieve higher utilization of my"},{"line_number":101,"context_line":"  infrastructure by allowing lower performance tier instances to use more"},{"line_number":102,"context_line":"  resources when there is low contention but reduce them to a lower"}],"source_content_type":"text/x-rst","patch_set":3,"id":"aa907229_01a46761","line":99,"in_reply_to":"cb7d867f_62211d64","updated":"2025-06-26 13:22:40.000000000","message":"correct it but you kind of missed the point.\ni never said we coudl not do the enforcement today we can it just very very error prone to do so.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bb9584b1baca86be04d73fa7b6c4645c30da1d50","unresolved":true,"context_lines":[{"line_number":102,"context_line":"  resources when there is low contention but reduce them to a lower"},{"line_number":103,"context_line":"  level of performance when higher priority workloads become active."},{"line_number":104,"context_line":"  For example, running lower priority batch processing jobs when higher"},{"line_number":105,"context_line":"  priority customer workloads are idle."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Proposed change"},{"line_number":108,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"81691ae5_5f9f6d34","line":105,"updated":"2025-06-25 16:40:35.000000000","message":"This is the core thing I feel. \n\nIf we want to full dynamic then yes what you propose below can be a solution. But do we need to go full dynamic? Or would it be enough to dynamic within the same tier?\n\nI mean what if\n* there are 2 aggregates Gold(aggregate metadata tier\u003dgold), Silver (aggregate metadata tier\u003dsilver)\n* there are flavors\n  * gold_small: vcpus\u003d1, aggregate_instance_extra_specs:tier\u003dgold, quota:cpu_shares\u003d1024\n  * gold_large: vcpus\u003d10, aggregate_instance_extra_specs:tier\u003dgold, quota:cpu_shares\u003d10240\n  * silver_small: vcpus\u003d1, aggregate_instance_extra_specs:tier\u003dsilver, quota:cpu_shares\u003d512\n  * silver_large: vcpus\u003d10, aggregate_instance_extra_specs:tier\u003dsilver, quota:cpu_shares\u003d5120\n\nThis way the scheduler already place the VMs to the right aggregate and within the aggregate the VM can use at least the requested cpu shares, or more if more is available. So it is already dynamic. And requires no change in nova. \n\nSure it needs a bit of an upfront design of tiers \u003d\u003e aggregates and share values. And also the deployer needs to monitor multiple aggregates for overcapacity. While the SLA is not enforced on the shares level it is still enforce by the number of vcpus available on the hypervisor versus the requests vpcus in the flavor.\n\nWhat the customer would gain by mixing the gold tier and silver tier instances on the same hypervisor?","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":102,"context_line":"  resources when there is low contention but reduce them to a lower"},{"line_number":103,"context_line":"  level of performance when higher priority workloads become active."},{"line_number":104,"context_line":"  For example, running lower priority batch processing jobs when higher"},{"line_number":105,"context_line":"  priority customer workloads are idle."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Proposed change"},{"line_number":108,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"6001a61d_933e927c","line":105,"updated":"2025-06-25 16:52:37.000000000","message":"this could be done using aggregates of hosts that would group different set of flavors expressing various CPU share definitions","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":102,"context_line":"  resources when there is low contention but reduce them to a lower"},{"line_number":103,"context_line":"  level of performance when higher priority workloads become active."},{"line_number":104,"context_line":"  For example, running lower priority batch processing jobs when higher"},{"line_number":105,"context_line":"  priority customer workloads are idle."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Proposed change"},{"line_number":108,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"a07035e8_c277f8ff","line":105,"in_reply_to":"2cf2b548_981a601f","updated":"2025-06-26 14:15:34.000000000","message":"I get the \"everything has to be a managed aggregate to keep the non-tiered flavors out\" concern. I think that it\u0027s probably not realistic to have a tiering system without fully tiering everything, but I think we have other reasons why we want more exclusivity on aggregates. Maybe it would be better to focus on that instead of inventing another performance slicing mechanism that has that built in?","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":102,"context_line":"  resources when there is low contention but reduce them to a lower"},{"line_number":103,"context_line":"  level of performance when higher priority workloads become active."},{"line_number":104,"context_line":"  For example, running lower priority batch processing jobs when higher"},{"line_number":105,"context_line":"  priority customer workloads are idle."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Proposed change"},{"line_number":108,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"21374372_db4b398d","line":105,"in_reply_to":"6001a61d_933e927c","updated":"2025-06-26 13:22:40.000000000","message":"It can be, but that is very operationally expensive for day 2 operations\n\nThis spec was written with the starting point that the existing method of doing this with Aggregates was not sufficient to fully file the use case in a reasonable way.\n\nreasonable meaning without needing deep knowledge of why AggregateInstanceExtraSpecsFilter is ill-suited for this use case, even though it appears like it would be at first glance.\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/train/implemented/placement-req-filter-forbidden-aggregates.html","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":102,"context_line":"  resources when there is low contention but reduce them to a lower"},{"line_number":103,"context_line":"  level of performance when higher priority workloads become active."},{"line_number":104,"context_line":"  For example, running lower priority batch processing jobs when higher"},{"line_number":105,"context_line":"  priority customer workloads are idle."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"Proposed change"},{"line_number":108,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"2cf2b548_981a601f","line":105,"in_reply_to":"81691ae5_5f9f6d34","updated":"2025-06-26 13:22:40.000000000","message":"yes it is.\n\nusign aggregate_instance_extra_specs require that you have no flavor that does nto use it.\n\nin the absence of https://review.opendev.org/c/openstack/nova/+/189279\na better approch is to use required traits enforce by placment rather than the AggregateInstanceExtraSpecsFilter","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":111,"context_line":"groups - cgroups) to define and enforce CPU performance service levels."},{"line_number":112,"context_line":"Administrators will be able to specify a desired CPU share multiplier"},{"line_number":113,"context_line":"value when defining flavors that users can select when launching or"},{"line_number":114,"context_line":"resizing an instance. This translates to a relative proportion of"},{"line_number":115,"context_line":"available CPU resources on the host."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"To achieve this, a new ``quota:cpu_shares_multiplier`` flavor extra spec"},{"line_number":118,"context_line":"and ``VCPU_SHARES`` resource class will be introduced. The"},{"line_number":119,"context_line":"``cpu_shares_multiplier`` will be used to calculate the number of"}],"source_content_type":"text/x-rst","patch_set":3,"id":"42a43ed4_cf6e3a0d","line":116,"range":{"start_line":114,"start_character":22,"end_line":116,"end_character":1},"updated":"2025-06-25 16:52:37.000000000","message":"This is the crux of that spec : propose some inventory of existing and predefined CPU shares so that instances could consume them.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":111,"context_line":"groups - cgroups) to define and enforce CPU performance service levels."},{"line_number":112,"context_line":"Administrators will be able to specify a desired CPU share multiplier"},{"line_number":113,"context_line":"value when defining flavors that users can select when launching or"},{"line_number":114,"context_line":"resizing an instance. This translates to a relative proportion of"},{"line_number":115,"context_line":"available CPU resources on the host."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"To achieve this, a new ``quota:cpu_shares_multiplier`` flavor extra spec"},{"line_number":118,"context_line":"and ``VCPU_SHARES`` resource class will be introduced. The"},{"line_number":119,"context_line":"``cpu_shares_multiplier`` will be used to calculate the number of"}],"source_content_type":"text/x-rst","patch_set":3,"id":"79e8fa7f_4d6ac68d","line":116,"range":{"start_line":114,"start_character":22,"end_line":116,"end_character":1},"in_reply_to":"42a43ed4_cf6e3a0d","updated":"2025-06-26 13:22:40.000000000","message":"that is the capsity enforcement element yes.\nand the primary way coupled with the wegiehr to adress the requriement for over subscrption couple with workload balanceing to enable worklaod to be migrated for upgrades ectra without static partioning.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"6dcb441ffa2aa2f53d6b384b5aee4f6f11911fac","unresolved":true,"context_lines":[{"line_number":111,"context_line":"groups - cgroups) to define and enforce CPU performance service levels."},{"line_number":112,"context_line":"Administrators will be able to specify a desired CPU share multiplier"},{"line_number":113,"context_line":"value when defining flavors that users can select when launching or"},{"line_number":114,"context_line":"resizing an instance. This translates to a relative proportion of"},{"line_number":115,"context_line":"available CPU resources on the host."},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"To achieve this, a new ``quota:cpu_shares_multiplier`` flavor extra spec"},{"line_number":118,"context_line":"and ``VCPU_SHARES`` resource class will be introduced. The"},{"line_number":119,"context_line":"``cpu_shares_multiplier`` will be used to calculate the number of"}],"source_content_type":"text/x-rst","patch_set":3,"id":"8643ac3f_19e0646c","line":116,"range":{"start_line":114,"start_character":22,"end_line":116,"end_character":1},"in_reply_to":"79e8fa7f_4d6ac68d","updated":"2025-06-26 14:52:01.000000000","message":"That\u0027s why I wanted to split the spec in two and clarify the purpose of that spec : this is not about support CPU shares (that we do already support) but rather about checking the inventory of such class.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":false,"context_lines":[{"line_number":122,"context_line":""},{"line_number":123,"context_line":"This approach provides a flexible and granular way to manage CPU"},{"line_number":124,"context_line":"performance, allowing for oversubscription while still providing a"},{"line_number":125,"context_line":"mechanism for performance guarantees based on the allocated shares."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"The validation of the new ``quota:cpu_shares_multiplier`` flavor extra spec"},{"line_number":128,"context_line":"will leverage the existing flavor extra spec validation framework"}],"source_content_type":"text/x-rst","patch_set":3,"id":"105c61c1_a624d523","line":125,"updated":"2025-06-25 16:52:37.000000000","message":"agreed","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":123,"context_line":"This approach provides a flexible and granular way to manage CPU"},{"line_number":124,"context_line":"performance, allowing for oversubscription while still providing a"},{"line_number":125,"context_line":"mechanism for performance guarantees based on the allocated shares."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"The validation of the new ``quota:cpu_shares_multiplier`` flavor extra spec"},{"line_number":128,"context_line":"will leverage the existing flavor extra spec validation framework"},{"line_number":129,"context_line":"introduced in the `Flavor Extra Spec Validator`_ specification. This"},{"line_number":130,"context_line":"framework allows for the definition and validation of flavor extra specs,"},{"line_number":131,"context_line":"ensuring correct usage and providing better documentation. A validator"},{"line_number":132,"context_line":"for ``quota:cpu_shares_multiplier`` will be added to the"},{"line_number":133,"context_line":"``nova.api.validation.extra_specs.quota`` module, alongside other"},{"line_number":134,"context_line":"quota-related extra spec validators."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":".. _Flavor Extra Spec Validator: https://specs.openstack.org/openstack/nova-specs/specs/ussuri/implemented/flavor-extra-spec-validators.html"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"870a28b8_e910cb74","line":134,"range":{"start_line":126,"start_character":0,"end_line":134,"end_character":36},"updated":"2025-06-26 14:15:34.000000000","message":"Along with the rest of the extreme verbosity of this spec, I think only the first line of this paragraph offers any value at all.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":123,"context_line":"This approach provides a flexible and granular way to manage CPU"},{"line_number":124,"context_line":"performance, allowing for oversubscription while still providing a"},{"line_number":125,"context_line":"mechanism for performance guarantees based on the allocated shares."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"The validation of the new ``quota:cpu_shares_multiplier`` flavor extra spec"},{"line_number":128,"context_line":"will leverage the existing flavor extra spec validation framework"},{"line_number":129,"context_line":"introduced in the `Flavor Extra Spec Validator`_ specification. This"},{"line_number":130,"context_line":"framework allows for the definition and validation of flavor extra specs,"},{"line_number":131,"context_line":"ensuring correct usage and providing better documentation. A validator"},{"line_number":132,"context_line":"for ``quota:cpu_shares_multiplier`` will be added to the"},{"line_number":133,"context_line":"``nova.api.validation.extra_specs.quota`` module, alongside other"},{"line_number":134,"context_line":"quota-related extra spec validators."},{"line_number":135,"context_line":""},{"line_number":136,"context_line":".. _Flavor Extra Spec Validator: https://specs.openstack.org/openstack/nova-specs/specs/ussuri/implemented/flavor-extra-spec-validators.html"},{"line_number":137,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"910640a1_a5a40b99","line":134,"range":{"start_line":126,"start_character":0,"end_line":134,"end_character":36},"in_reply_to":"870a28b8_e910cb74","updated":"2025-06-26 19:57:05.000000000","message":"this is fair. the verbosity is not entrily because of the llm.\nin this case yes i could make this shorter.\n\nnote this is roughly revisoin 15+ of the spec.\n\ni did a lot of initial work over the course of 2 weeks to refine it before i pushed ti for review, but i was starting to lose track of things like this to refine.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"The primary mechanism for enforcing per-host, per-tier capacity will be through"},{"line_number":139,"context_line":"the use of OpenStack Placement resource classes. This will be combined with"},{"line_number":140,"context_line":"a new ``ResourceProviderWeigher``. Enforcement at the hypervisor level"},{"line_number":141,"context_line":"will be done by the Linux `CFS scheduler`_."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":".. _`CFS scheduler`: https://docs.kernel.org/scheduler/sched-design-CFS.html"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"6c6d41c7_4e3891a4","line":141,"range":{"start_line":140,"start_character":35,"end_line":141,"end_character":43},"updated":"2025-06-25 16:52:37.000000000","message":"that is already there today","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"The primary mechanism for enforcing per-host, per-tier capacity will be through"},{"line_number":139,"context_line":"the use of OpenStack Placement resource classes. This will be combined with"},{"line_number":140,"context_line":"a new ``ResourceProviderWeigher``. Enforcement at the hypervisor level"},{"line_number":141,"context_line":"will be done by the Linux `CFS scheduler`_."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":".. _`CFS scheduler`: https://docs.kernel.org/scheduler/sched-design-CFS.html"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"7f2c9c8d_04331012","line":141,"range":{"start_line":140,"start_character":35,"end_line":141,"end_character":43},"in_reply_to":"6c6d41c7_4e3891a4","updated":"2025-06-26 13:22:40.000000000","message":"correct i am litrally saying above that im going to use the existign enforcement method and providing syntatic sugar to make the existign extra spec less error prone.\n\nmost peole expect `quota:cpu_shares` to scale with the number of vcpus, but it does not.\n\ni cover that more below. we coudl skip doing this but it just means it mroe error prone and confusign to the end user as its not clare that a flavor with \n\nquota:cpu_shares\u003d1000 and vcpus\u003d1 has exactly the same compute time as quota:cpu_shares\u003d1000 and vcpu\u003d10 under contention.\n\nThe latter will have more performance if there is no contention for resouce on a host because it can use up to 10 host cores in paralel but the quota:cpu_shares are defiend per domain not per vcpu.\n\ni am proposign we supprot ``quota:cpu_shares_multiplier``  as a way to have a variatn that scale with the number of vcpus. this is not needed but nice to have.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"The primary mechanism for enforcing per-host, per-tier capacity will be through"},{"line_number":139,"context_line":"the use of OpenStack Placement resource classes. This will be combined with"},{"line_number":140,"context_line":"a new ``ResourceProviderWeigher``. Enforcement at the hypervisor level"},{"line_number":141,"context_line":"will be done by the Linux `CFS scheduler`_."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":".. _`CFS scheduler`: https://docs.kernel.org/scheduler/sched-design-CFS.html"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"d15dfafa_9c302973","line":141,"range":{"start_line":140,"start_character":35,"end_line":141,"end_character":43},"in_reply_to":"7f2c9c8d_04331012","updated":"2025-06-26 14:15:34.000000000","message":"Couldn\u0027t we also add `quota:cpu_shares_per_cpu` and have that scale linearly with the number of CPUs? Maybe I\u0027ll find out below, but the multiplier based approach seems harder and more confusing to me.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"The primary mechanism for enforcing per-host, per-tier capacity will be through"},{"line_number":139,"context_line":"the use of OpenStack Placement resource classes. This will be combined with"},{"line_number":140,"context_line":"a new ``ResourceProviderWeigher``. Enforcement at the hypervisor level"},{"line_number":141,"context_line":"will be done by the Linux `CFS scheduler`_."},{"line_number":142,"context_line":""},{"line_number":143,"context_line":".. _`CFS scheduler`: https://docs.kernel.org/scheduler/sched-design-CFS.html"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"65aee41d_acccf7e3","line":141,"range":{"start_line":140,"start_character":35,"end_line":141,"end_character":43},"in_reply_to":"d15dfafa_9c302973","updated":"2025-06-26 19:57:05.000000000","message":"oh you mean as a boolean. `quota:cpu_shares_per_cpu\u003dTrue|False` right.\n\nThat is kind of what I would like, too, but the reason I didn\u0027t go that way is\nThe cgroup range is  [1, 10000], and  given we can have vms with 1 cpus or 100 vcpus\nI was a littel reclutant to say we will just multiply by 1024.\n\nWe got bit by that with the hardcoded number we used to have, so I used a multiplier solely to avoid that.\n\n\nwhat i was recommending was a value of 100 as a reasonable value for the multiple to allow booting vms with up to 100 cores, but honestly, if we had a better way to map an unknown number fo cpus to a finite range im open to that.\n\n\nis your suggestion taht we use the existing `quota:cpu_shares\u003d100` and the new one\n`quota:cpu_shares_per_cpu\u003dTrue` to say for each flavor.vcpu allcoation 100 shares?\n\nif so then sure i think that is a valid approch and perhaps a littel simpler over all.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":164,"context_line":"  1 VCPU and ``quota:cpu_shares\u003d100`` during CPU contention. By expressing shares"},{"line_number":165,"context_line":"  as a multiplier (``quota:cpu_shares_multiplier\u003d100``), the intuitive"},{"line_number":166,"context_line":"  expectation that a 10-core VM should receive 10 times the CPU resources"},{"line_number":167,"context_line":"  is maintained under contention. Administrators can choose between using"},{"line_number":168,"context_line":"  ``quota:cpu_shares`` or ``quota:cpu_shares_multiplier`` based on their"},{"line_number":169,"context_line":"  preference. Translation to Placement allocations will be opt-in via"},{"line_number":170,"context_line":"  configuration for upgrade compatibility."}],"source_content_type":"text/x-rst","patch_set":3,"id":"3b145fe0_bb947f9b","line":167,"updated":"2025-06-26 14:15:34.000000000","message":"This totally is not intuitive to me. Why would we need to specify the multiplier at 100? Or do you mean vcpus\u003d1,multiplier\u003d100 and vcpus\u003d10,multiplier\u003d100 gives you the 10x increase for the latter? Perhaps I\u0027m just getting stuck on the \"multiplier\" name...","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":164,"context_line":"  1 VCPU and ``quota:cpu_shares\u003d100`` during CPU contention. By expressing shares"},{"line_number":165,"context_line":"  as a multiplier (``quota:cpu_shares_multiplier\u003d100``), the intuitive"},{"line_number":166,"context_line":"  expectation that a 10-core VM should receive 10 times the CPU resources"},{"line_number":167,"context_line":"  is maintained under contention. Administrators can choose between using"},{"line_number":168,"context_line":"  ``quota:cpu_shares`` or ``quota:cpu_shares_multiplier`` based on their"},{"line_number":169,"context_line":"  preference. Translation to Placement allocations will be opt-in via"},{"line_number":170,"context_line":"  configuration for upgrade compatibility."}],"source_content_type":"text/x-rst","patch_set":3,"id":"5dc6f32b_a2ff8531","line":167,"in_reply_to":"3b145fe0_bb947f9b","updated":"2025-06-26 19:57:05.000000000","message":"correct \nvcpus\u003d1,multiplier\u003d100 \u003d\u003e quota:cpu_shares\u003d100 \u003d\u003e resouces:VCPU_SHARES\u003d100\nvcpus\u003d10,multiplier\u003d100 \u003d\u003e quota:cpu_shares\u003d1000 \u003d\u003e resouces:VCPU_SHARES\u003d1000\n\nmaybe its just me but if i see 2 flavors one with flavor.vcpu\u003d1 and the other with flavor.vcpu\u003d10\n\ni woudl generaly expect the latter to have 10X the perforamce.\n\nand it will more or less if we don\u0027t define quota:cpu_shares\n\nbut if do define quota:cpu_shares and forget to multiple it by 10 for the 10 core vm then i suspect that many will be confused that under load the 10 core vm did not have any more perfromnce then the 1 core vm.\n\nbut i think yoru correct. i understand your suggestion related to `quota:cpu_shares_per_cpu` I could likely simplfy this and express it a little mroe clearly with the new boolean option.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6ab5e70ca82d3a22afb05daa5ca985d988106155","unresolved":true,"context_lines":[{"line_number":164,"context_line":"  1 VCPU and ``quota:cpu_shares\u003d100`` during CPU contention. By expressing shares"},{"line_number":165,"context_line":"  as a multiplier (``quota:cpu_shares_multiplier\u003d100``), the intuitive"},{"line_number":166,"context_line":"  expectation that a 10-core VM should receive 10 times the CPU resources"},{"line_number":167,"context_line":"  is maintained under contention. Administrators can choose between using"},{"line_number":168,"context_line":"  ``quota:cpu_shares`` or ``quota:cpu_shares_multiplier`` based on their"},{"line_number":169,"context_line":"  preference. Translation to Placement allocations will be opt-in via"},{"line_number":170,"context_line":"  configuration for upgrade compatibility."}],"source_content_type":"text/x-rst","patch_set":3,"id":"feb9c36e_7c3e24f7","line":167,"in_reply_to":"5dc6f32b_a2ff8531","updated":"2025-06-26 20:31:17.000000000","message":"That\u0027s actually not exactly what I meant, but that would achieve the same goal and probably be better in that we wouldn\u0027t have two conflicting parameters of the same number but with different meaning. Just assuming the default of the per-cpu flag is False means everything continues to work as expected, which is nice.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5a1eb561083ac64262e8d2ba553d87f8189b3639","unresolved":true,"context_lines":[{"line_number":164,"context_line":"  1 VCPU and ``quota:cpu_shares\u003d100`` during CPU contention. By expressing shares"},{"line_number":165,"context_line":"  as a multiplier (``quota:cpu_shares_multiplier\u003d100``), the intuitive"},{"line_number":166,"context_line":"  expectation that a 10-core VM should receive 10 times the CPU resources"},{"line_number":167,"context_line":"  is maintained under contention. Administrators can choose between using"},{"line_number":168,"context_line":"  ``quota:cpu_shares`` or ``quota:cpu_shares_multiplier`` based on their"},{"line_number":169,"context_line":"  preference. Translation to Placement allocations will be opt-in via"},{"line_number":170,"context_line":"  configuration for upgrade compatibility."}],"source_content_type":"text/x-rst","patch_set":3,"id":"a1cf85e2_5198a9ed","line":167,"in_reply_to":"feb9c36e_7c3e24f7","updated":"2025-06-26 22:28:47.000000000","message":"Yep that\u0027s what I was thinking too.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":192,"context_line":"      # min: 1"},{"line_number":193,"context_line":"      # max: 10000"},{"line_number":194,"context_line":"      # default: 100"},{"line_number":195,"context_line":"      vcpu_share_multiplier \u003d 100"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"  * Default multiplier provides granularity for 1% increments and up to 100"},{"line_number":198,"context_line":"    vCPUs per VM."}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa12b617_113001a9","line":195,"updated":"2025-06-26 14:15:34.000000000","message":"This is a different multiplier but named very similarly. That seems very confusing to me.\n\nWhy would we want two different hosts, both with the same number of CPUs to expose different multipliers? Is it because some hosts are dedicated to (more) overcommit? Or are you trying to allow for the relative performance differences between two generations of CPUs?\n\nIf the former, this seems to duplicate/confuse the meaning of the vcpu overcommit ratio for these hosts, no?","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"6ab5e70ca82d3a22afb05daa5ca985d988106155","unresolved":true,"context_lines":[{"line_number":192,"context_line":"      # min: 1"},{"line_number":193,"context_line":"      # max: 10000"},{"line_number":194,"context_line":"      # default: 100"},{"line_number":195,"context_line":"      vcpu_share_multiplier \u003d 100"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"  * Default multiplier provides granularity for 1% increments and up to 100"},{"line_number":198,"context_line":"    vCPUs per VM."}],"source_content_type":"text/x-rst","patch_set":3,"id":"61cfef47_fd8d9a1c","line":195,"in_reply_to":"16a19b4e_b040be35","updated":"2025-06-26 20:31:17.000000000","message":"\u003e i would personally do not like expose any of the cgroups limitation to end users\n\nYea, and codifying the current meaning/limit of cgroup shares in our API is not great either.\n\nCan\u0027t we arbitrarily decide what nova\u0027s range is? Pick a range, and map that to whatever min-max is on the compute node. If we decide a physical cpu is worth 10 points and thus a 16-cpu machine has 1600 shares, we map any value in the flavor to 1-1600. On future machines with 1000 cpus, we\u0027ll do the same proportional assignment. I don\u0027t think we need to be concerned about two machines of vastly different physical characteristics having vastly different promises for what 10% weight means, personally.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5a1eb561083ac64262e8d2ba553d87f8189b3639","unresolved":true,"context_lines":[{"line_number":192,"context_line":"      # min: 1"},{"line_number":193,"context_line":"      # max: 10000"},{"line_number":194,"context_line":"      # default: 100"},{"line_number":195,"context_line":"      vcpu_share_multiplier \u003d 100"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"  * Default multiplier provides granularity for 1% increments and up to 100"},{"line_number":198,"context_line":"    vCPUs per VM."}],"source_content_type":"text/x-rst","patch_set":3,"id":"36fe4564_9cb539fc","line":195,"in_reply_to":"61cfef47_fd8d9a1c","updated":"2025-06-26 22:28:47.000000000","message":"yes perhaps.\n\nI did briefly consider that, but I did not have a good gut feeling about \nis how to reconcile any existing usage of quota:cpu_shares.\n\nWe could just say don\u0027t use both and deprecate, but not remove quota:cpu_shares.\nYou could even use one of the existing filters for that.\n\nI\u0027m personally not concerned with normalizing what 10% of a core is across a lot of different types of servers. Even in one generation, if you\u0027re on a host with 2GHz clock rate vs 4.8GHz 10% has a wildly different meaning. \nThat\u0027s actually where filters like the computer capabilities filter or host aggares or traits have a role IMO.\n\nIf we were ok with having something like quota:cpu_percentage or some other new extra spec like hw:cpu_weight that had a finite range, say 1-1024, and that we\nwould internally map that to the range used by the kernel, whatever that is, I would be happy with that. i personally would not go much beyond 1024 because in reality you probably only going to have like 3 levels, maybe 5, I would also be fine with saying the range is 1-128 or 1-100 for the same reason.\n\nAnd as you said, we just need to choose a single value for the value of a core report to placement, like the upper bound of that range.\n\nIf we do that, then a formula for the value to put in the libvirt domain is something like this\n\n```\nCPU_WEIGHT_MAX \u003d 1024\nCGROUP_MAX \u003d 10000\n\n# caluate what proporation of a core this vm shoudl recive\nflavor_weight \u003d int(flavor.extra_specs[\u0027hw:cpu_weight\u0027])\ncore_weight \u003d (flavor_weight / CPU_WEIGHT_MAX)\n\n# calculate what proportion of the host cores this vms\n# is runnign over.\nshared_cpu_count\u003dlen(CONF.compute.cpu_shared_set)\ncore_allocation_raito \u003d flavor.vcpu / shared_cpu_count\n\nshares  \u003d int(core_allocation_raito * core_weight * CGROUP_MAX)\n\n```\nand the placement request is just\n\n```\nVCPU_SHARES \u003d core_weight * flavor.vcpus * CPU_WEIGHT_MAX\n```\n\nwhich is actully just `flavor_weight * flavor.vcpus` as the CPU_WEIGHT_MAX cancels out.\n\n\nKeeping the existing raw passthoug of cpu_shares value is one of the thng that made this hard to sovle for so if we can remove that its a lot eaiser and more cloudy to do the right thing.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":192,"context_line":"      # min: 1"},{"line_number":193,"context_line":"      # max: 10000"},{"line_number":194,"context_line":"      # default: 100"},{"line_number":195,"context_line":"      vcpu_share_multiplier \u003d 100"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"  * Default multiplier provides granularity for 1% increments and up to 100"},{"line_number":198,"context_line":"    vCPUs per VM."}],"source_content_type":"text/x-rst","patch_set":3,"id":"16a19b4e_b040be35","line":195,"in_reply_to":"fa12b617_113001a9","updated":"2025-06-26 19:57:05.000000000","message":"So I named the same to show that they were directly related.\ni hoped that would reduce confusion.\ni would personally do not like expose any of the cgroups limitation to end users\nor admins but i don\u0027t know how to hide it while having placement enforce capacity\n\nso we can oversubscribe with capacity enforcement, like we do with guaranteed minimum bandwidth.\n\nPerhaps the term multiplier is not expressive enough.\nThis is the problem I am trying to solve with this approach.\n\n - cgroups v2 has a finite range 1-10000\n - That applies to the whole domain, not per cpu.\n - quota:cpu_shares is the value that is put in the libvirt domain and enforced by cgroups, i don\u0027t really want to change its meaning.\n - Since we are scheduling based on the shares of the cpu, I think should track them as an inventory in placement.\n - flavor.vcpu today defines how many logical cores are exposed to the guest.\n - I want to be able to express that a gold flavor has 4 VCPUs and each gets 100% of\n   A core and a silver flavor can also have 4VCPUs, but each gets 50% of a host\n   core.\n\nSo to do ^ I am proposing that  [libvirt]vcpu_share_multiplier \u003d 100\ndefines that the placement VCPU_SHARE inventory will be calculated by multiplying in number of cores in cpu_shared_set by 100.\n\nthe only reason this is configurable is \n\nGold flavor would be created like this\n```\nopenstack flavor create --vcpu 4 --disk 80 --ram 4096 --property \\\nquota:cpu_shares_multiplier\u003d100 gold\n```\nif i understood your suggestion correctly,it would look like this instead\n\n```\nopenstack flavor create --vcpu 4 --disk 80 --ram 4096 --property \\\nquota:cpu_shares\u003d100 --property quota:cpu_shares_per_cpu\u003dTrue gold\n```\nthe silver instance would be \n\n\n```\nopenstack flavor create --vcpu 4 --disk 80 --ram 4096 --property \\\nquota:cpu_shares\u003d50 --property quota:cpu_shares_per_cpu\u003dTrue silver\n```\n\nThe motivation for this approach was to have only 1 place to say how many cpus \nand one place to express how many cpu shared to specify in the libvirt domain\nso that they two can\u0027t get out of sync.\n\n\nWhat we can do today is\n\n```\nopenstack flavor create --vcpu 4 --disk 80 --ram 4096 --property \\\nquota:cpu_shares\u003d400 gold-4\nopenstack flavor create --vcpu 4 --disk 80 --ram 4096 --property \\\nquota:cpu_shares\u003d200 silver-4\n```\n\nmy concern with that approch and what im trying to avoid is you do\n\n```\nopenstack flavor create --vcpu 1 --disk 80 --ram 4096 --property \\\nquota:cpu_shares\u003d100 gold-1\n\nopenstack flavor create --vcpu 4 --disk 80 --ram 4096 --property \\\nquota:cpu_shares\u003d100 gold-4\n\nopenstack flavor create --vcpu 4 --disk 80 --ram 4096 --property \\\nquota:cpu_shares\u003d50 silver-4\n```\n\nwhen there is no contention gold-4 woudl have 4x the perfroamce of gold-1 but\nunder load the total time given to the 4 vcpus in gold-4 would be equal to the time given to the single cpud in gold-1.\n\nthat can be desirable\n\nFor example, if the bronze tier is intended to get 1/4 of the time of a gold tier flavor i.e. 25 share s per core then you coudl manually create it like this today\n\n```\nopenstack flavor create --vcpu 1 --disk 80 --ram 4096 --property \\\nquota:cpu_shares\u003d100 gold-1\n\nopenstack flavor create --vcpu 4 --disk 80 --ram 4096 --property \\\nquota:cpu_shares\u003d400 gold-4\n\nopenstack flavor create --vcpu 4 --disk 80 --ram 4096 --property \\\nquota:cpu_shares\u003d100 bronze-4\n```\n\nor like this with the syntactic sugrare\n\n\n```\nopenstack flavor create --vcpu 1 --disk 80 --ram 4096 --property \\\nquota:cpu_shares\u003d100 --property quota:cpu_shares_per_cpu\u003dTrue gold-1\n\nopenstack flavor create --vcpu 4 --disk 80 --ram 4096 --property \\\nquota:cpu_shares\u003d100 --property quota:cpu_shares_per_cpu\u003dTrue gold-4\n\nopenstack flavor create --vcpu 4 --disk 80 --ram 4096 --property \\\nquota:cpu_shares\u003d25 --property quota:cpu_shares_per_cpu\u003dTrue bronze-4\n```\n\n\nthinking about these examples what I really want to express is more like\n\n```\nopenstack flavor create --vcpu 1 --disk 80 --ram 4096 --property \\\nquota:cpu_percentage\u003d100 gold-1\n\nopenstack flavor create --vcpu 1 --disk 80 --ram 4096 --property \\\nquota:cpu_percentage\u003d50 silver-1\n\nopenstack flavor create --vcpu 1 --disk 80 --ram 4096 --property \\\nquota:cpu_percentage\u003d25 bronze-1\n\n```\nbut since i do not know what the maxium size a flavor can be\n\ni.e. that the largest flavor that will ever be created on this cloud will have 256 vcpus.\n\ni dont see a way to take flavor.vcpus and quota:cpu_percentage\u003d25  to produce the \nshares value i need to populate in the libvirt domain xml\ni.e.  \u003ccputune\u003e\u003cshares\u003e1000\u003c/shares\u003e\u003c/cputune\u003e\nhttps://libvirt.org/formatdomain.html#cpu-tuning\n\nif we coudl tirivally updte the shares value in the domains when you defien your 512 vcpu flavor in 4 years time  it would be easy to map the persentance to a finigte integre range but we cant.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"  * Default multiplier provides granularity for 1% increments and up to 100"},{"line_number":198,"context_line":"    vCPUs per VM."},{"line_number":199,"context_line":"  * The multiplier scales the number of VCPUs requested by the flavor into"},{"line_number":200,"context_line":"    VCPU_SHARES units. The total VCPU_SHARES capacity on a host is calculated"},{"line_number":201,"context_line":"    based on the number of physical cores available for sharing (``cpu_shared_set``)"},{"line_number":202,"context_line":"    and the ``vcpu_share_multiplier`` (e.g., 64 cores * 100 multiplier \u003d 6,400"},{"line_number":203,"context_line":"    shares capacity)."}],"source_content_type":"text/x-rst","patch_set":3,"id":"157e3a0a_cd6ad36f","line":200,"range":{"start_line":199,"start_character":5,"end_line":200,"end_character":22},"updated":"2025-06-26 14:15:34.000000000","message":"...Which multiplier? This one or the one in the flavor? It sounds like you\u0027re referring to the config multiplier, which can\u0027t translate the flavor value into anything...\n\nThis seems very much not in line with the stated goal of making a given share request in a flavor be somewhat consistent across hosts.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":196,"context_line":""},{"line_number":197,"context_line":"  * Default multiplier provides granularity for 1% increments and up to 100"},{"line_number":198,"context_line":"    vCPUs per VM."},{"line_number":199,"context_line":"  * The multiplier scales the number of VCPUs requested by the flavor into"},{"line_number":200,"context_line":"    VCPU_SHARES units. The total VCPU_SHARES capacity on a host is calculated"},{"line_number":201,"context_line":"    based on the number of physical cores available for sharing (``cpu_shared_set``)"},{"line_number":202,"context_line":"    and the ``vcpu_share_multiplier`` (e.g., 64 cores * 100 multiplier \u003d 6,400"},{"line_number":203,"context_line":"    shares capacity)."}],"source_content_type":"text/x-rst","patch_set":3,"id":"37d2d4e1_54ef4989","line":200,"range":{"start_line":199,"start_character":5,"end_line":200,"end_character":22},"in_reply_to":"157e3a0a_cd6ad36f","updated":"2025-06-26 19:57:05.000000000","message":"it was refering to the falvor quota:cpu_share_multipler but your right that is not clear.\n\nIts implied since placement queiry cant depend on the host that is selected but i shoudl have clarified it.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":209,"context_line":"* Overall VCPU Coordination: The standard VCPU inventory and its"},{"line_number":210,"context_line":"  ``cpu_allocation_ratio`` will still be used as the default CPU capacity"},{"line_number":211,"context_line":"  mechanism. The ``cpu_allocation_ratio`` will also be applied to the"},{"line_number":212,"context_line":"  ``VCPU_SHARES`` inventory to ensure oversubscription works as expected."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"ResourceProviderWeigher"},{"line_number":215,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"2725f191_0daf70f1","line":212,"updated":"2025-06-26 14:15:34.000000000","message":"So... I got to here and I\u0027m still not sure how we avoid the problem you assert at the top is only solvable with a new mechanism. Won\u0027t this scheme still end up with non-tiered flavors landing on the so-called tiered hosts?","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":209,"context_line":"* Overall VCPU Coordination: The standard VCPU inventory and its"},{"line_number":210,"context_line":"  ``cpu_allocation_ratio`` will still be used as the default CPU capacity"},{"line_number":211,"context_line":"  mechanism. The ``cpu_allocation_ratio`` will also be applied to the"},{"line_number":212,"context_line":"  ``VCPU_SHARES`` inventory to ensure oversubscription works as expected."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"ResourceProviderWeigher"},{"line_number":215,"context_line":"-----------------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7bcba677_127a2417","line":212,"in_reply_to":"2725f191_0daf70f1","updated":"2025-06-26 19:57:05.000000000","message":"so you\u0027re right, I have not stated that in the spec on reflection.\n\nI was expecting this to work in multiple ways.\n\nFirst the weigher I am proposing below would prefer to avoid host that report\nVCPU_SHARE inventories if the falvor did not request cpu_shares.\n\nthat is the only mencaium in the spec currently.\nwaht i was planning to add in the next revsions is as follows.\n\n1 all compute nodes that support this feature woudl report a new compute_capability trait when [libvirt]report_vcpu_shares is defined\n\nCOMPUTE_CPU_SHARES woudl advertise that the host uses this feature for all vms using vcpus.\n\nwhen  `[filter_scheduler] query_placement_for_vcpu_shares \u003d True` is set\n\nwhich I now realize is only in the upgrade section it wil do 1 of two things\nif a flavor quests cpus shares via the quota extra spec it will compute the number of VCPU_SHARE resouces to request. if they do not it will add a COMPUTE_CPU_SHARES as a forbidden trait.\n\nThis will only apply if hw:cpu_policy is undefined or set to shared or mixed\nFor mixed CPUs it only applies to the floating cpu not the pinned cpus.\n\nflavors with hw:cpu_policy\u003ddeditacte would not be affected by this at all, although we could add a warning or 409 conflict if you tried to use the new extra specs with a pinned vm.\n\nTo me it was obvious but perhaps i should state it in the spec that cpu_shares should only apply to shared cpus, not dedicated ones.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":219,"context_line":"enables capacity-aware scheduling decisions based on both resource"},{"line_number":220,"context_line":"availability and trait compatibility. The weigher behavior can be"},{"line_number":221,"context_line":"summarized as follows: \"select the most boring host\" where boring is"},{"line_number":222,"context_line":"defined as having the least number of traits or resource classes."},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"Input Data Structure"},{"line_number":225,"context_line":"^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":3,"id":"b83c1bc9_7801a931","line":222,"updated":"2025-06-25 16:52:37.000000000","message":"this weigher seems way more generic than just the spec proposal. Couldn\u0027t it be proposed in another spec ?","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":219,"context_line":"enables capacity-aware scheduling decisions based on both resource"},{"line_number":220,"context_line":"availability and trait compatibility. The weigher behavior can be"},{"line_number":221,"context_line":"summarized as follows: \"select the most boring host\" where boring is"},{"line_number":222,"context_line":"defined as having the least number of traits or resource classes."},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"Input Data Structure"},{"line_number":225,"context_line":"^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":3,"id":"e9d20a50_46e1c369","line":222,"in_reply_to":"b83c1bc9_7801a931","updated":"2025-06-26 13:22:40.000000000","message":"It could and I considered that. \n\nThe weigher I describe is one I have wanted to build for about 8 years.\nI also want a second variant of it or perhaps a second enhancement to it to eventually support preferred traits.\n\nI am happy to split the spec.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"6dcb441ffa2aa2f53d6b384b5aee4f6f11911fac","unresolved":true,"context_lines":[{"line_number":219,"context_line":"enables capacity-aware scheduling decisions based on both resource"},{"line_number":220,"context_line":"availability and trait compatibility. The weigher behavior can be"},{"line_number":221,"context_line":"summarized as follows: \"select the most boring host\" where boring is"},{"line_number":222,"context_line":"defined as having the least number of traits or resource classes."},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"Input Data Structure"},{"line_number":225,"context_line":"^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":3,"id":"595ca485_bc4404b5","line":222,"in_reply_to":"e9d20a50_46e1c369","updated":"2025-06-26 14:52:01.000000000","message":"thanks","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":230,"context_line":"- ``resources``: Map of resource class to (capacity, used) tuples"},{"line_number":231,"context_line":"- ``traits``: Set of trait names"},{"line_number":232,"context_line":"- ``parent_provider_uuid``: UUID of parent provider (null for root)"},{"line_number":233,"context_line":"- ``root_provider_uuid``: UUID of tree root provider"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"Algorithm Implementation"},{"line_number":236,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":3,"id":"71b9114b_694a7ea0","line":233,"updated":"2025-06-25 16:52:37.000000000","message":"that is existent already","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":230,"context_line":"- ``resources``: Map of resource class to (capacity, used) tuples"},{"line_number":231,"context_line":"- ``traits``: Set of trait names"},{"line_number":232,"context_line":"- ``parent_provider_uuid``: UUID of parent provider (null for root)"},{"line_number":233,"context_line":"- ``root_provider_uuid``: UUID of tree root provider"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"Algorithm Implementation"},{"line_number":236,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":3,"id":"4fc89463_94111de9","line":233,"in_reply_to":"71b9114b_694a7ea0","updated":"2025-06-26 13:22:40.000000000","message":"i dont know what you eman by that comment.\n\nprovider symmerses are a thing yes btu the weigher and filters are not given access to them.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":false,"context_lines":[{"line_number":232,"context_line":"- ``parent_provider_uuid``: UUID of parent provider (null for root)"},{"line_number":233,"context_line":"- ``root_provider_uuid``: UUID of tree root provider"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"Algorithm Implementation"},{"line_number":236,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"1. Tree Flattening"}],"source_content_type":"text/x-rst","patch_set":3,"id":"2772cdc9_aa5d3d45","line":235,"updated":"2025-06-25 16:52:37.000000000","message":"not sure that section is helpful but whatever","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":232,"context_line":"- ``parent_provider_uuid``: UUID of parent provider (null for root)"},{"line_number":233,"context_line":"- ``root_provider_uuid``: UUID of tree root provider"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"Algorithm Implementation"},{"line_number":236,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"1. Tree Flattening"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7be1f475_b011f349","line":235,"in_reply_to":"2772cdc9_aa5d3d45","updated":"2025-06-26 13:22:40.000000000","message":"i am very surprised by this comemnt as the algorithm of any weigher is vital to encode in the spec. It is not something that should be defined in the implementation.\n\nIf anyone were proposing a spec for a weigher, I would ask them to encode the logic of the algorithm in the spec or blueprint so ensure we agree on the design before we approved it.\n\nIf you commented on the pseudocode, I would agree.\nThat is not needed, but sometimes Python or almost Python\nis clearer to readers than an English summary.\n\nI have no real issue removing that.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":232,"context_line":"- ``parent_provider_uuid``: UUID of parent provider (null for root)"},{"line_number":233,"context_line":"- ``root_provider_uuid``: UUID of tree root provider"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"Algorithm Implementation"},{"line_number":236,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"1. Tree Flattening"}],"source_content_type":"text/x-rst","patch_set":3,"id":"af8c3a2b_785bb45c","line":235,"in_reply_to":"7be1f475_b011f349","updated":"2025-06-26 14:15:34.000000000","message":"I assume Sylvain is mentioning this because you\u0027ve basically duplicated all of this in the comments and code below. The english \"algorithm implementation\" is very difficult for me to follow, but the pseudocode (plus comments) is much easier.\n\nGiven this spec is probably longer than the sum total of all specs we\u0027ve merged in some cycles, I think opportunities to trim out duplicative parts is very welcome. As is pushing this weigher out to another spec, which I think is probably best.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"6dcb441ffa2aa2f53d6b384b5aee4f6f11911fac","unresolved":true,"context_lines":[{"line_number":232,"context_line":"- ``parent_provider_uuid``: UUID of parent provider (null for root)"},{"line_number":233,"context_line":"- ``root_provider_uuid``: UUID of tree root provider"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"Algorithm Implementation"},{"line_number":236,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"1. Tree Flattening"}],"source_content_type":"text/x-rst","patch_set":3,"id":"ae2ddd47_1b729d33","line":235,"in_reply_to":"7be1f475_b011f349","updated":"2025-06-26 14:52:01.000000000","message":"we could discuss that point in the splitted spec for that only weigher","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":232,"context_line":"- ``parent_provider_uuid``: UUID of parent provider (null for root)"},{"line_number":233,"context_line":"- ``root_provider_uuid``: UUID of tree root provider"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"Algorithm Implementation"},{"line_number":236,"context_line":"^^^^^^^^^^^^^^^^^^^^^^^^^"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"1. Tree Flattening"}],"source_content_type":"text/x-rst","patch_set":3,"id":"0a881e0b_48f879e9","line":235,"in_reply_to":"ae2ddd47_1b729d33","updated":"2025-06-26 19:57:05.000000000","message":"ack, the algorithm is what I wrote by hand\n\nThe pseudocode is what was generated by the AI, although I had to fix some of the code and comments to actually do what i wanted.\n\nhttps://review.opendev.org/c/openstack/nova/+/953131/1/nova/scheduler/weights/resource_provider.py is a maybe working version of it with some unit tests but that is still very much a draft.\n\nthe comment are actully better in the psudocode  version than my current draft\nso there is defintly room for improvement.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":false,"context_lines":[{"line_number":282,"context_line":""},{"line_number":283,"context_line":"        # 2. Resource Calculation"},{"line_number":284,"context_line":"        available_resource_classes \u003d aggregated_resources.keys()"},{"line_number":285,"context_line":"        if not available_resource_classes:"},{"line_number":286,"context_line":"            # Handle case with no available resources"},{"line_number":287,"context_line":"            resource_score \u003d 0.0"},{"line_number":288,"context_line":"        else:"},{"line_number":289,"context_line":"            for res_class in available_resource_classes:"},{"line_number":290,"context_line":"                capacity \u003d aggregated_resources[res_class][\u0027capacity\u0027]"},{"line_number":291,"context_line":"                used \u003d aggregated_resources[res_class][\u0027used\u0027]"}],"source_content_type":"text/x-rst","patch_set":3,"id":"c2ed045b_5038f099","line":288,"range":{"start_line":285,"start_character":7,"end_line":288,"end_character":13},"updated":"2025-06-26 19:57:05.000000000","message":"this was one thing i missed in my manulaly editing \nwe shoudl never have a host with 0 resouces.\ni can supprot that but in my actual poc i remove this check.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":false,"context_lines":[{"line_number":309,"context_line":"        # 3. Trait Calculation"},{"line_number":310,"context_line":"        if not aggregated_traits:"},{"line_number":311,"context_line":"             # Handle case with no available traits."},{"line_number":312,"context_line":"             trait_score \u003d 0.0"},{"line_number":313,"context_line":"        else:"},{"line_number":314,"context_line":"            matched_traits_count \u003d len(requested_traits.intersection(aggregated_traits))"},{"line_number":315,"context_line":"            available_traits_count \u003d len(aggregated_traits)"}],"source_content_type":"text/x-rst","patch_set":3,"id":"81952b51_775d45a4","line":312,"updated":"2025-06-26 19:57:05.000000000","message":"for traits whiel very unlikely this is technialy posible so\ni kept this in the poc.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":325,"context_line":"        # ratios (closer to 1), which happens when requested amount is close"},{"line_number":326,"context_line":"        # to free capacity. This is not what we want. We want a higher score"},{"line_number":327,"context_line":"        # for less utilized resources. The current formula 1 - (requested /"},{"line_number":328,"context_line":"        # available) gives a higher score for less utilized. This seems"},{"line_number":329,"context_line":"        # correct for the resource part."},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"        # For traits, a higher trait_score means the requested traits and"},{"line_number":332,"context_line":"        # available traits are closely aligned. As a host will never have fewer"}],"source_content_type":"text/x-rst","patch_set":3,"id":"2fa59533_b87db7ae","line":329,"range":{"start_line":328,"start_character":8,"end_line":329,"end_character":40},"updated":"2025-06-26 19:57:05.000000000","message":"`available) gives a higher score for less-utilized hosts.`","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":337,"context_line":"        # traits) / (available traits) gives a higher score for more matched"},{"line_number":338,"context_line":"        # traits."},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"        # Combine resource and adjusted trait scores"},{"line_number":341,"context_line":"        # A higher combined score indicates a more \"boring\" host (less"},{"line_number":342,"context_line":"        # utilized resources, fewer requested traits present)."},{"line_number":343,"context_line":"        combined_score \u003d (resource_score + trait_score) / 2.0"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"        # Apply multiplier from scheduler configuration."},{"line_number":346,"context_line":"        weight \u003d combined_score * self.weight_multiplier(host_state)"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"        return weight"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":""},{"line_number":351,"context_line":"Configuration"}],"source_content_type":"text/x-rst","patch_set":3,"id":"96859b34_c593f635","line":348,"range":{"start_line":340,"start_character":2,"end_line":348,"end_character":21},"updated":"2025-06-26 19:57:05.000000000","message":"```\n        # Combine resource and adjusted trait scores\n        # A higher combined score indicates a more \"boring\" host (less\n        # utilized resources, fewer requested traits present).\n        return (resource_score + trait_score) / 2.0\n```\n\nin the real code, the multiplier is applied separately.\n\nwe return the raw values then we get the min/max value and normalise the result between 0.0 and 1.0 finally we multipie by the weigher multipler ot scale the normalised vlaues.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c27c1e9dbdaf95f04b4401aa3a957d0ff3b8d0b0","unresolved":true,"context_lines":[{"line_number":358,"context_line":"    # Weight multiplier (default: 0.0)"},{"line_number":359,"context_line":"    resource_provider_weight_multiplier \u003d 1.0"},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"    # Resource classes to consider (default: all)"},{"line_number":362,"context_line":"    resource_provider_resources \u003d VCPU_SHARES,MEMORY_MB"},{"line_number":363,"context_line":""},{"line_number":364,"context_line":"    # Traits to require (default: all)"}],"source_content_type":"text/x-rst","patch_set":3,"id":"74b09420_2f1a2663","line":361,"range":{"start_line":361,"start_character":45,"end_line":361,"end_character":48},"updated":"2025-05-30 17:07:02.000000000","message":"also the actual default will like by Python None but that will traslate to looking at all resouce classes/traits.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c27c1e9dbdaf95f04b4401aa3a957d0ff3b8d0b0","unresolved":true,"context_lines":[{"line_number":366,"context_line":""},{"line_number":367,"context_line":"Example calculation for a VM requesting 2 VCPUs and SSD trait::"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"  HostA resources: VCPU avail\u003d4"},{"line_number":370,"context_line":"  HostA traits: SSD, HW_CPU_X86_AVX2"},{"line_number":371,"context_line":"  Resource score: 1 - (2/4) \u003d 0.5"},{"line_number":372,"context_line":"  Trait score: (1/2) \u003d 0.5"}],"source_content_type":"text/x-rst","patch_set":3,"id":"e3486f3b_0d7937e4","line":369,"range":{"start_line":369,"start_character":30,"end_line":369,"end_character":31},"updated":"2025-05-30 17:07:02.000000000","message":"changing this to 8 might make the math a little more obvious.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":375,"context_line":"Diagrams and Examples"},{"line_number":376,"context_line":"---------------------"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"* Virtual Machine Resource Contention Diagram:"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"  .. code-block:: bash"},{"line_number":381,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"b0c8b517_eecbb0ab","line":378,"updated":"2025-06-25 16:52:37.000000000","message":"note to other reviewers : we\u0027re back to the other proposal, which is to inventorize the CPU shares.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":375,"context_line":"Diagrams and Examples"},{"line_number":376,"context_line":"---------------------"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"* Virtual Machine Resource Contention Diagram:"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"  .. code-block:: bash"},{"line_number":381,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"ccf47e4f_a6062469","line":378,"in_reply_to":"a2a4e817_8fcc8080","updated":"2025-06-26 14:15:34.000000000","message":"FWIW, it feels to me exactly like Sylvain said, that we took a detour to talk about the weigher, and now we\u0027re back to the main topic.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":375,"context_line":"Diagrams and Examples"},{"line_number":376,"context_line":"---------------------"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"* Virtual Machine Resource Contention Diagram:"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"  .. code-block:: bash"},{"line_number":381,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"a2a4e817_8fcc8080","line":378,"in_reply_to":"b0c8b517_eecbb0ab","updated":"2025-06-26 13:22:40.000000000","message":"its not really 2 diffent propsoals\n\nthere are 3 aspects,\n- reporting capacity as inventories in\n- syntactic sugar to allow expressign the number of cpu_shares to request as a mutiple of the flavor.vcpu and the associated logic to translate that into a placement request.\n- share aware weiging and host selection.\n\n\ni intentionally wrote the weighter to be generic over all rescous classes and trait to show its general utilty ot adressing capaity aware scheduling for many usesase not just the edge case need for cpu_shares. Since that is an independently valuable change, i am happy to encode it as a spereate spec that this one woudl depend on.\n\nif i do that i could also expand the scope of the weigher spec to supprot prefered and avoided triats without feelling like it too out of socpe of the main effort.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":429,"context_line":""},{"line_number":430,"context_line":"        # Create flavors with different CPU share multipliers"},{"line_number":431,"context_line":"        $ openstack flavor create --vcpus 1 --ram 1024 --disk 10 bronze"},{"line_number":432,"context_line":"        $ openstack flavor set bronze --property quota:cpu_shares_multiplier\u003d25.0"},{"line_number":433,"context_line":""},{"line_number":434,"context_line":"        $ openstack flavor create --vcpus 1 --ram 2048 --disk 20 silver"},{"line_number":435,"context_line":"        $ openstack flavor set silver --property quota:cpu_shares_multiplier\u003d50.0"}],"source_content_type":"text/x-rst","patch_set":3,"id":"86130326_447ac32c","line":432,"range":{"start_line":432,"start_character":49,"end_line":432,"end_character":81},"updated":"2025-06-26 19:57:05.000000000","message":"i intened this to be an integer multiplier\n\ni feel like im going to end up replacing this with dans suggestion anyway unless folks have other ideas.\n\nbased on the the set of constraits i was trying to solve for this was the best solution i coudl reason abvout but im very much open to alternitives.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":466,"context_line":"            allocation_ratio: 1.0"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"  **Limitations:**"},{"line_number":469,"context_line":"  - Static configuration unable to adapt to host changes."},{"line_number":470,"context_line":"  - No direct correlation with cgroups capacity."},{"line_number":471,"context_line":"  - Manual maintenance overhead."},{"line_number":472,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"9981b945_b8a577ac","line":469,"updated":"2025-06-26 14:15:34.000000000","message":"Unable to adapt to ... a host growing new CPUs? TBH, I kinda feel like the per-cpu share value should just be something we encode (i.e. 100x or 1000x) or we should just let them expose it via the yaml here. The former feels a lot easier to reason about, and something we can just document as a constant about how nova works, without losing much.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":466,"context_line":"            allocation_ratio: 1.0"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"  **Limitations:**"},{"line_number":469,"context_line":"  - Static configuration unable to adapt to host changes."},{"line_number":470,"context_line":"  - No direct correlation with cgroups capacity."},{"line_number":471,"context_line":"  - Manual maintenance overhead."},{"line_number":472,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"25a7de1f_f5080e4a","line":469,"in_reply_to":"9981b945_b8a577ac","updated":"2025-06-26 19:57:05.000000000","message":"well provider.yaml cant expsoe standard resouce classes but id we allowed that its not terrible\n\nwhat i actully ment here is not \"host changes\" but \"host differences\"\n\ni was thinkign about the impact of this approch on installer tools\n\nwhile its possibe to render per host config in most tools ti was not true of tripleo or our new installer.\n\nIf we take a config-driven approach in our new installer, you would have to have a different EDPM node set per type of physical server.\n\nThat is not unreasonable to do but the manual work ot defining this in the config felt a lot less elegant.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":467,"context_line":""},{"line_number":468,"context_line":"  **Limitations:**"},{"line_number":469,"context_line":"  - Static configuration unable to adapt to host changes."},{"line_number":470,"context_line":"  - No direct correlation with cgroups capacity."},{"line_number":471,"context_line":"  - Manual maintenance overhead."},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"* **CPU Service Level via Custom Resource Classes (Original Proposal):**"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5e8bc1af_eccf7bc5","line":470,"updated":"2025-06-26 14:15:34.000000000","message":"What does this mean?","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":467,"context_line":""},{"line_number":468,"context_line":"  **Limitations:**"},{"line_number":469,"context_line":"  - Static configuration unable to adapt to host changes."},{"line_number":470,"context_line":"  - No direct correlation with cgroups capacity."},{"line_number":471,"context_line":"  - Manual maintenance overhead."},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"* **CPU Service Level via Custom Resource Classes (Original Proposal):**"}],"source_content_type":"text/x-rst","patch_set":3,"id":"b276bb9a_da55cfd5","line":470,"in_reply_to":"5e8bc1af_eccf7bc5","updated":"2025-06-26 19:57:05.000000000","message":"Sorry, this is also not clear I meant that in cgroups v1 and cgrpus v2 the allowed range of shares is different and that there was no clear corraltion between the two.\n\nbut that apple to any config option so i proably shoudl jsut remove this.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":468,"context_line":"  **Limitations:**"},{"line_number":469,"context_line":"  - Static configuration unable to adapt to host changes."},{"line_number":470,"context_line":"  - No direct correlation with cgroups capacity."},{"line_number":471,"context_line":"  - Manual maintenance overhead."},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"* **CPU Service Level via Custom Resource Classes (Original Proposal):**"},{"line_number":474,"context_line":"  The initial approach proposed creating multiple custom resource classes"}],"source_content_type":"text/x-rst","patch_set":3,"id":"fa3c76c8_c3390ca5","line":471,"updated":"2025-06-26 14:15:34.000000000","message":"They already have to choose a multiplier, so this must be referencing the first bullet where you added CPUs to a system?","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":468,"context_line":"  **Limitations:**"},{"line_number":469,"context_line":"  - Static configuration unable to adapt to host changes."},{"line_number":470,"context_line":"  - No direct correlation with cgroups capacity."},{"line_number":471,"context_line":"  - Manual maintenance overhead."},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"* **CPU Service Level via Custom Resource Classes (Original Proposal):**"},{"line_number":474,"context_line":"  The initial approach proposed creating multiple custom resource classes"}],"source_content_type":"text/x-rst","patch_set":3,"id":"83f594a7_5d5d3264","line":471,"in_reply_to":"fa3c76c8_c3390ca5","updated":"2025-06-26 19:57:05.000000000","message":"no it was in refernce to the need to generate potitally per host provider.yamls and keep them in sync.\n\nUnlike Oslo config, we don\u0027t support composing them via a directory\nso you have to maintain a single provider.yaml with all of your\n\ncahagne and if you modify the cpu_allication_ratio you need to also update the relevent allcation_ratio in the provider.yaml for the cpu_shares.\n\nin the current spec, my intent was to use the initial_cpu_allocation_ratio and cpu_allocation_ratio for the VCPU_SHARES inventory as well.\n\nso the two woudl alwasy be in sync.\n\nim fine with requireing peopel to update there config if they add more cpus so that was not my intent.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":507,"context_line":"* **Cons:** Less flexible than Placement custom resources for dynamic"},{"line_number":508,"context_line":"inventory and fine-grained control. Does not easily support mixing"},{"line_number":509,"context_line":"tiers on the same host with guaranteed per-tier capacity limits."},{"line_number":510,"context_line":"Requires manual management of host aggregate membership."},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"* **Percentage-Based Allocation:** Allowing users to request a percentage"},{"line_number":513,"context_line":"  of host CPU resources instead of raw shares."}],"source_content_type":"text/x-rst","patch_set":3,"id":"ef7e8d96_9c0186ef","line":510,"updated":"2025-06-26 13:22:40.000000000","message":"@gibi @sbauza so ^ i tried to premet the feedback on jsut using qutoa:cpu_shares and host aggreats by including this orgianlly.\n\nIt is a valid alternative I agree, but I\u0027m not convinced it is the right long-term solution.\n\nI do, however, think that I should consider writing this up in more detail however because it does provide a way to do it today. For some advanced users, that may be sufficient. if we use required traits a la https://docs.openstack.org/nova/latest/reference/isolate-aggregates.html and do per host cpu_allocation_ratio truning we coud achive some of the same usecases.\n\nthis completely missine the obejct of mixing vms with diffent cpu teiers on the same host however so it does not really fuflfil the desired usecase.\n\na key part of this porposal is that the broze level guest gett to fully utilise all of the host resouce while the gold vms are ideal but when the gold vms become active and there is contention the compute cycle are distibuted proportionally to the vm priority. taking this approch will not achive the capex reduction and increase in hardware utilsitaiton that motivated this proposal.\n\ni shoudl proably update the usecase to make that more clear as reflectign on them now that is impled but not expiclt.\n\nThinking about it a little more, I also think i could write that up in such a way that you could evolve the usage to be compatible with palcement tracked cpu_sahre inventories over time.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":507,"context_line":"* **Cons:** Less flexible than Placement custom resources for dynamic"},{"line_number":508,"context_line":"inventory and fine-grained control. Does not easily support mixing"},{"line_number":509,"context_line":"tiers on the same host with guaranteed per-tier capacity limits."},{"line_number":510,"context_line":"Requires manual management of host aggregate membership."},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"* **Percentage-Based Allocation:** Allowing users to request a percentage"},{"line_number":513,"context_line":"  of host CPU resources instead of raw shares."}],"source_content_type":"text/x-rst","patch_set":3,"id":"a90d7aea_25dfe8ae","line":510,"in_reply_to":"c7a82a8e_ea0c40bb","updated":"2025-06-26 19:57:05.000000000","message":"That was one of the core requirements, as far as I understood it.\n\nThe desire is to support sharing a host between gold, silver, and bronze vms.\n\nThis sharing requirement in the public was expressed in terms of implementation details btu this is the most relevant section.\n\n```\nThe cloud offers service tiers – Gold, Silver, Bronze – each with a different CPU share weight (Gold\u003d512, Silver\u003d333, Bronze\u003d167, vs default 1024). These weights ensure a relative CPU time share under contention (e.g. a 2048-share VM gets twice the CPU time of a 1024-share VM). The goal is to achieve deterministic SLO guarantees: under full load on any host, Gold VMs collectively get ~50% CPU, Silver ~33%, Bronze ~17%, reflecting their share ratios. This is accomplished by a “Fully Distributed” placement scheme:\n\n    Equal Domain Capacity Per Host: Each hypervisor (say 112 vCPU cores available for VMs) is logically partitioned into 112 Gold-vCPUs, 112 Silver-vCPUs, 112 Bronze-vCPUs. This yields a fixed 3:1 oversubscription (336 vCPUs allocated per 112 physical cores), with each physical core potentially hosting one Gold, one Silver, and one Bronze vCPU concurrently. Linux CFS then schedules these with the configured weights, enforcing the intended 50/33/17% time share split when all domains are busy.\n    Per-Host Domain Quota: On any given host, no more than 112 Gold vCPUs worth of instances should run (and same for Silver, Bronze). This guarantees no single host exceeds its budget for any tier, preserving cross-tier fairness host-by-host. Even if overall capacity in the cloud is free, the scheduler must avoid placing a new Gold VM on a host that already has 112 Gold vCPUs running. It should instead pick a host with available Gold capacity. In short, placement decisions need to consider per-host, per-tier utilization and skip hosts that would violate the tier’s quota on that host.\n\nProblem: Nova’s default scheduler only tracks total VCPUs (with a global allocation ratio) and cannot inherently limit usage per service tier. We need a scheduling mechanism to enforce these per-host domain quotas\n```\nhttps://github.com/gprocunier/openstack-cgroup-tiering/blob/main/README.md#background-and-goals\n\nit was even more expict in other sources so my understanding of the problem statement makes this sharing one of the key problems to solve.\nI don\u0027t see how you increase overall host utilization while still being able to\ndeliver the sated goal otherwise\n\"\"\"\nThe goal is to achieve deterministic SLO guarantees: under full load on any host, Gold VMs collectively get ~50% CPU, Silver ~33%, Bronze ~17%, reflecting their share ratios.\n\"\"\"\n\n\nYou are right about the memory bandwidth and iops side, it may be surpsing based on the length of the spec bug i wanted to keep this spec focused on the cpu aspect to limit scope, but I wanted the mechisum ot be a parent for dealing with IOPS and memory bandwidth eventually.memory bandwidth is per numa node and i didnt want to bring numa into this spec.\n\non the network side we already have guaranteed minimum bandwidth-based scheduling and guaranteed packets per second via placement and neutron.\nSo that is already covered.\n\ni am happy to add IOPs and or disk bandwith for nova local storage to this spec.\nwe have the cgroup enforcement already\nhttps://github.com/openstack/nova/blob/master/nova/api/validation/extra_specs/quota.py#L149-L164\nsupprot hose requires two new resource classes and 2 new config options to declare the amount of iops and storage bandwidth we have aviabel just like network backdwith/pps.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":507,"context_line":"* **Cons:** Less flexible than Placement custom resources for dynamic"},{"line_number":508,"context_line":"inventory and fine-grained control. Does not easily support mixing"},{"line_number":509,"context_line":"tiers on the same host with guaranteed per-tier capacity limits."},{"line_number":510,"context_line":"Requires manual management of host aggregate membership."},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"* **Percentage-Based Allocation:** Allowing users to request a percentage"},{"line_number":513,"context_line":"  of host CPU resources instead of raw shares."}],"source_content_type":"text/x-rst","patch_set":3,"id":"c7a82a8e_ea0c40bb","line":510,"in_reply_to":"ef7e8d96_9c0186ef","updated":"2025-06-26 14:15:34.000000000","message":"Do people really want to do this fully by share though? In most of the cloud services I use, there is some guarantee that golds and bronzes won\u0027t be on the same host.\n\nI also think that just considering CPU share isn\u0027t remotely sufficient for placement, and people will still want/need to segregate by IO bandwidth, etc. If those aren\u0027t included here then they\u0027re already doing the manual slicing anyway.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":573,"context_line":"-----------------"},{"line_number":574,"context_line":"None"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":"while the Hoststate object in the scheudler will need to be extened"},{"line_number":577,"context_line":"to provide access to the Provider Summeries. That is an internal"},{"line_number":578,"context_line":"change and does not affect the overall datamodel."},{"line_number":579,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"ff650abd_d5811d2c","line":576,"range":{"start_line":576,"start_character":60,"end_line":576,"end_character":67},"updated":"2025-06-25 16:52:37.000000000","message":"extended","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":573,"context_line":"-----------------"},{"line_number":574,"context_line":"None"},{"line_number":575,"context_line":""},{"line_number":576,"context_line":"while the Hoststate object in the scheudler will need to be extened"},{"line_number":577,"context_line":"to provide access to the Provider Summeries. That is an internal"},{"line_number":578,"context_line":"change and does not affect the overall datamodel."},{"line_number":579,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"0f0f4aa8_553b9a4d","line":576,"range":{"start_line":576,"start_character":34,"end_line":576,"end_character":43},"updated":"2025-06-25 16:52:37.000000000","message":"scheduler","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":575,"context_line":""},{"line_number":576,"context_line":"while the Hoststate object in the scheudler will need to be extened"},{"line_number":577,"context_line":"to provide access to the Provider Summeries. That is an internal"},{"line_number":578,"context_line":"change and does not affect the overall datamodel."},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"REST API impact"},{"line_number":581,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"35be2614_a0d13146","line":578,"updated":"2025-06-25 16:52:37.000000000","message":"sounds to me an implementation detail, not a data model change","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":575,"context_line":""},{"line_number":576,"context_line":"while the Hoststate object in the scheudler will need to be extened"},{"line_number":577,"context_line":"to provide access to the Provider Summeries. That is an internal"},{"line_number":578,"context_line":"change and does not affect the overall datamodel."},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"REST API impact"},{"line_number":581,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"62b7b822_6a509269","line":578,"in_reply_to":"35be2614_a0d13146","updated":"2025-06-26 13:22:40.000000000","message":"correct that why i said none\nThis is a comment on the implementation change, but I\u0027m acknowledging the overall datamodel is not altered.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":586,"context_line":"--------------"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"* Careful consideration is needed for rolling upgrades to ensure"},{"line_number":589,"context_line":"  compatibility with existing instances."},{"line_number":590,"context_line":"* Following the pattern established by the pci in Placement feature, a"},{"line_number":591,"context_line":"  new config option to report CPU shares in Placement will be added to"},{"line_number":592,"context_line":"  the libvirt section and a corresponding config option to request CPU"}],"source_content_type":"text/x-rst","patch_set":3,"id":"bc5a4e98_4ce65346","line":589,"updated":"2025-06-25 16:52:37.000000000","message":"how do you plan such thing ? Here I see that if we don\u0027t do anything specifically, a Placement resource request asking for CPU shares would prevent old computes to be scheduled to. Is this something you want ?","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":586,"context_line":"--------------"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"* Careful consideration is needed for rolling upgrades to ensure"},{"line_number":589,"context_line":"  compatibility with existing instances."},{"line_number":590,"context_line":"* Following the pattern established by the pci in Placement feature, a"},{"line_number":591,"context_line":"  new config option to report CPU shares in Placement will be added to"},{"line_number":592,"context_line":"  the libvirt section and a corresponding config option to request CPU"}],"source_content_type":"text/x-rst","patch_set":3,"id":"6999710e_927a9620","line":589,"in_reply_to":"bc5a4e98_4ce65346","updated":"2025-06-26 13:22:40.000000000","message":"yes it is and i am execting use to take the same apptoch we took with pci in placement or the pcpus upgrade.\n\nin both cases there were several pahses to the upgrade.\n\n1 have a flag on the compute to contol reporting of the cpu_shares inventory.\n\n2 have a second flag to enable consuming cpu shares form placement.\n\nthe second flag woudl cause the compute to do a reshap and the conductor/schduler ot translate the quota:cpu_shares or quota:cpu_shares_multipler + flavor.vcpus into\nrequest for CPU_SHARES resocues in the placement query.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":619,"context_line":""},{"line_number":620,"context_line":"Other contributors:"},{"line_number":621,"context_line":"  deepseek-r1"},{"line_number":622,"context_line":"  gemini-flash-2.5"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"Feature Liaison"},{"line_number":625,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"51337f72_addc6cb6","line":622,"updated":"2025-06-25 16:52:37.000000000","message":"I don\u0027t know personnally those new contributors 😊","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":619,"context_line":""},{"line_number":620,"context_line":"Other contributors:"},{"line_number":621,"context_line":"  deepseek-r1"},{"line_number":622,"context_line":"  gemini-flash-2.5"},{"line_number":623,"context_line":""},{"line_number":624,"context_line":"Feature Liaison"},{"line_number":625,"context_line":"---------------"}],"source_content_type":"text/x-rst","patch_set":3,"id":"710186ce_c9f59b57","line":622,"in_reply_to":"51337f72_addc6cb6","updated":"2025-06-26 13:22:40.000000000","message":"ya i can drop this 😊\ni kind of didn\u0027t know how to call this out, but i think the commit message was enough\n\nAlso this was really jsut for the initial draft\nmy expectation was that we woudl refien this spec as part of review, and while I want to acknowlage that i used these toosl to help with my initial drafting\nTheir overall contribution to the final result will be very much diminished.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"11515774e8a435bbd50654c7348a98e05a74f50e","unresolved":true,"context_lines":[{"line_number":635,"context_line":"3. Develop ``ResourceProviderWeigher`` scheduler component."},{"line_number":636,"context_line":"4. Create new flavor extra spec validation logic."},{"line_number":637,"context_line":"5. Implement configuration options for upgrade compatibility."},{"line_number":638,"context_line":"6. Add documentation and release notes."},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"Dependencies"},{"line_number":641,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"545b1927_4ab7c485","line":638,"updated":"2025-06-26 14:15:34.000000000","message":"So after reading this, I\u0027m really still confused about how this isn\u0027t three separate things:\n1. The shares-per-vcpu (or multiplier or whatever)\n2. The shares exposed by the compute in placement to better pick a host that looks free\n3. The resource weigher, which isn\u0027t really related to either\n\nCan we not split this into three pieces and work on them, probably in that order? To me, the first one is probably the simplest, most useful, and probably the least controversial. The second I don\u0027t think I _really_ see the need for, or how it doesn\u0027t conflict with our overcommit ratio. The third seems like it can be its own discussion.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"575567a0017c488e1c72d5d001ce7c8f074c69d5","unresolved":true,"context_lines":[{"line_number":635,"context_line":"3. Develop ``ResourceProviderWeigher`` scheduler component."},{"line_number":636,"context_line":"4. Create new flavor extra spec validation logic."},{"line_number":637,"context_line":"5. Implement configuration options for upgrade compatibility."},{"line_number":638,"context_line":"6. Add documentation and release notes."},{"line_number":639,"context_line":""},{"line_number":640,"context_line":"Dependencies"},{"line_number":641,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"d62a1358_9da5fc1f","line":638,"in_reply_to":"545b1927_4ab7c485","updated":"2025-06-26 19:57:05.000000000","message":"i feel like the first two are very tieed to each other but when i was thining about it i did mentally speit it into 3 so if you want 3 specs insteead of 2 i can do that.\n\ni agree the weighter should be its own spec so im already goign ot make that chagne either way into its own spec.\n\nPersonally, that weigher is the first thing that I would implement, as that is where i think a lot of the value is in general.\n\n\ni think there is still a lot of refinement on the concpet of \"compute workload teirs\" for thing like including sotrage iops ectra that we coudl dicuss.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"58f8dd6faf578045df6f55e9241ab96d3b67b155","unresolved":true,"context_lines":[{"line_number":685,"context_line":"References"},{"line_number":686,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"* `OpenStack cgroup tiering README \u003chttps://github.com/gprocunier/openstack-cgroup-tiering/blob/b205e34c0c62fa6cd451a44659c648595f0d19ae/README.md\u003e`_"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"History"},{"line_number":691,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"592349bf_0e7dea8b","line":688,"updated":"2025-06-25 16:52:37.000000000","message":"could you please summarize what that document is proposing ?","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60d6d658701fba5fb43f000d116095318d0b629a","unresolved":true,"context_lines":[{"line_number":685,"context_line":"References"},{"line_number":686,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"* `OpenStack cgroup tiering README \u003chttps://github.com/gprocunier/openstack-cgroup-tiering/blob/b205e34c0c62fa6cd451a44659c648595f0d19ae/README.md\u003e`_"},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"History"},{"line_number":691,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":3,"id":"e7e0dcda_bd36c0ff","line":688,"in_reply_to":"592349bf_0e7dea8b","updated":"2025-06-26 13:22:40.000000000","message":"it proposed the first 3 alternatives i have listed, but the main one was\n\nhttps://review.opendev.org/c/openstack/nova-specs/+/951222/3/specs/2025.2/approved/cpu-performance-service-level.rst#473\n\nusing CUSTOM_VCPU_GOLD, CUSTOM_VCPU_SILVER and CUSTOM_VCPU_BRONZE resocue classes with provider.yaml to control reporting and the allocation ratio for each.\nThe flavors woudl request resouces:CUSTOM_VCPU_SILVER\u003dn where n would have to align ot the flavor.vcpu amount to work correctly.\n\nThe flavor would either have resource:vcpu\u003d0, like ironic or still\nRequest vcpu resource classes for the sole reason of supporting unified limit quotas on vcpu, regardless of the tier; it left that open to the admin to decide.\n\n\nThe repo describes how to do this today without any code changes; however, it is very error-prone and requires a very extensive knowledge of Nova. it is, however, possible to implement on a Wallaby Era cloud and, with more work, even train.\n\nRemember the entire premise of this proposal is that while nova can do this today, the process to configure and operate a cloud with this type of tiering is too error-prone to ask operators to build for themselves from the primitive we provide, and therefore a better solution in Nova is warranted.","commit_id":"d9fb86fa6c4f0445d41d0181a4883625a33eb4cf"}],"specs/2026.1/approved/resource-provider-weigher.rst":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"This means that we have to implement a weigher for each resource we care"},{"line_number":32,"context_line":"about instead of having a single weigher that can consider multiple"},{"line_number":33,"context_line":"resources and traits."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Use Cases"},{"line_number":36,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"16969b2f_dbf0f3e3","line":33,"updated":"2025-10-14 17:17:16.000000000","message":"This is a bit controversial as in the past we intentionally opted to have one weigher per resource, even though the HostState would allowed us to have a single weigher that decides weight based on both CPU and RAM as well. So we need to be careful if we depart from this structure with the new weigher as this might conflict with assumption by the system or by the user.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5691958a2c32841114b1dd936579adf161378f3d","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"This means that we have to implement a weigher for each resource we care"},{"line_number":32,"context_line":"about instead of having a single weigher that can consider multiple"},{"line_number":33,"context_line":"resources and traits."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Use Cases"},{"line_number":36,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"d69bf7af_8ae9703e","line":33,"in_reply_to":"16969b2f_dbf0f3e3","updated":"2025-10-14 17:45:53.000000000","message":"did we i was not aware of any desgin guidance with regard to that and cerntely no admin facing documentiuont \n\ni was hopign that this generic weigher coudl allow us to deprecate the cpu ram and disk wighers eventually for what its worth but i didn\u0027t want to push for that in the spec.\n\nthe MetricsWeigher\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/weights/metrics.py\nand ImagePropertiesWeigher\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/weights/image_props.py\n\nboth already allwo you to configure which sub set of resocue to factor into there opration and consult multipel image properties and metrics\n\nso to me this is inline with there design.\n\nin this case the things this weight are the provider summaries and the sub fields there of.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"This means that we have to implement a weigher for each resource we care"},{"line_number":32,"context_line":"about instead of having a single weigher that can consider multiple"},{"line_number":33,"context_line":"resources and traits."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Use Cases"},{"line_number":36,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1078ae5a_76fb4ac4","line":33,"in_reply_to":"1731df61_d833a87e","updated":"2025-11-07 15:24:28.000000000","message":"im going to resolve this thread for brevity but im not dicscounti the concuer.\n\nim currently workign on a major revion of the spec locally so we can loop back to this ocne that is push if you like but we also dicuss this a bit in the ptg so lets revist when that is up.,","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"39b8debd8c51d0d38f6cc98483dcf6bc3584c72f","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"This means that we have to implement a weigher for each resource we care"},{"line_number":32,"context_line":"about instead of having a single weigher that can consider multiple"},{"line_number":33,"context_line":"resources and traits."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Use Cases"},{"line_number":36,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"f0fbfd23_7f623e9d","line":33,"in_reply_to":"c3305cf0_f5bc551c","updated":"2025-10-20 16:20:18.000000000","message":"Yeah I too am worried about a weigher that is somewhat of a black box (to users) with complex behaviors and interactions. I know we probably can\u0027t always get good/rich decisions from something that is only looking at one resource, but I need to be convinced it\u0027s required and worth the obscurity.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"This means that we have to implement a weigher for each resource we care"},{"line_number":32,"context_line":"about instead of having a single weigher that can consider multiple"},{"line_number":33,"context_line":"resources and traits."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Use Cases"},{"line_number":36,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"c3305cf0_f5bc551c","line":33,"in_reply_to":"d69bf7af_8ae9703e","updated":"2025-10-20 15:45:23.000000000","message":"No written guidance. Just priory art. And a bit of PTSD (https://github.com/openstack/nova/commit/154ab7b2f9ad80fe432d2c036d5e8c4ee171897b)\n\nI think my fear here twofolds:\n\n* The interaction between the new weigher and the existing weighers. I.e. now CPU can be weighed two different ways.\n\n* The configuration of the complex weighers like Metrics (and less but still ImagerPropertyWeigher) are complex to allow assigning weights to certain smaller things (a metric, an image property). Having an overall good weigher configuration to achieve a certain goal is complicated with simple weighers already, but with complex weighers even so.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":true,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"This means that we have to implement a weigher for each resource we care"},{"line_number":32,"context_line":"about instead of having a single weigher that can consider multiple"},{"line_number":33,"context_line":"resources and traits."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Use Cases"},{"line_number":36,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1731df61_d833a87e","line":33,"in_reply_to":"f0fbfd23_7f623e9d","updated":"2025-10-21 17:45:51.000000000","message":"it could technically be 2 weigher\n\none for resource classes\none for traits and later for prefered and avoid triats\n\nthe reason that seam like a bad idea is any time i have talks to operators and the last time i talk to john garbut about this, the feedback i have gotten is configuring multiple weigher is hard to reason about and as a result the recommendation is often to only use 1 or 2 wigher total.\n\nthat why i was trying to have 1 weigher not many.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":38,"context_line":"* As a cloud operator, I want the scheduler to prefer hosts that closely"},{"line_number":39,"context_line":"  match the requested resources and traits without having many unused"},{"line_number":40,"context_line":"  specialized capabilities, so that specialized resources remain available"},{"line_number":41,"context_line":"  for workloads that actually need them."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"* As a cloud operator, I want to optimize resource utilization by"},{"line_number":44,"context_line":"  directing simple workloads to simple hosts and complex workloads to"}],"source_content_type":"text/x-rst","patch_set":5,"id":"a38a0058_3e42d731","line":41,"updated":"2025-10-14 17:17:16.000000000","message":"i.e prefer not to use a CPU from a host if the host has free GPUs and you don\u0027t need GPUs as depleting that host of usable CPUs will prevent other VMs to grab that unused GPU. Make sense.\n\nI feel there are two groups of resources:\n* essential, a VM cannot boot without it so all VM will consume some of it. PCPU / VCPU and MEMORY_MB are definitely in this group. Depending on the usage model DISK_GB is in too.\n* optional, a VM might want to use it but not all VM will have it. E.g. GPU, PCI, MEM_ENCRYPTION_CONTEXT, min guaranteed bandwidth and packet rate.\n  * Also there is a subgroup of optionals, the expensive optionals. I.e a GPU is expensive a MEM_ENCRYPTION_CONTEXT does not.\n\nIf we run out of one of the essentials while not using some of the expensive optionals from the same host then that expensive device is wasted as no VM can use it any more. We don\u0027t want that.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"39b8debd8c51d0d38f6cc98483dcf6bc3584c72f","unresolved":true,"context_lines":[{"line_number":38,"context_line":"* As a cloud operator, I want the scheduler to prefer hosts that closely"},{"line_number":39,"context_line":"  match the requested resources and traits without having many unused"},{"line_number":40,"context_line":"  specialized capabilities, so that specialized resources remain available"},{"line_number":41,"context_line":"  for workloads that actually need them."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"* As a cloud operator, I want to optimize resource utilization by"},{"line_number":44,"context_line":"  directing simple workloads to simple hosts and complex workloads to"}],"source_content_type":"text/x-rst","patch_set":5,"id":"673bc4bd_d0dc74c7","line":41,"in_reply_to":"090208b1_efa94c9e","updated":"2025-10-20 16:20:18.000000000","message":"Just having a weigher that assigns a weight to the amount of scarce resources (traits and RCs as defined by the operator) would achieve the goal of not sending boring instances to un-boring hosts right?","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":true,"context_lines":[{"line_number":38,"context_line":"* As a cloud operator, I want the scheduler to prefer hosts that closely"},{"line_number":39,"context_line":"  match the requested resources and traits without having many unused"},{"line_number":40,"context_line":"  specialized capabilities, so that specialized resources remain available"},{"line_number":41,"context_line":"  for workloads that actually need them."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"* As a cloud operator, I want to optimize resource utilization by"},{"line_number":44,"context_line":"  directing simple workloads to simple hosts and complex workloads to"}],"source_content_type":"text/x-rst","patch_set":5,"id":"090208b1_efa94c9e","line":41,"in_reply_to":"28069da9_8a7db494","updated":"2025-10-20 15:45:23.000000000","message":"Thanks. I think I go it. \n\nA bunch of traits auto-populated on the compute RP are basically cheap, like most of the CPU flags. But I\u0027m afraid if we start trying to be smart with a specific default what to include in the calculation and what not then some customers will disagree. \n\nI\u0027m wondering what would result in simpler setup:\n* all traits and RCs are counted by default and you can opt out\n* no traits no RCs are counted by default (weigher noop) and you need to opt in to certain RCs and Traits.\n* a mix of RCs are opt out, traits are opt in","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":true,"context_lines":[{"line_number":38,"context_line":"* As a cloud operator, I want the scheduler to prefer hosts that closely"},{"line_number":39,"context_line":"  match the requested resources and traits without having many unused"},{"line_number":40,"context_line":"  specialized capabilities, so that specialized resources remain available"},{"line_number":41,"context_line":"  for workloads that actually need them."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"* As a cloud operator, I want to optimize resource utilization by"},{"line_number":44,"context_line":"  directing simple workloads to simple hosts and complex workloads to"}],"source_content_type":"text/x-rst","patch_set":5,"id":"f739942a_17a68a99","line":41,"in_reply_to":"673bc4bd_d0dc74c7","updated":"2025-10-21 17:45:51.000000000","message":"part of the reason for the traits is because this feature is eventually ment to supprot prefered and avoided traits.\n\nthat was part fo the orginal propasl but ha have not directly called that out in this version to keep it smaller.\n\nbut in essesne yes this is what this weigher does.\n\ninstead of just counting all resouce classes and all traits to produce the weight\n\nits counting the un requested traits/total traits\nand unrequested resource classes/aviable resouces classes\nper provider tree.\n\nso it slightly more useful as a result.\n\nsuppoting preferved and avoided traits is a trivial tweak to that later\n\nbasically avoid triats if present just add a large negative cost and like wise prefered trait woudl be a large positive value.\n\n\nmaybe we shoudl keep that usecase sepeate but i orginally wanted a wholistic weiher that operated on teh provider summarise to placement aware weighing decision.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"84e02644a4e1dd6aeecb4195673b37c131e1068d","unresolved":true,"context_lines":[{"line_number":38,"context_line":"* As a cloud operator, I want the scheduler to prefer hosts that closely"},{"line_number":39,"context_line":"  match the requested resources and traits without having many unused"},{"line_number":40,"context_line":"  specialized capabilities, so that specialized resources remain available"},{"line_number":41,"context_line":"  for workloads that actually need them."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"* As a cloud operator, I want to optimize resource utilization by"},{"line_number":44,"context_line":"  directing simple workloads to simple hosts and complex workloads to"}],"source_content_type":"text/x-rst","patch_set":5,"id":"28069da9_8a7db494","line":41,"in_reply_to":"989ae7c5_1d1212ab","updated":"2025-10-14 17:51:03.000000000","message":"but yes.\n\nwe want to avoid filing up host with special device like gpus with vms that do not ask for them.\n\nif there is no where else for them to go then the should still be allowed to be placed on this host hench weigher not filter but the intet is to select the host weith the least amoutn of extra resouces/traits tacked in placement making it more likely that a vm that needs those resouces/traits can actully boot in the future.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fedca0b8c03c4e170cb94b39e95cd46c694bc18f","unresolved":true,"context_lines":[{"line_number":38,"context_line":"* As a cloud operator, I want the scheduler to prefer hosts that closely"},{"line_number":39,"context_line":"  match the requested resources and traits without having many unused"},{"line_number":40,"context_line":"  specialized capabilities, so that specialized resources remain available"},{"line_number":41,"context_line":"  for workloads that actually need them."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"* As a cloud operator, I want to optimize resource utilization by"},{"line_number":44,"context_line":"  directing simple workloads to simple hosts and complex workloads to"}],"source_content_type":"text/x-rst","patch_set":5,"id":"aaea2de8_271abdf0","line":41,"in_reply_to":"a38a0058_3e42d731","updated":"2025-10-14 17:19:23.000000000","message":"Do I understanding it correcly?","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5691958a2c32841114b1dd936579adf161378f3d","unresolved":true,"context_lines":[{"line_number":38,"context_line":"* As a cloud operator, I want the scheduler to prefer hosts that closely"},{"line_number":39,"context_line":"  match the requested resources and traits without having many unused"},{"line_number":40,"context_line":"  specialized capabilities, so that specialized resources remain available"},{"line_number":41,"context_line":"  for workloads that actually need them."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"* As a cloud operator, I want to optimize resource utilization by"},{"line_number":44,"context_line":"  directing simple workloads to simple hosts and complex workloads to"}],"source_content_type":"text/x-rst","patch_set":5,"id":"989ae7c5_1d1212ab","line":41,"in_reply_to":"a38a0058_3e42d731","updated":"2025-10-14 17:45:53.000000000","message":"right so this is why the weigher i propsoed to weigh all resocue classes by default but it also supprot specifyign which resouce classes you care about in config.\n\nso you can define only the expensive ones you want it to operate on if that is your desire.\n\nby the way i also condiered supproting the same syntax the metrics and image props weigher supprot to allow you to specify per resouce clase or per trait multiplers for the cost\n\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/weights/metrics.py#L24-L26\n\nbut i dont think i included that in the poc or this spec specficly to keep the scope small give we can alwasy add that later if we care too.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":38,"context_line":"* As a cloud operator, I want the scheduler to prefer hosts that closely"},{"line_number":39,"context_line":"  match the requested resources and traits without having many unused"},{"line_number":40,"context_line":"  specialized capabilities, so that specialized resources remain available"},{"line_number":41,"context_line":"  for workloads that actually need them."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"* As a cloud operator, I want to optimize resource utilization by"},{"line_number":44,"context_line":"  directing simple workloads to simple hosts and complex workloads to"}],"source_content_type":"text/x-rst","patch_set":5,"id":"681ac848_3a2edef7","line":41,"in_reply_to":"f739942a_17a68a99","updated":"2025-11-07 15:24:28.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":47,"context_line":"  using host aggregates."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* As a cloud operator, I want better placement decisions when using"},{"line_number":50,"context_line":"  custom resource classes (such as CUSTOM_VCPU_SHARES for performance tiers),"},{"line_number":51,"context_line":"  without needing to implement a custom weigher for each resource."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":5,"id":"8f139953_5fc2b6e1","line":50,"range":{"start_line":50,"start_character":35,"end_line":50,"end_character":53},"updated":"2025-10-14 17:17:16.000000000","message":"Could you add a simple example later where the weigher is used to help implementing a static CPU tiering solution with CUSTOM_VCPU_SHARES? \n\nIt is an important use case to me and I would like to see the example so that:\n* I can see that the current proposal is actually solving that case\n* at any later changes of the design I would like to re-evaluate that the design still solves that use case.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":47,"context_line":"  using host aggregates."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* As a cloud operator, I want better placement decisions when using"},{"line_number":50,"context_line":"  custom resource classes (such as CUSTOM_VCPU_SHARES for performance tiers),"},{"line_number":51,"context_line":"  without needing to implement a custom weigher for each resource."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7de6c326_0b4c1d03","line":50,"range":{"start_line":50,"start_character":75,"end_line":50,"end_character":77},"updated":"2025-10-14 17:17:16.000000000","message":"Would it be fair to mention PCI devices represented by eg. CUSTOM_\u003cvendor_id\u003e_\u003cproduct_id\u003e resources as done by PCI in Placement?","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":true,"context_lines":[{"line_number":47,"context_line":"  using host aggregates."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* As a cloud operator, I want better placement decisions when using"},{"line_number":50,"context_line":"  custom resource classes (such as CUSTOM_VCPU_SHARES for performance tiers),"},{"line_number":51,"context_line":"  without needing to implement a custom weigher for each resource."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":5,"id":"c13700f5_e5f208d6","line":50,"range":{"start_line":50,"start_character":75,"end_line":50,"end_character":77},"in_reply_to":"20fe65cf_0466c3fe","updated":"2025-11-07 15:24:28.000000000","message":"i have updated this to jsut do pci in placement but i have added a new section for the interaction with cpu teiring","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5691958a2c32841114b1dd936579adf161378f3d","unresolved":true,"context_lines":[{"line_number":47,"context_line":"  using host aggregates."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* As a cloud operator, I want better placement decisions when using"},{"line_number":50,"context_line":"  custom resource classes (such as CUSTOM_VCPU_SHARES for performance tiers),"},{"line_number":51,"context_line":"  without needing to implement a custom weigher for each resource."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":5,"id":"c4ace2c3_996e6aac","line":50,"range":{"start_line":50,"start_character":75,"end_line":50,"end_character":77},"in_reply_to":"7de6c326_0b4c1d03","updated":"2025-10-14 17:45:53.000000000","message":"ya so i ment to replace all refence to CUSTOM_VCPU_SHARES with other exampel and i didnt get aroudn to it after striping down the spec.\n\nwe can use either for the exampels. or both.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5691958a2c32841114b1dd936579adf161378f3d","unresolved":true,"context_lines":[{"line_number":47,"context_line":"  using host aggregates."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* As a cloud operator, I want better placement decisions when using"},{"line_number":50,"context_line":"  custom resource classes (such as CUSTOM_VCPU_SHARES for performance tiers),"},{"line_number":51,"context_line":"  without needing to implement a custom weigher for each resource."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":5,"id":"bfdb8701_d1a7d98d","line":50,"range":{"start_line":50,"start_character":35,"end_line":50,"end_character":53},"in_reply_to":"8f139953_5fc2b6e1","updated":"2025-10-14 17:45:53.000000000","message":"hum i guess i goucl i actully inteed to remove the cvpu shares refecnes orgianly but i kind of forgot \n\ni wanted to make it clear this weigher was useful even if we never did anything more for that use case.\n\nbut sure we can add a simpel example.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":true,"context_lines":[{"line_number":47,"context_line":"  using host aggregates."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* As a cloud operator, I want better placement decisions when using"},{"line_number":50,"context_line":"  custom resource classes (such as CUSTOM_VCPU_SHARES for performance tiers),"},{"line_number":51,"context_line":"  without needing to implement a custom weigher for each resource."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":5,"id":"f57cec45_db88776f","line":50,"range":{"start_line":50,"start_character":35,"end_line":50,"end_character":53},"in_reply_to":"bfdb8701_d1a7d98d","updated":"2025-10-20 15:45:23.000000000","message":"thanks.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":false,"context_lines":[{"line_number":47,"context_line":"  using host aggregates."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* As a cloud operator, I want better placement decisions when using"},{"line_number":50,"context_line":"  custom resource classes (such as CUSTOM_VCPU_SHARES for performance tiers),"},{"line_number":51,"context_line":"  without needing to implement a custom weigher for each resource."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":5,"id":"c75aead2_9fe036a1","line":50,"range":{"start_line":50,"start_character":75,"end_line":50,"end_character":77},"in_reply_to":"c13700f5_e5f208d6","updated":"2025-11-07 16:10:41.000000000","message":"Done","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":true,"context_lines":[{"line_number":47,"context_line":"  using host aggregates."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* As a cloud operator, I want better placement decisions when using"},{"line_number":50,"context_line":"  custom resource classes (such as CUSTOM_VCPU_SHARES for performance tiers),"},{"line_number":51,"context_line":"  without needing to implement a custom weigher for each resource."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":5,"id":"20fe65cf_0466c3fe","line":50,"range":{"start_line":50,"start_character":75,"end_line":50,"end_character":77},"in_reply_to":"c4ace2c3_996e6aac","updated":"2025-10-20 15:45:23.000000000","message":"I suggest to mention PCI from PCI in placement. But also give us an example that solves a simplified CPU shares problem","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":47,"context_line":"  using host aggregates."},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"* As a cloud operator, I want better placement decisions when using"},{"line_number":50,"context_line":"  custom resource classes (such as CUSTOM_VCPU_SHARES for performance tiers),"},{"line_number":51,"context_line":"  without needing to implement a custom weigher for each resource."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"Proposed change"}],"source_content_type":"text/x-rst","patch_set":5,"id":"cfd10675_76d75c9e","line":50,"range":{"start_line":50,"start_character":35,"end_line":50,"end_character":53},"in_reply_to":"f57cec45_db88776f","updated":"2025-11-07 15:24:28.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":96,"context_line":"         │                    ├────────────────────\u003e│                   │"},{"line_number":97,"context_line":"         │                    │                     │                   │"},{"line_number":98,"context_line":"         │                    │  (alloc_reqs,       │                   │"},{"line_number":99,"context_line":"         │                    │   provider_summaries│                   │"},{"line_number":100,"context_line":"         │                    │   version)          │                   │"},{"line_number":101,"context_line":"         │                    │\u003c────────────────────┤                   │"},{"line_number":102,"context_line":"         │                    │                     │                   │"}],"source_content_type":"text/x-rst","patch_set":5,"id":"5ea35ead_c4daede6","line":99,"range":{"start_line":99,"start_character":51,"end_line":99,"end_character":54},"updated":"2025-10-14 17:17:16.000000000","message":"nit: missing comma","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":96,"context_line":"         │                    ├────────────────────\u003e│                   │"},{"line_number":97,"context_line":"         │                    │                     │                   │"},{"line_number":98,"context_line":"         │                    │  (alloc_reqs,       │                   │"},{"line_number":99,"context_line":"         │                    │   provider_summaries│                   │"},{"line_number":100,"context_line":"         │                    │   version)          │                   │"},{"line_number":101,"context_line":"         │                    │\u003c────────────────────┤                   │"},{"line_number":102,"context_line":"         │                    │                     │                   │"}],"source_content_type":"text/x-rst","patch_set":5,"id":"735ff49d_e74cd60b","line":99,"range":{"start_line":99,"start_character":51,"end_line":99,"end_character":54},"in_reply_to":"5ea35ead_c4daede6","updated":"2025-11-07 15:24:28.000000000","message":"Done","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":163,"context_line":""},{"line_number":164,"context_line":"**Key Points:**"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"* Provider summaries are fetched once per scheduling request from Placement"},{"line_number":167,"context_line":"* Data is indexed by root resource provider UUID (compute node UUID)"},{"line_number":168,"context_line":"* Generator wrappers extend HostState objects with deep-copied data before"},{"line_number":169,"context_line":"  filters and weighers execute"}],"source_content_type":"text/x-rst","patch_set":5,"id":"79e6f3d6_030f4b95","line":166,"updated":"2025-10-14 17:17:16.000000000","message":"I would say the data is already send from Placement to Nova in the GET allocation_candidates response. So it is not a new request to make or new data to transfer. It is just data that wasn\u0027t used in the past that much by nova.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":false,"context_lines":[{"line_number":163,"context_line":""},{"line_number":164,"context_line":"**Key Points:**"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"* Provider summaries are fetched once per scheduling request from Placement"},{"line_number":167,"context_line":"* Data is indexed by root resource provider UUID (compute node UUID)"},{"line_number":168,"context_line":"* Generator wrappers extend HostState objects with deep-copied data before"},{"line_number":169,"context_line":"  filters and weighers execute"}],"source_content_type":"text/x-rst","patch_set":5,"id":"b5041aaf_cc339112","line":166,"in_reply_to":"02a4361e_4683ba32","updated":"2025-11-07 16:10:41.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5691958a2c32841114b1dd936579adf161378f3d","unresolved":true,"context_lines":[{"line_number":163,"context_line":""},{"line_number":164,"context_line":"**Key Points:**"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"* Provider summaries are fetched once per scheduling request from Placement"},{"line_number":167,"context_line":"* Data is indexed by root resource provider UUID (compute node UUID)"},{"line_number":168,"context_line":"* Generator wrappers extend HostState objects with deep-copied data before"},{"line_number":169,"context_line":"  filters and weighers execute"}],"source_content_type":"text/x-rst","patch_set":5,"id":"02a4361e_4683ba32","line":166,"in_reply_to":"79e6f3d6_030f4b95","updated":"2025-10-14 17:45:53.000000000","message":"correct it is we are not adding a new request i can rephase.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"* Provider summaries are fetched once per scheduling request from Placement"},{"line_number":167,"context_line":"* Data is indexed by root resource provider UUID (compute node UUID)"},{"line_number":168,"context_line":"* Generator wrappers extend HostState objects with deep-copied data before"},{"line_number":169,"context_line":"  filters and weighers execute"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"The detailed flow is as follows:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"f41dde66_6ea6b28e","line":168,"range":{"start_line":168,"start_character":51,"end_line":168,"end_character":63},"updated":"2025-10-14 17:17:16.000000000","message":"What it the significance of the deep copying? If we mention it in the spec the I assume that somehow it is important from the spec perspective","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"* Provider summaries are fetched once per scheduling request from Placement"},{"line_number":167,"context_line":"* Data is indexed by root resource provider UUID (compute node UUID)"},{"line_number":168,"context_line":"* Generator wrappers extend HostState objects with deep-copied data before"},{"line_number":169,"context_line":"  filters and weighers execute"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"The detailed flow is as follows:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"70f8c0f0_b6d0b8f9","line":168,"range":{"start_line":168,"start_character":51,"end_line":168,"end_character":63},"in_reply_to":"4a714899_5e0b10fd","updated":"2025-11-07 16:10:41.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":true,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"* Provider summaries are fetched once per scheduling request from Placement"},{"line_number":167,"context_line":"* Data is indexed by root resource provider UUID (compute node UUID)"},{"line_number":168,"context_line":"* Generator wrappers extend HostState objects with deep-copied data before"},{"line_number":169,"context_line":"  filters and weighers execute"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"The detailed flow is as follows:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"4a714899_5e0b10fd","line":168,"range":{"start_line":168,"start_character":51,"end_line":168,"end_character":63},"in_reply_to":"d11f31d8_c935620b","updated":"2025-10-20 15:45:23.000000000","message":"yeah I lost the context on why I copied it. You can try removing the deep-copy and see if something starts failing. 😊\n\nMy point here is that this deep copy seems pretty far in the implementation detail side so to keep the spec small I would defer it to the implementation review.\n\nBut if you feel that this deep copy is important from design perspective then OK, just dig into it and see what it means.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5691958a2c32841114b1dd936579adf161378f3d","unresolved":true,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"* Provider summaries are fetched once per scheduling request from Placement"},{"line_number":167,"context_line":"* Data is indexed by root resource provider UUID (compute node UUID)"},{"line_number":168,"context_line":"* Generator wrappers extend HostState objects with deep-copied data before"},{"line_number":169,"context_line":"  filters and weighers execute"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"The detailed flow is as follows:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"d11f31d8_c935620b","line":168,"range":{"start_line":168,"start_character":51,"end_line":168,"end_character":63},"in_reply_to":"f41dde66_6ea6b28e","updated":"2025-10-14 17:45:53.000000000","message":"its not and this was a questino i was going to ask you.\n\nyou did it when you implemtned the propagation for the allcation candate to the filters and i wanted to see if i could remvoe it or do it only onece\n\nhttps://review.opendev.org/c/openstack/nova/+/953131/5/nova/scheduler/manager.py#361\n\nyou can see i have been devbating how best to do this in the poc and this is only here because of https://review.opendev.org/c/openstack/nova/+/953131/5/nova/scheduler/manager.py#353\n\ni did not have time to dig into why we were deepcopying there yet.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":186,"context_line":"       alloc_reqs_by_rp_uuid \u003d collections.defaultdict(list)"},{"line_number":187,"context_line":"       for ar in alloc_reqs:"},{"line_number":188,"context_line":"           for rp_uuid in ar[\u0027allocations\u0027]:"},{"line_number":189,"context_line":"               alloc_reqs_by_rp_uuid[rp_uuid].append(ar)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"3. **Extend HostState Objects** (adds ``hosts_with_provider_summaries``):"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"c7f64bdd_7800feab","line":189,"updated":"2025-10-14 17:17:16.000000000","message":"this does not talk about provider summaries","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":186,"context_line":"       alloc_reqs_by_rp_uuid \u003d collections.defaultdict(list)"},{"line_number":187,"context_line":"       for ar in alloc_reqs:"},{"line_number":188,"context_line":"           for rp_uuid in ar[\u0027allocations\u0027]:"},{"line_number":189,"context_line":"               alloc_reqs_by_rp_uuid[rp_uuid].append(ar)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"3. **Extend HostState Objects** (adds ``hosts_with_provider_summaries``):"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"68b87f3f_132ddcd4","line":189,"in_reply_to":"6d7e0605_e3dbb9ee","updated":"2025-11-07 15:24:28.000000000","message":"Done","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5691958a2c32841114b1dd936579adf161378f3d","unresolved":true,"context_lines":[{"line_number":186,"context_line":"       alloc_reqs_by_rp_uuid \u003d collections.defaultdict(list)"},{"line_number":187,"context_line":"       for ar in alloc_reqs:"},{"line_number":188,"context_line":"           for rp_uuid in ar[\u0027allocations\u0027]:"},{"line_number":189,"context_line":"               alloc_reqs_by_rp_uuid[rp_uuid].append(ar)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"3. **Extend HostState Objects** (adds ``hosts_with_provider_summaries``):"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"6d7e0605_e3dbb9ee","line":189,"in_reply_to":"c7f64bdd_7800feab","updated":"2025-10-14 17:45:53.000000000","message":"good pont this i jsut some of th erelated setup code. il remove this","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5691958a2c32841114b1dd936579adf161378f3d","unresolved":true,"context_lines":[{"line_number":199,"context_line":"               if host.uuid in provider_summaries:"},{"line_number":200,"context_line":"                   host.provider_summaries \u003d copy.deepcopy("},{"line_number":201,"context_line":"                       provider_summaries[host.uuid])"},{"line_number":202,"context_line":"               yield host"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"       # Lines ~382-386"},{"line_number":205,"context_line":"       if provider_summaries is not None:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"be8d3520_2dd23212","line":202,"updated":"2025-10-14 17:45:53.000000000","message":"as noted above this deep copy of the prodiver summeris\ncurrently only here because we deep copied the allocation candiates\nhere https://github.com/openstack/nova/blob/master/nova/scheduler/manager.py#L348-L355 and i have not had time to figure out why we need to do that.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":199,"context_line":"               if host.uuid in provider_summaries:"},{"line_number":200,"context_line":"                   host.provider_summaries \u003d copy.deepcopy("},{"line_number":201,"context_line":"                       provider_summaries[host.uuid])"},{"line_number":202,"context_line":"               yield host"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"       # Lines ~382-386"},{"line_number":205,"context_line":"       if provider_summaries is not None:"}],"source_content_type":"text/x-rst","patch_set":5,"id":"b49d4a3c_02950679","line":202,"in_reply_to":"be8d3520_2dd23212","updated":"2025-11-07 15:24:28.000000000","message":"Done","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":214,"context_line":"       # nova.scheduler.weights.resource_provider.ResourceProviderWeigher"},{"line_number":215,"context_line":"       for provider_uuid, provider_data in host_state.provider_summaries.items():"},{"line_number":216,"context_line":"           # Process resources and traits for scoring"},{"line_number":217,"context_line":"           ..."},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"HostState Modifications"},{"line_number":220,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":5,"id":"e7740f34_a657c40f","line":217,"updated":"2025-10-14 17:17:16.000000000","message":"I feel like this detailed flow is just fluff. I think you have a WIP patch, just link to it so if the reader wants it can read the code in its original context.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":214,"context_line":"       # nova.scheduler.weights.resource_provider.ResourceProviderWeigher"},{"line_number":215,"context_line":"       for provider_uuid, provider_data in host_state.provider_summaries.items():"},{"line_number":216,"context_line":"           # Process resources and traits for scoring"},{"line_number":217,"context_line":"           ..."},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"HostState Modifications"},{"line_number":220,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":5,"id":"8dadce9c_17aaac8a","line":217,"in_reply_to":"b4d47bf0_5728d5d2","updated":"2025-11-07 15:24:28.000000000","message":"Done","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5691958a2c32841114b1dd936579adf161378f3d","unresolved":true,"context_lines":[{"line_number":214,"context_line":"       # nova.scheduler.weights.resource_provider.ResourceProviderWeigher"},{"line_number":215,"context_line":"       for provider_uuid, provider_data in host_state.provider_summaries.items():"},{"line_number":216,"context_line":"           # Process resources and traits for scoring"},{"line_number":217,"context_line":"           ..."},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"HostState Modifications"},{"line_number":220,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":5,"id":"b4d47bf0_5728d5d2","line":217,"in_reply_to":"e7740f34_a657c40f","updated":"2025-10-14 17:45:53.000000000","message":"ack ya i do this is a summey of some of the chagne form that so i can remove it\nand provide a link if folks perfer.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":233,"context_line":"            self.allocation_candidates \u003d []"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"            # Added by THIS SPEC (2026.1 Gazpacho)"},{"line_number":236,"context_line":"            self.provider_summaries \u003d {}"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"``provider_summaries`` is a dict mapping provider UUIDs to provider data"},{"line_number":239,"context_line":"(resources, traits, parent UUID, root UUID). Both attributes are populated"}],"source_content_type":"text/x-rst","patch_set":5,"id":"719952e4_ed8ee059","line":236,"updated":"2025-10-14 17:17:16.000000000","message":"Again this is implementation detail. And it is a pretty trivial one. It simply adds a new dict field to the HostState. We don\u0027t need a code example for how to add a field. So it just inflates the size of the spec. I suggest to remove it","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":false,"context_lines":[{"line_number":233,"context_line":"            self.allocation_candidates \u003d []"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"            # Added by THIS SPEC (2026.1 Gazpacho)"},{"line_number":236,"context_line":"            self.provider_summaries \u003d {}"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"``provider_summaries`` is a dict mapping provider UUIDs to provider data"},{"line_number":239,"context_line":"(resources, traits, parent UUID, root UUID). Both attributes are populated"}],"source_content_type":"text/x-rst","patch_set":5,"id":"f83ee3a2_86eb37ba","line":236,"in_reply_to":"719952e4_ed8ee059","updated":"2025-11-07 16:10:41.000000000","message":"Done","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":239,"context_line":"(resources, traits, parent UUID, root UUID). Both attributes are populated"},{"line_number":240,"context_line":"by generator functions before filters and weighers execute, with deep-copied"},{"line_number":241,"context_line":"data to prevent cross-contamination."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":".. _`PCI device tracking in Placement`: https://specs.openstack.org/openstack/nova-specs/specs/zed/approved/pci-device-tracking-in-placement.html"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"Input Data Structure"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9aed792c_75997e68","line":242,"updated":"2025-10-14 17:17:16.000000000","message":"What cross-contamination we are talking about here. Could you be a bit more specific? Do we expect any of the weighers ever want to write anything in the HostState?","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5691958a2c32841114b1dd936579adf161378f3d","unresolved":true,"context_lines":[{"line_number":239,"context_line":"(resources, traits, parent UUID, root UUID). Both attributes are populated"},{"line_number":240,"context_line":"by generator functions before filters and weighers execute, with deep-copied"},{"line_number":241,"context_line":"data to prevent cross-contamination."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":".. _`PCI device tracking in Placement`: https://specs.openstack.org/openstack/nova-specs/specs/zed/approved/pci-device-tracking-in-placement.html"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"Input Data Structure"}],"source_content_type":"text/x-rst","patch_set":5,"id":"e4201b63_3e9682a7","line":242,"in_reply_to":"9aed792c_75997e68","updated":"2025-10-14 17:45:53.000000000","message":"i dont think weigher will ever modify it but as far as i can tell that seamed to be the reason for the deep copy of the allcation candiates.\n\nbut maybe im wrong about that?\n\ni know the filter mutate the list that is passed in but the do that by just removing elements. \n\nthis design is  mainly informed by the design of pci in placment and im not sure if its actully needed. this is explcity somethign i was hoping we coudl optimise out as i dont want do do any deep copies fo the provider summeris at all if we can avoid it and i was wonder if we can eventully go back and remove it form the allocation candiates as well.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":false,"context_lines":[{"line_number":239,"context_line":"(resources, traits, parent UUID, root UUID). Both attributes are populated"},{"line_number":240,"context_line":"by generator functions before filters and weighers execute, with deep-copied"},{"line_number":241,"context_line":"data to prevent cross-contamination."},{"line_number":242,"context_line":""},{"line_number":243,"context_line":".. _`PCI device tracking in Placement`: https://specs.openstack.org/openstack/nova-specs/specs/zed/approved/pci-device-tracking-in-placement.html"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"Input Data Structure"}],"source_content_type":"text/x-rst","patch_set":5,"id":"f8f90982_6413ff2c","line":242,"in_reply_to":"e4201b63_3e9682a7","updated":"2025-11-07 16:10:41.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":254,"context_line":"        \u003croot_rp_uuid\u003e: {"},{"line_number":255,"context_line":"            \u003cprovider_uuid_1\u003e: {"},{"line_number":256,"context_line":"                \u0027resources\u0027: {"},{"line_number":257,"context_line":"                    \u003cresource_class\u003e: (capacity, used),  # tuple of ints"},{"line_number":258,"context_line":"                    ..."},{"line_number":259,"context_line":"                },"},{"line_number":260,"context_line":"                \u0027traits\u0027: [\u003ctrait_name\u003e, ...],  # list of strings"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ad43cebe_62e6d2cd","line":257,"updated":"2025-10-14 17:17:16.000000000","message":"(just noting it no action needed)ohh, not even the reserved value is returned.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        \u003croot_rp_uuid\u003e: {"},{"line_number":255,"context_line":"            \u003cprovider_uuid_1\u003e: {"},{"line_number":256,"context_line":"                \u0027resources\u0027: {"},{"line_number":257,"context_line":"                    \u003cresource_class\u003e: (capacity, used),  # tuple of ints"},{"line_number":258,"context_line":"                    ..."},{"line_number":259,"context_line":"                },"},{"line_number":260,"context_line":"                \u0027traits\u0027: [\u003ctrait_name\u003e, ...],  # list of strings"}],"source_content_type":"text/x-rst","patch_set":5,"id":"0fc7e9a8_d4a7a9be","line":257,"in_reply_to":"6e83779d_7af5a70b","updated":"2025-11-07 16:10:41.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":true,"context_lines":[{"line_number":254,"context_line":"        \u003croot_rp_uuid\u003e: {"},{"line_number":255,"context_line":"            \u003cprovider_uuid_1\u003e: {"},{"line_number":256,"context_line":"                \u0027resources\u0027: {"},{"line_number":257,"context_line":"                    \u003cresource_class\u003e: (capacity, used),  # tuple of ints"},{"line_number":258,"context_line":"                    ..."},{"line_number":259,"context_line":"                },"},{"line_number":260,"context_line":"                \u0027traits\u0027: [\u003ctrait_name\u003e, ...],  # list of strings"}],"source_content_type":"text/x-rst","patch_set":5,"id":"6e83779d_7af5a70b","line":257,"in_reply_to":"ad43cebe_62e6d2cd","updated":"2025-11-07 15:24:28.000000000","message":"correct. that is ok becuase placement has already check we can fit but it means it cant be an input to our calulation","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":285,"context_line":"            },"},{"line_number":286,"context_line":"            \u0027compute-uuid-1-address\u0027: {"},{"line_number":287,"context_line":"                \u0027resources\u0027: {\u0027CUSTOM_PCI_\u003cvendor_id\u003e_\u003cproduct_id\u003e\u0027: (32, 5)},"},{"line_number":288,"context_line":"                \u0027traits\u0027: [],"},{"line_number":289,"context_line":"                \u0027parent_provider_uuid\u0027: \u0027compute-uuid-1\u0027,"},{"line_number":290,"context_line":"                \u0027root_provider_uuid\u0027: \u0027compute-uuid-1\u0027"},{"line_number":291,"context_line":"            }"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7ab60f7f_01456763","line":288,"updated":"2025-10-14 17:17:16.000000000","message":"just for the sake of completeness it will have at least COMPUTE_MANAGED_PCI_DEVICE on it.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5691958a2c32841114b1dd936579adf161378f3d","unresolved":true,"context_lines":[{"line_number":285,"context_line":"            },"},{"line_number":286,"context_line":"            \u0027compute-uuid-1-address\u0027: {"},{"line_number":287,"context_line":"                \u0027resources\u0027: {\u0027CUSTOM_PCI_\u003cvendor_id\u003e_\u003cproduct_id\u003e\u0027: (32, 5)},"},{"line_number":288,"context_line":"                \u0027traits\u0027: [],"},{"line_number":289,"context_line":"                \u0027parent_provider_uuid\u0027: \u0027compute-uuid-1\u0027,"},{"line_number":290,"context_line":"                \u0027root_provider_uuid\u0027: \u0027compute-uuid-1\u0027"},{"line_number":291,"context_line":"            }"}],"source_content_type":"text/x-rst","patch_set":5,"id":"c2af6321_84c5f65e","line":288,"in_reply_to":"7ab60f7f_01456763","updated":"2025-10-14 17:45:53.000000000","message":"ack i can add that.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":false,"context_lines":[{"line_number":285,"context_line":"            },"},{"line_number":286,"context_line":"            \u0027compute-uuid-1-address\u0027: {"},{"line_number":287,"context_line":"                \u0027resources\u0027: {\u0027CUSTOM_PCI_\u003cvendor_id\u003e_\u003cproduct_id\u003e\u0027: (32, 5)},"},{"line_number":288,"context_line":"                \u0027traits\u0027: [],"},{"line_number":289,"context_line":"                \u0027parent_provider_uuid\u0027: \u0027compute-uuid-1\u0027,"},{"line_number":290,"context_line":"                \u0027root_provider_uuid\u0027: \u0027compute-uuid-1\u0027"},{"line_number":291,"context_line":"            }"}],"source_content_type":"text/x-rst","patch_set":5,"id":"4272bdd0_4911e5be","line":288,"in_reply_to":"c2af6321_84c5f65e","updated":"2025-11-07 16:10:41.000000000","message":"Done","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"2e5e65eb02852125d097f34a7bab024db85c71c7","unresolved":true,"context_lines":[{"line_number":291,"context_line":"            }"},{"line_number":292,"context_line":"        }"},{"line_number":293,"context_line":"    }"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"Algorithm Implementation"},{"line_number":296,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":297,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"36defc05_fac71f3d","line":294,"updated":"2025-10-14 17:17:16.000000000","message":"I run out of time here. Hopefully I will have time to get back to this before the PTG.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":false,"context_lines":[{"line_number":291,"context_line":"            }"},{"line_number":292,"context_line":"        }"},{"line_number":293,"context_line":"    }"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"Algorithm Implementation"},{"line_number":296,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":297,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"4357a076_439b08e5","line":294,"in_reply_to":"36defc05_fac71f3d","updated":"2025-11-07 16:10:41.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":true,"context_lines":[{"line_number":295,"context_line":"Algorithm Implementation"},{"line_number":296,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"1. **Tree Flattening**: Aggregate resource capacities and traits across each"},{"line_number":299,"context_line":"   provider tree"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"2. **Resource Calculation**: For each resource class, calculate utilization"},{"line_number":302,"context_line":"   ratio ``1 - (requested / free_capacity)``, then take arithmetic mean across"}],"source_content_type":"text/x-rst","patch_set":5,"id":"78e56a78_36df8214","line":299,"range":{"start_line":298,"start_character":24,"end_line":299,"end_character":16},"updated":"2025-10-20 15:45:23.000000000","message":"do we really aggregate capacity across trees? Not just within each tree?","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":false,"context_lines":[{"line_number":295,"context_line":"Algorithm Implementation"},{"line_number":296,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":297,"context_line":""},{"line_number":298,"context_line":"1. **Tree Flattening**: Aggregate resource capacities and traits across each"},{"line_number":299,"context_line":"   provider tree"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"2. **Resource Calculation**: For each resource class, calculate utilization"},{"line_number":302,"context_line":"   ratio ``1 - (requested / free_capacity)``, then take arithmetic mean across"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7c545579_3ac2e074","line":299,"range":{"start_line":298,"start_character":24,"end_line":299,"end_character":16},"in_reply_to":"78e56a78_36df8214","updated":"2025-11-07 16:10:41.000000000","message":"oh this shoudl be each provider in the treee or within the tree\n\ngood catch","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"39b8debd8c51d0d38f6cc98483dcf6bc3584c72f","unresolved":true,"context_lines":[{"line_number":300,"context_line":""},{"line_number":301,"context_line":"2. **Resource Calculation**: For each resource class, calculate utilization"},{"line_number":302,"context_line":"   ratio ``1 - (requested / free_capacity)``, then take arithmetic mean across"},{"line_number":303,"context_line":"   all resource classes"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"3. **Trait Calculation**: Calculate ratio ``(requested_traits_present /"},{"line_number":306,"context_line":"   total_traits_on_provider)``"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ff94d414_b9e4bf86","line":303,"updated":"2025-10-20 16:20:18.000000000","message":"I guess I\u0027m not sure why this makes sense. If I\u0027m putting special/scarce resources into the RC list, I want to pretty much avoid those hosts for requests that don\u0027t require them, right?\n\nIt seems to me that the score here is mixing avoid-scarce-resources with avoid-busy-hosts. Or wait.. I think the goal you\u0027re going for is to get a higher score if my request more closely matches the full set of special resources the host has, is that right? You\u0027re prioritizing a high proposed utilization of what special resources a host has left? Meaning, maybe the host has a very special single device, and then after that one is allocated, it stops getting any special treatment because this score effectively goes away when there are no special resources to consider and thus it starts getting the boring instances? I guess that makes sense, although I\u0027m not sure that\u0027s what everyone would want in terms of sending cheap low-rent instances to compete with an important neighbor...","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":300,"context_line":""},{"line_number":301,"context_line":"2. **Resource Calculation**: For each resource class, calculate utilization"},{"line_number":302,"context_line":"   ratio ``1 - (requested / free_capacity)``, then take arithmetic mean across"},{"line_number":303,"context_line":"   all resource classes"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"3. **Trait Calculation**: Calculate ratio ``(requested_traits_present /"},{"line_number":306,"context_line":"   total_traits_on_provider)``"}],"source_content_type":"text/x-rst","patch_set":5,"id":"f33c2d51_37402b26","line":303,"in_reply_to":"d62f0540_a401b241","updated":"2025-11-07 15:24:28.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":true,"context_lines":[{"line_number":300,"context_line":""},{"line_number":301,"context_line":"2. **Resource Calculation**: For each resource class, calculate utilization"},{"line_number":302,"context_line":"   ratio ``1 - (requested / free_capacity)``, then take arithmetic mean across"},{"line_number":303,"context_line":"   all resource classes"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"3. **Trait Calculation**: Calculate ratio ``(requested_traits_present /"},{"line_number":306,"context_line":"   total_traits_on_provider)``"}],"source_content_type":"text/x-rst","patch_set":5,"id":"d62f0540_a401b241","line":303,"in_reply_to":"ff94d414_b9e4bf86","updated":"2025-10-21 17:45:51.000000000","message":"looking at this again i may have inverted this in the rewrite.\n\n\nreading this again i dont think this is the alghoritm i inteded.\n\nthe algotrihgm i inteded was ment to penaise host that have resources that i dont request.\n\nso if host A has vcpu ram and disk and host B has  has cpu ram disk and sriov nics\nthen we could choose host A because the presence of SRIOV would have negitivly biased host B\n\nthis is ment to be ``1 - (count of unrequest resoucen biased by utilisation and normalised)``\n\nhow i descived it in v3 was as follows\n\n\n```\n\n1. Tree Flattening\n   * Group providers by root UUID\n   * Aggregate resource capacities and traits across each tree\n2. Resource Calculation:\n  * For each available resource class in the provider tree:\n  * Sum available capacity across all providers in tree\n  * Calculate utilization ratio: ``1 - (requested amount of resource\n    class) / (free capacity of resource class)``\n  * Calculate the arithmetic mean of these ratios across all available\n    resource classes.\n 3. Trait Calculation:\n    - Collect all traits from tree providers\n   * Calculate ratio: ``(count of requested traits present on provider) /\n(count of all available traits on provider)``\n4. Weight Composition:\n   - Combine resource and trait scores: ``(resource_score + trait_score) / 2``\n   - Apply multiplier from scheduler configuration\n```\n\ntaking the example of host A and B above. lets assume the vm fully used the cpu ram and disk avaible.\n\nfor host A that would 1-(1/1) \u003d\u003d 0 for cpu ram and disk\nfor host B cpu ram and disk would also produce a score of 0 but 1-(0/#sriov_resouces) is 1\n\nso host A scores 0 and host B scores 1 so we prefer host A because it has the loset cost.\n\nif host C has CPU,RAM,DISK and a GPU it would also have a score of 1 in this case because by default  i want to treat all resouce equally and if you provide no config have 10 free gpus that you dont request should be the saem as 10 free sriov nic\n\nthe addtion of \n ```\n resource_provider_resources \u003d VCPU,MEMORY_MB,DISK_GB\n ```\n \nto the filter_scheduler section is there so that an operator can say what resouce classes they conisder special so that the weigher will only condier them\n \ni would like this weighed to do something reasonable without any admin confiruign \n\ni also considred suporting the same syntax as the metrics weigher and image properteis weigher \n\n ```\n resource_provider_resources \u003d VCPU\u003d2.0 MEMORY_MB\u003d0.5 DISK_GB\u003d-1.5\n ```\nhttps://docs.openstack.org/nova/latest/configuration/config.html#metrics.weight_setting\n\nthat can be supported in the future if we want too but again i was starting simple.\n\nthe long term goal woudl be to evolve this weigher to also support prefered and avoided traits.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"39b8debd8c51d0d38f6cc98483dcf6bc3584c72f","unresolved":true,"context_lines":[{"line_number":303,"context_line":"   all resource classes"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"3. **Trait Calculation**: Calculate ratio ``(requested_traits_present /"},{"line_number":306,"context_line":"   total_traits_on_provider)``"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"4. **Weight Composition**: Combine scores"},{"line_number":309,"context_line":"   ``(resource_score + trait_score) / 2`` and apply configured multiplier"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ab17963d_3458c4cb","line":306,"updated":"2025-10-20 16:20:18.000000000","message":"This seems somewhat at odds with the above, doesn\u0027t it? If you\u0027re planning to send the special instances to the host until the special stuff is allocated and then fill the host with the cheap ones, this is going to start working against you for selecting those right? I guess this goes to my point above that some people may want that avoid-the-special-hosts behavior and some may want the lack of any available special resources to attract cheap instances to maximize packing.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":303,"context_line":"   all resource classes"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"3. **Trait Calculation**: Calculate ratio ``(requested_traits_present /"},{"line_number":306,"context_line":"   total_traits_on_provider)``"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"4. **Weight Composition**: Combine scores"},{"line_number":309,"context_line":"   ``(resource_score + trait_score) / 2`` and apply configured multiplier"}],"source_content_type":"text/x-rst","patch_set":5,"id":"800c0dec_941d0e7a","line":306,"in_reply_to":"2528088a_3b065ac3","updated":"2025-11-07 15:24:28.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":true,"context_lines":[{"line_number":303,"context_line":"   all resource classes"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"3. **Trait Calculation**: Calculate ratio ``(requested_traits_present /"},{"line_number":306,"context_line":"   total_traits_on_provider)``"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"4. **Weight Composition**: Combine scores"},{"line_number":309,"context_line":"   ``(resource_score + trait_score) / 2`` and apply configured multiplier"}],"source_content_type":"text/x-rst","patch_set":5,"id":"2528088a_3b065ac3","line":306,"in_reply_to":"ab17963d_3458c4cb","updated":"2025-10-21 17:45:51.000000000","message":"so resource classes are not the only thing that makes a host special\n\nCPU feature flags or other traits like the custom traits we use for windows\n\ntoday for windows vs linux guess we often suggest using forbidden traits for liscienign reason but i want to eventually support avoided and preferred traits to softer (anti)affinity \n\nexplicitly example is i want to be able to use watcher to tag compute nodes with PRESSURE_MEMORY PRESSURE_IO_WAIT\n\n\nif we had 2 idencialy hosts with the same resources and tratits and watcher or another service annotated one with the PRESSURE_MEMORY trait\n\nrequested_traits_present / total_traits_on_provider\n\navoid the host with memory pressure.\n\n\nsimilarly if we have 2 otherwise identical hosts but one support AVX512 and the other does not it will prefer to schedule to the host with out the fance cpu feature flag.\n\nif you only want to schdule based on teh PRESSURE_* traits you woudl use\n\nresource_provider_traits \u003d ... to express that.\n\ni pulled these usecases out of the spec to keep it smaller but maybe i shoudl read them to make it clear.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":true,"context_lines":[{"line_number":306,"context_line":"   total_traits_on_provider)``"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"4. **Weight Composition**: Combine scores"},{"line_number":309,"context_line":"   ``(resource_score + trait_score) / 2`` and apply configured multiplier"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"Configuration"},{"line_number":312,"context_line":"~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":5,"id":"fd9d4e9b_b3404390","line":309,"updated":"2025-10-21 17:45:51.000000000","message":"by the way the way i am presenting this is in terms of a cost.\nassuming we select the host with the lowest value for the weight as our best case.\n\nlooking at https://github.com/openstack/nova/blob/master/nova/scheduler/weights/ram.py#L42\n\nwe might actually choose the max value \n\nin anycase we can get the other sematic by doin g\n\n`1-((resource_score + trait_score) / 2)`\n\nmy unit test are only using one wegher\n\nhttps://review.opendev.org/c/openstack/nova/+/953131/5/nova/tests/unit/scheduler/weights/test_resource_provider.py#180\n\nso i need to confirm this so that posivie and negitive multipleier spread/pack correctly with respect to positive and negitive multiplier for the cpu and ram filters which all return free_\u003cresouce\u003e so biger number meen more space and a better choice to spread to when we sort them.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":306,"context_line":"   total_traits_on_provider)``"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"4. **Weight Composition**: Combine scores"},{"line_number":309,"context_line":"   ``(resource_score + trait_score) / 2`` and apply configured multiplier"},{"line_number":310,"context_line":""},{"line_number":311,"context_line":"Configuration"},{"line_number":312,"context_line":"~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":5,"id":"f62f57fc_bc841cae","line":309,"in_reply_to":"fd9d4e9b_b3404390","updated":"2025-11-07 15:24:28.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":true,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"* Free capacity: 6 VCPUs"},{"line_number":339,"context_line":"* Requested: 2 VCPUs"},{"line_number":340,"context_line":"* Utilization ratio: 1 - (2/6) \u003d 0.67"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"Trait score calculation:"},{"line_number":343,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"eefa7d40_9bb7ed41","line":340,"updated":"2025-10-20 15:45:23.000000000","message":"for me utilization means \"used\"/\"total\". So here that either would be\n* current utilization without the request 2/8 \u003d 25%\n* new utilization after the request 4/8 \u003d 50%\n\nI\u0027m not sure what exactly the formula here measures. I think explanation is needed.\n\nOne edge case I see already with the current formula is that Free can be zero and this can lead to division by zero here. One can say that hey, but if we have 0 CPUs then the host is already filtered so never weighed. And that would be true for CPU which is an essential resource. But it could very well happen for an optional resource like GPU that is fully utilized already, and the current VM is not requesting it. For that case the formula leads to 1-(0/0).","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"* Free capacity: 6 VCPUs"},{"line_number":339,"context_line":"* Requested: 2 VCPUs"},{"line_number":340,"context_line":"* Utilization ratio: 1 - (2/6) \u003d 0.67"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"Trait score calculation:"},{"line_number":343,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"2220b743_228cfe97","line":340,"in_reply_to":"95e960a2_d43397f3","updated":"2025-11-07 15:24:28.000000000","message":"i have added an explanation in the next revision but im open to changing the wording or the calculation. ill resolve this for now and we can discuss it again in the new verison","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":true,"context_lines":[{"line_number":337,"context_line":""},{"line_number":338,"context_line":"* Free capacity: 6 VCPUs"},{"line_number":339,"context_line":"* Requested: 2 VCPUs"},{"line_number":340,"context_line":"* Utilization ratio: 1 - (2/6) \u003d 0.67"},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"Trait score calculation:"},{"line_number":343,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"95e960a2_d43397f3","line":340,"in_reply_to":"eefa7d40_9bb7ed41","updated":"2025-10-21 17:45:51.000000000","message":"its how much of the remainign capstiy will be used.\n\ni guess i could have done ths as 2/8 or 4/8 instead of using 2 of the 6 free VCPUs\n\nthis is basicly a mesure fo the cost.\n\ni was tryign to prefer  the host with the most free resouces which 4/8 (new utilization after the request) also does if that is simpelr to reason about.\n\ninstead of  1-(2/6)","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":true,"context_lines":[{"line_number":341,"context_line":""},{"line_number":342,"context_line":"Trait score calculation:"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"* Requested traits: 1 (CUSTOM_SSD)"},{"line_number":345,"context_line":"* Available traits: 2 (CUSTOM_SSD, HW_CPU_X86_AVX2)"},{"line_number":346,"context_line":"* Trait ratio: 1/2 \u003d 0.5"},{"line_number":347,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ed5a1245_7af725e7","line":344,"updated":"2025-10-20 15:45:23.000000000","message":"CUSTOM_SSD is not in the weigher configuration resource_provider_traits so this example is now inconsistent","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":341,"context_line":""},{"line_number":342,"context_line":"Trait score calculation:"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"* Requested traits: 1 (CUSTOM_SSD)"},{"line_number":345,"context_line":"* Available traits: 2 (CUSTOM_SSD, HW_CPU_X86_AVX2)"},{"line_number":346,"context_line":"* Trait ratio: 1/2 \u003d 0.5"},{"line_number":347,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"36523466_74c20d29","line":344,"in_reply_to":"0cae3662_951bd087","updated":"2025-11-07 15:24:28.000000000","message":"Done","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":true,"context_lines":[{"line_number":341,"context_line":""},{"line_number":342,"context_line":"Trait score calculation:"},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"* Requested traits: 1 (CUSTOM_SSD)"},{"line_number":345,"context_line":"* Available traits: 2 (CUSTOM_SSD, HW_CPU_X86_AVX2)"},{"line_number":346,"context_line":"* Trait ratio: 1/2 \u003d 0.5"},{"line_number":347,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"0cae3662_951bd087","line":344,"in_reply_to":"ed5a1245_7af725e7","updated":"2025-10-21 17:45:51.000000000","message":"oh this is not ment to be with respect to \n\nhttps://review.opendev.org/c/openstack/nova-specs/+/951222/5/specs/2026.1/approved/resource-provider-weigher.rst#324\n\nthe examples of the config options.\n\ni create these orgianlly assuming no config option were present as i actully intoduced the config option after this in an elier revsion.\n\ni can see how that could be confusting with the new ordering.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":true,"context_lines":[{"line_number":343,"context_line":""},{"line_number":344,"context_line":"* Requested traits: 1 (CUSTOM_SSD)"},{"line_number":345,"context_line":"* Available traits: 2 (CUSTOM_SSD, HW_CPU_X86_AVX2)"},{"line_number":346,"context_line":"* Trait ratio: 1/2 \u003d 0.5"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Final weight: (0.67 + 0.5) / 2 \u003d 0.585"},{"line_number":349,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"8fd73cc4_64d9fdbf","line":346,"updated":"2025-10-20 15:45:23.000000000","message":"OK so here it is len(requested_traits) / len(provided_traits) . That is closer to an utilization definition. But we still need to account for division by zero as the provided traits are filtered by resource_provider_traits (I assume) so even if all compute has some traits the filtered result can be empty.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":true,"context_lines":[{"line_number":343,"context_line":""},{"line_number":344,"context_line":"* Requested traits: 1 (CUSTOM_SSD)"},{"line_number":345,"context_line":"* Available traits: 2 (CUSTOM_SSD, HW_CPU_X86_AVX2)"},{"line_number":346,"context_line":"* Trait ratio: 1/2 \u003d 0.5"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Final weight: (0.67 + 0.5) / 2 \u003d 0.585"},{"line_number":349,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"c961f341_1d45cb0b","line":346,"in_reply_to":"8fd73cc4_64d9fdbf","updated":"2025-10-21 17:45:51.000000000","message":"so we will never have 0 traits on a compute node because we always report CPU feature and the compute_node trait.\n\nhttps://github.com/openstack/os-traits/blob/master/os_traits/compute/__init__.py#L18-L21\n\nso there is alwasy at least 1 trait on the root rp\nand since this is the sum of all the tratis on tree that min value for the tree is alwasy 1\n\nthat is also why i am alwasy putting the resuqsted value as the numerator.\nits fine for that to be 0","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":343,"context_line":""},{"line_number":344,"context_line":"* Requested traits: 1 (CUSTOM_SSD)"},{"line_number":345,"context_line":"* Available traits: 2 (CUSTOM_SSD, HW_CPU_X86_AVX2)"},{"line_number":346,"context_line":"* Trait ratio: 1/2 \u003d 0.5"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Final weight: (0.67 + 0.5) / 2 \u003d 0.585"},{"line_number":349,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"6e1fe67c_11d07c41","line":346,"in_reply_to":"ba1d1919_f71f2db2","updated":"2025-11-07 15:24:28.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c90426467dd42e842ac8b8e73d60c4f36f72c98b","unresolved":true,"context_lines":[{"line_number":343,"context_line":""},{"line_number":344,"context_line":"* Requested traits: 1 (CUSTOM_SSD)"},{"line_number":345,"context_line":"* Available traits: 2 (CUSTOM_SSD, HW_CPU_X86_AVX2)"},{"line_number":346,"context_line":"* Trait ratio: 1/2 \u003d 0.5"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Final weight: (0.67 + 0.5) / 2 \u003d 0.585"},{"line_number":349,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ff4b06c6_bb974302","line":346,"in_reply_to":"c961f341_1d45cb0b","updated":"2025-10-27 17:01:30.000000000","message":"Does the available traits are filtered by the config option resource_provider_traits? If so then even if the compute RP always have a bunch of traits if the intersect(resource_provider_traits, available_traits) is empty then the the formula will try to divide by 0 afaik.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1145f936917e5e0808b22cf2baddf57ae38b8ff0","unresolved":true,"context_lines":[{"line_number":343,"context_line":""},{"line_number":344,"context_line":"* Requested traits: 1 (CUSTOM_SSD)"},{"line_number":345,"context_line":"* Available traits: 2 (CUSTOM_SSD, HW_CPU_X86_AVX2)"},{"line_number":346,"context_line":"* Trait ratio: 1/2 \u003d 0.5"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Final weight: (0.67 + 0.5) / 2 \u003d 0.585"},{"line_number":349,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba1d1919_f71f2db2","line":346,"in_reply_to":"ff4b06c6_bb974302","updated":"2025-10-28 15:56:53.000000000","message":"resource_provider_traits defaults to unset meaning all traits shoudl be considerd\n\nif its defiend it would list the set of traits to consider but it would cosider the empty string the same as undefiend meaning all traits.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":true,"context_lines":[{"line_number":346,"context_line":"* Trait ratio: 1/2 \u003d 0.5"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Final weight: (0.67 + 0.5) / 2 \u003d 0.585"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"Pseudocode Implementation"},{"line_number":351,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":352,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ca171692_ba49dd6a","line":349,"updated":"2025-10-20 15:45:23.000000000","message":"Will there be a need for differnet important RCs or traits on different computes? \n\nE.g. could it be that on a host that has GPUs some of the CPU flags are important traits but on other hosts without GPUs that CPU flag is not important any more?\n\nWould be nice to see a realistic example where both RC and Trait are marked as important to better judge it.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":346,"context_line":"* Trait ratio: 1/2 \u003d 0.5"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Final weight: (0.67 + 0.5) / 2 \u003d 0.585"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"Pseudocode Implementation"},{"line_number":351,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":352,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"fb6b488b_637503f3","line":349,"in_reply_to":"1b6baadf_4e9ccb7b","updated":"2025-11-07 15:24:28.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":true,"context_lines":[{"line_number":346,"context_line":"* Trait ratio: 1/2 \u003d 0.5"},{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Final weight: (0.67 + 0.5) / 2 \u003d 0.585"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"Pseudocode Implementation"},{"line_number":351,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":352,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"1b6baadf_4e9ccb7b","line":349,"in_reply_to":"ca171692_ba49dd6a","updated":"2025-10-21 17:45:51.000000000","message":"if we wanted to support that we could via host aggregate metadata i guess.\n\nbut that was not a case i intened to support at the host level.\n\ni did intened to supprot chsing the imporatn trait via the","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":true,"context_lines":[{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Final weight: (0.67 + 0.5) / 2 \u003d 0.585"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"Pseudocode Implementation"},{"line_number":351,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":".. code-block:: python"}],"source_content_type":"text/x-rst","patch_set":5,"id":"7f4e5ceb_f658531a","line":350,"updated":"2025-10-20 15:45:23.000000000","message":"sorry I would rather review this with syntax highlight and unit test coverage once we are there. Is there any specific implementation detail below you want to point out as affecting the overall design? If so then I\u0027m happy to review that specific thing.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1145f936917e5e0808b22cf2baddf57ae38b8ff0","unresolved":true,"context_lines":[{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Final weight: (0.67 + 0.5) / 2 \u003d 0.585"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"Pseudocode Implementation"},{"line_number":351,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":".. code-block:: python"}],"source_content_type":"text/x-rst","patch_set":5,"id":"588dc559_9dfc3c79","line":350,"in_reply_to":"272cff0b_57e9aca1","updated":"2025-10-28 15:56:53.000000000","message":"honestly the only reason there is code in this spec at all is dan said it was useful last cycle but i had not written the patches at that point so i think i can just add a point to the code now.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":false,"context_lines":[{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Final weight: (0.67 + 0.5) / 2 \u003d 0.585"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"Pseudocode Implementation"},{"line_number":351,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":".. code-block:: python"}],"source_content_type":"text/x-rst","patch_set":5,"id":"eeb39b5f_4ec9194f","line":350,"in_reply_to":"588dc559_9dfc3c79","updated":"2025-11-07 16:10:41.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c90426467dd42e842ac8b8e73d60c4f36f72c98b","unresolved":true,"context_lines":[{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Final weight: (0.67 + 0.5) / 2 \u003d 0.585"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"Pseudocode Implementation"},{"line_number":351,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":".. code-block:: python"}],"source_content_type":"text/x-rst","patch_set":5,"id":"272cff0b_57e9aca1","line":350,"in_reply_to":"6d98e66b_79dbbe3d","updated":"2025-10-27 17:01:30.000000000","message":"OK so we have patches with the code thanks. Can we replace the code in the spec then to point to the code patches instead? Or Is there any specific implementation detail below you want to point out as affecting the overall design and therefore needed in the spec?","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":true,"context_lines":[{"line_number":347,"context_line":""},{"line_number":348,"context_line":"Final weight: (0.67 + 0.5) / 2 \u003d 0.585"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"Pseudocode Implementation"},{"line_number":351,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":352,"context_line":""},{"line_number":353,"context_line":".. code-block:: python"}],"source_content_type":"text/x-rst","patch_set":5,"id":"6d98e66b_79dbbe3d","line":350,"in_reply_to":"7f4e5ceb_f658531a","updated":"2025-10-21 17:45:51.000000000","message":"unit test are already avaibel in my poc \n\ni made a slight mistatke between v3 and v5\n\ni change the unit test to expect a singel resocue provider symmery dict to be passed in instead of the full set of provider summerise.\n\nso v3 has the correct data structures for the provider summery which is a list of dict were each dict is a summery of a provider\n\n\nhttps://review.opendev.org/c/openstack/nova/+/953131/3/nova/tests/unit/scheduler/weights/test_resource_provider.py\n\nbut its using a tuple of capsity and used in stead fo a dict fo capsity and used.\n\ni also have complex examples showing how it could be extened to supprot prefered/avoided traits in the future\n\nhttps://review.opendev.org/c/openstack/nova/+/953131/3/nova/tests/unit/scheduler/weights/test_resource_provider.py#376\n\ni fixed the tuple to be a dict but i regress the prodier summeris to nolonger be a list of dict but only be the root provider.\n\nhttps://review.opendev.org/c/openstack/nova/+/953131/5/nova/tests/unit/scheduler/weights/test_resource_provider.py\n\nthat needs to be fixed but the over all logic of the test is mostly corect.\n\nthe functional test need more wrok to better demonstrate the behaviour\n\nhttps://review.opendev.org/c/openstack/nova/+/953131/5/nova/tests/functional/test_resource_provider_weigher.py\n\nbut the unit test already cover many of the edge cases.\n\n\ni was originally planning to implement this last cycle so i have a semi complete implementation, however i did so in a rush in 3 discinct short  busts  of effort over 6 months so there are some bugs in my current code. \n\ni originally wanted to have a feature complete implementation with tests ready before the ptg but that wont actually happen now.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":true,"context_lines":[{"line_number":386,"context_line":"            aggregated_traits, requested_traits)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        # Combine scores (arithmetic mean)"},{"line_number":389,"context_line":"        return (resource_score + trait_score) / 2.0"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"Alternatives"},{"line_number":392,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"903cbbae_d3f6ad3e","line":389,"updated":"2025-10-21 17:45:51.000000000","message":"this is a simpliged version fo the v3 impentation\n\nhttps://review.opendev.org/c/openstack/nova/+/953131/3/nova/scheduler/weights/resource_provider.py#74\n\nas i said above v5 is both more correct and has bugs because i got confsed about the api respocne format and made teh wrong choice when i realised the unit test and fucntional tests were using different data.\n\nill simplfy this futer as the its bascilly just 3 steps\n\n1.) cll a funciton to prepared the flattened view of the provider summery relevent to this host.\n2.) calulate the cost of the host based on resouce class inventoies\n3.) calulate the cost based on traits\n4.) return the comined normalised cost\n\n\nits slightly more complicated the the psudo code above because the flattening need to account for finding all RPs that have the root resouce provder \u003d to this compute nodes rp uuid and optionally alcoe any sharing resouce providers.\n\ni say that is optional because i dont think the shareing resouce provder are needed for this inital version and i dont know if we say which host they are shared with in teh provier summerise so if we dont then i really dont wnat to incldue them until we have a usecase for that.\n\nso for testing and sainity sake i want to have a simple prepare_flattened_summery\nfunction that hide the detail of that and returns the  aggregated_resources and  aggregated_traits form the _weigh_object function.\n\ni.e. \n aggregated_resources, aggregated_traits \u003d prepare_flattened_summery(host_state)","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":false,"context_lines":[{"line_number":386,"context_line":"            aggregated_traits, requested_traits)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"        # Combine scores (arithmetic mean)"},{"line_number":389,"context_line":"        return (resource_score + trait_score) / 2.0"},{"line_number":390,"context_line":""},{"line_number":391,"context_line":"Alternatives"},{"line_number":392,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"61739c0f_4eaff8fd","line":389,"in_reply_to":"903cbbae_d3f6ad3e","updated":"2025-11-07 16:10:41.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":true,"context_lines":[{"line_number":463,"context_line":"* Number of candidate hosts (linear)"},{"line_number":464,"context_line":"* Complexity of provider trees on each host (typically small, \u003c 10"},{"line_number":465,"context_line":"  providers per tree)"},{"line_number":466,"context_line":"* Number of resource classes and traits being evaluated"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"In typical deployments with moderate-sized provider trees, the added"},{"line_number":469,"context_line":"latency per scheduling decision should be small; however, this can be"}],"source_content_type":"text/x-rst","patch_set":5,"id":"dc6fb0b2_8153dd45","line":466,"updated":"2025-10-20 15:45:23.000000000","message":"The number of traits on RPs can be large. In my normal devstack deployment I count 53 per root provider. Does it really matter how many traits we have? As far as I understand we don\u0027t do a separate calculation on each trait independently.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":false,"context_lines":[{"line_number":463,"context_line":"* Number of candidate hosts (linear)"},{"line_number":464,"context_line":"* Complexity of provider trees on each host (typically small, \u003c 10"},{"line_number":465,"context_line":"  providers per tree)"},{"line_number":466,"context_line":"* Number of resource classes and traits being evaluated"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"In typical deployments with moderate-sized provider trees, the added"},{"line_number":469,"context_line":"latency per scheduling decision should be small; however, this can be"}],"source_content_type":"text/x-rst","patch_set":5,"id":"646b1926_47a4ba50","line":466,"in_reply_to":"d35326fe_37225c4d","updated":"2025-11-07 16:10:41.000000000","message":"Done","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":true,"context_lines":[{"line_number":463,"context_line":"* Number of candidate hosts (linear)"},{"line_number":464,"context_line":"* Complexity of provider trees on each host (typically small, \u003c 10"},{"line_number":465,"context_line":"  providers per tree)"},{"line_number":466,"context_line":"* Number of resource classes and traits being evaluated"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"In typical deployments with moderate-sized provider trees, the added"},{"line_number":469,"context_line":"latency per scheduling decision should be small; however, this can be"}],"source_content_type":"text/x-rst","patch_set":5,"id":"d35326fe_37225c4d","line":466,"in_reply_to":"dc6fb0b2_8153dd45","updated":"2025-10-21 17:45:51.000000000","message":"right we doen the scalign for traits and resouce calsses is actully mostly linear and its very cheap. in the tratis case we are just counting them \n\nfor the resouce classes its slight more expensive as we have to combine teh capsities and used values btu honestly this is not going to be expensive.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8c20e1e621ef923a57e99358f21c73ff75caf540","unresolved":true,"context_lines":[{"line_number":467,"context_line":""},{"line_number":468,"context_line":"In typical deployments with moderate-sized provider trees, the added"},{"line_number":469,"context_line":"latency per scheduling decision should be small; however, this can be"},{"line_number":470,"context_line":"mitigated by reducing the number of allocation candidates considered."},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"Other deployer impact"},{"line_number":473,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"1d1eb9b9_b455eb00","line":470,"updated":"2025-10-20 15:45:23.000000000","message":"to be precise I think what can be done is reducing the number of compute hosts considered. When there is multiple candidates per compute host the a_c response has just a single set of provider summaries to that host. So changing the number of candidates from the same host does not change the work done by the weigher. Or at least should not, as it should only calculate the weight per host not weight per candidate","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea88e747aa16c981944b5ac8bd45fdebed5bc0bd","unresolved":true,"context_lines":[{"line_number":467,"context_line":""},{"line_number":468,"context_line":"In typical deployments with moderate-sized provider trees, the added"},{"line_number":469,"context_line":"latency per scheduling decision should be small; however, this can be"},{"line_number":470,"context_line":"mitigated by reducing the number of allocation candidates considered."},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"Other deployer impact"},{"line_number":473,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"495556be_bcde7327","line":470,"in_reply_to":"1d1eb9b9_b455eb00","updated":"2025-10-21 17:45:51.000000000","message":"ya i was thinking of the case where the placement stragy is breat first and restricting the number of candiate si effectivly just limiting the number of host.\n\nyou what you said is indeed more precise.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6369fa29ec30ad85d0f62e00849fb7c4fc191cd7","unresolved":false,"context_lines":[{"line_number":467,"context_line":""},{"line_number":468,"context_line":"In typical deployments with moderate-sized provider trees, the added"},{"line_number":469,"context_line":"latency per scheduling decision should be small; however, this can be"},{"line_number":470,"context_line":"mitigated by reducing the number of allocation candidates considered."},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"Other deployer impact"},{"line_number":473,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":5,"id":"80921958_9a53b94f","line":470,"in_reply_to":"495556be_bcde7327","updated":"2025-11-07 16:10:41.000000000","message":"Done","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d34a66a736d866d08eeffa7629482956fc30bcc7","unresolved":true,"context_lines":[{"line_number":571,"context_line":"     - Description"},{"line_number":572,"context_line":"   * - 2026.1 Gazpacho"},{"line_number":573,"context_line":"     - Introduced ResourceProviderWeigher for capacity-aware scheduling"},{"line_number":574,"context_line":"       based on Placement provider tree data."}],"source_content_type":"text/x-rst","patch_set":5,"id":"7dbdf7b6_2a4a6949","line":574,"updated":"2025-10-21 17:54:26.000000000","message":"i debated if this shoudl be intorduced or repospoed but i went of the former because i effectivly gutted the orginal spec to just pull out the weigher.\n\nlooking back i now realsise i have lost some fo the motivating usecase like allowing external service to annothat host with PRESSURE_* traits and\n\nthe eventual evoltion of the weiher to impled prefered and avoided trait form the flavor and config.\n\nim conflicted between which to add and wich to remvoe to this spec.\nill remove much of the impletion detail that is not addinv value and see if i can reflect on how to caputre those usescase that i removed by mistake.\n\nthe prevered/avoided traits supprot im going to leave as a strech goal but if folks would prefer not to incldue it at all i can do that instead as a folow ups spec of as a sepeate patch to this spec.\n\nim trying to blance all the context i have in my head vs the leght of this spec.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4ad8a36cc0b37b3f6b7ad9b4edb4533c195c1d2a","unresolved":true,"context_lines":[{"line_number":571,"context_line":"     - Description"},{"line_number":572,"context_line":"   * - 2026.1 Gazpacho"},{"line_number":573,"context_line":"     - Introduced ResourceProviderWeigher for capacity-aware scheduling"},{"line_number":574,"context_line":"       based on Placement provider tree data."}],"source_content_type":"text/x-rst","patch_set":5,"id":"d825af2a_8162be1b","line":574,"in_reply_to":"7dbdf7b6_2a4a6949","updated":"2025-10-21 18:15:25.000000000","message":"if the topic of pressure traits and this does not ring a bell\n\nits form this ptg ducssion last cycle  https://etherpad.opendev.org/p/r.bf5f1185e201e31ed8c3adeb45e3cf6d#L778\n\nrelated to our desire to do telemetry aware scheduling based on trait that are appled asynchronously by an external system so that we are not just able to schdule based on free cpus but we can also cosider host cpu utilisation.\n\nin a similar vain if a system is swaping to disk alot or is unterwse experiencing high memory pressure or io wait we shoudl also avoid that host.\n\nthere is a somehwat related topic to this for this ptg \n\"OVH\u0027s monitoring-aware scheduling\"\n\nhttps://etherpad.opendev.org/p/nova-2026.1-ptg#L452 \n\nthe deta is in there poc they do the evaluate of cpu pressure in teh schdluer as a filter that queries promethous directly.\n\ni very much also had these usecuse in mind when desgining this filter to make sure it could fullfil them as well.","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6d0fc024e67fa073acba6ef0295f321399e71a23","unresolved":false,"context_lines":[{"line_number":571,"context_line":"     - Description"},{"line_number":572,"context_line":"   * - 2026.1 Gazpacho"},{"line_number":573,"context_line":"     - Introduced ResourceProviderWeigher for capacity-aware scheduling"},{"line_number":574,"context_line":"       based on Placement provider tree data."}],"source_content_type":"text/x-rst","patch_set":5,"id":"b4679647_09b580e1","line":574,"in_reply_to":"d825af2a_8162be1b","updated":"2025-11-07 15:24:28.000000000","message":"Acknowledged","commit_id":"38b5e63cf3d56df4568a9640e40ea3283ada7b95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"58981a7eb086167d3f35acd38ceea102d3116f2b","unresolved":true,"context_lines":[{"line_number":54,"context_line":"* As a cloud operator, I want to be able to express preferred and"},{"line_number":55,"context_line":"  avoided traits in the scheduler and flavor, so that I can optimize"},{"line_number":56,"context_line":"  the placement decisions based on soft constraints."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Proposed change"},{"line_number":59,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"625d905c_78aa7a20","line":57,"updated":"2025-11-18 16:00:07.000000000","message":"Do we have a good working example of a preferred or avoided trait?","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b56dd74ea39daadd76d5423f803908110085c8e2","unresolved":true,"context_lines":[{"line_number":54,"context_line":"* As a cloud operator, I want to be able to express preferred and"},{"line_number":55,"context_line":"  avoided traits in the scheduler and flavor, so that I can optimize"},{"line_number":56,"context_line":"  the placement decisions based on soft constraints."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"Proposed change"},{"line_number":59,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"a5b4fcba_a78d1fe0","line":57,"in_reply_to":"625d905c_78aa7a20","updated":"2025-11-18 16:28:57.000000000","message":"avoid traits are easy they are the new PRESSURE_* triats i.e. PRESSURE_CPU \n\nprefered traits are thing like cpu flags i.e. AVX2\n\nif you have a worklaod that needs the x86-64-v2 micoroarchitecutre level to work but works better on x86-64-v3 or v4\n\nyou woudl list SSE4_2 as a requried trait but AVX2 as a prefered trait.\n\nhttps://en.wikipedia.org/wiki/X86-64#Microarchitecture_levels","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"58981a7eb086167d3f35acd38ceea102d3116f2b","unresolved":true,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"**Key Points:**"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"* Provider summaries are fetched once per scheduling request from Placement"},{"line_number":174,"context_line":"* Data is indexed by root resource provider UUID (compute node UUID)"},{"line_number":175,"context_line":"* Generator wrappers populate HostState objects with allocation candidates"},{"line_number":176,"context_line":"  and provider summaries before filters and weighers execute"}],"source_content_type":"text/x-rst","patch_set":6,"id":"4084deae_34988c56","line":173,"updated":"2025-11-18 16:00:07.000000000","message":"Provider summaries are already part of the GET allocation_candidates responses so no new or modified request to Placement is needed.","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b56dd74ea39daadd76d5423f803908110085c8e2","unresolved":true,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"**Key Points:**"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"* Provider summaries are fetched once per scheduling request from Placement"},{"line_number":174,"context_line":"* Data is indexed by root resource provider UUID (compute node UUID)"},{"line_number":175,"context_line":"* Generator wrappers populate HostState objects with allocation candidates"},{"line_number":176,"context_line":"  and provider summaries before filters and weighers execute"}],"source_content_type":"text/x-rst","patch_set":6,"id":"5fb84884_5e4576de","line":173,"in_reply_to":"4084deae_34988c56","updated":"2025-11-18 16:28:57.000000000","message":"correct this is a note on the current state not a chagne i guess this coudl be removed but all of the keep points are just note on how it works/will work.","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"58981a7eb086167d3f35acd38ceea102d3116f2b","unresolved":true,"context_lines":[{"line_number":231,"context_line":"                \u0027root_provider_uuid\u0027: \u0027compute-uuid-1\u0027"},{"line_number":232,"context_line":"            },"},{"line_number":233,"context_line":"            \u0027compute-uuid-1-address\u0027: {"},{"line_number":234,"context_line":"                \u0027resources\u0027: {\u0027CUSTOM_PCI_\u003cvendor_id\u003e_\u003cproduct_id\u003e\u0027: (32, 5)},"},{"line_number":235,"context_line":"                \u0027traits\u0027: [\u0027COMPUTE_MANAGED_PCI_DEVICE\u0027],"},{"line_number":236,"context_line":"                \u0027parent_provider_uuid\u0027: \u0027compute-uuid-1\u0027,"},{"line_number":237,"context_line":"                \u0027root_provider_uuid\u0027: \u0027compute-uuid-1\u0027"}],"source_content_type":"text/x-rst","patch_set":6,"id":"3690e058_d522a855","line":234,"range":{"start_line":234,"start_character":69,"end_line":234,"end_character":76},"updated":"2025-11-18 16:00:07.000000000","message":"nit: you changed this from tuple to dict in the type def above","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b56dd74ea39daadd76d5423f803908110085c8e2","unresolved":true,"context_lines":[{"line_number":231,"context_line":"                \u0027root_provider_uuid\u0027: \u0027compute-uuid-1\u0027"},{"line_number":232,"context_line":"            },"},{"line_number":233,"context_line":"            \u0027compute-uuid-1-address\u0027: {"},{"line_number":234,"context_line":"                \u0027resources\u0027: {\u0027CUSTOM_PCI_\u003cvendor_id\u003e_\u003cproduct_id\u003e\u0027: (32, 5)},"},{"line_number":235,"context_line":"                \u0027traits\u0027: [\u0027COMPUTE_MANAGED_PCI_DEVICE\u0027],"},{"line_number":236,"context_line":"                \u0027parent_provider_uuid\u0027: \u0027compute-uuid-1\u0027,"},{"line_number":237,"context_line":"                \u0027root_provider_uuid\u0027: \u0027compute-uuid-1\u0027"}],"source_content_type":"text/x-rst","patch_set":6,"id":"2d808a79_15ab96fb","line":234,"range":{"start_line":234,"start_character":69,"end_line":234,"end_character":76},"in_reply_to":"3690e058_d522a855","updated":"2025-11-18 16:28:57.000000000","message":"oh your correct i forgot to update this. it s a dict in reality.","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"58981a7eb086167d3f35acd38ceea102d3116f2b","unresolved":true,"context_lines":[{"line_number":246,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"1. **Tree Flattening**: Aggregate resource capacities and traits across each"},{"line_number":249,"context_line":"   provider in the provider tree for the current host."},{"line_number":250,"context_line":""},{"line_number":251,"context_line":"2. **Resource Calculation**: For each resource class, calculate the resource"},{"line_number":252,"context_line":"   score as ``1 - (requested / free_capacity)``, then take arithmetic mean"}],"source_content_type":"text/x-rst","patch_set":6,"id":"de25d884_a9ed9cbd","line":249,"updated":"2025-11-18 16:00:07.000000000","message":"Trait aggregation means that if we have preferred traits implemented with the weigher it will always mean \"prefer this host if any of the RPs have the preferred trait\". Obviously it is OK for a flat tree with a single compute RP, but with diverse children RPs it might create surprises:\n*  we prefer to get a child resource with a specific trait\n* the weigher prefers the host because it has a child RP with that trait\n* but we eventually allocate from another child RP of the host that does not hav the trait present even if both the preferred and non preferred children had free resources to take.\n\nThis controversy hints towards the fact that for a single host we can have numerous allocation candidates even after the filters are removed some. Then selecting between those allocation candidates within the same host is not governed by any higher level logic. The current code takes the first[1]. With the preferred trait use case we might want to change the \"take-the-first-ac\" logic to be weigh the those candidates and and select the most preferred one.\n\nI\u0027m not saying we need to do it now. I\u0027m fine saying that preferred /avoided trait in the first iteration only supposed to work properly if you don\u0027t have divers children RPs in your trees. But at least we should document that limitation with a hint about the future how to extend the design with weighing allocation candidates within a HostState as well. \nOr I\u0027m fine removing the preferred / avoided traits from the today scope all together.\n\n[1] https://github.com/openstack/nova/blob/cf930034f2fe68691ebfd4e73bdc8008bffb5882/nova/scheduler/manager.py#L455-L460","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"58981a7eb086167d3f35acd38ceea102d3116f2b","unresolved":true,"context_lines":[{"line_number":259,"context_line":"   the weigher penalizes placements that consume a large fraction of what\u0027s"},{"line_number":260,"context_line":"   currently available, even if the absolute utilization remains reasonable."},{"line_number":261,"context_line":"   This helps preserve capacity on hosts with more available resources,"},{"line_number":262,"context_line":"   supporting the \"most boring host\" strategy"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"3. **Trait Calculation**: Calculate ratio ``(requested_traits_present /"},{"line_number":265,"context_line":"   total_traits_on_provider)``"}],"source_content_type":"text/x-rst","patch_set":6,"id":"982ee5f6_3e8c025a","line":262,"updated":"2025-11-18 16:00:07.000000000","message":"RC total/used\n* C1  expensive\n  * CPU 4/2 \n  * GPU 4/2\n* C2 cheap\n  * CPU 4/2\n* C3 expensive but already consumed all expensive resouces\n  * CPU 4/2\n  * GPU 4/4\n* C4 expensive \n  * CPU 4/2\n  * GPU 4/0\n\navg(for each RC: 1-(req/free))\n\n* R1(expensive): CPU 2, GPU 1\n  * C1: 1/4 \u003d ((1 - (2/2)) + (1 - (1 / 2))) / 2\n  * C2: N/A filter removed the host no GPU inventory\n  * C3: N/A filter removed the host no free GPU inventory\n  * C4:  3/8 \u003d ((1 - (2/2)) + (1 - (1/4))) / 2\n\n\u003d\u003e C4 is selected\nBoth C1 an C4 is equally good for the expensive request but the weigher prefers the less loaded host so it spreading load. \n\nIs there a way to switch between packing and spreading for expensive requests without breaking the behavior for the boring VMs?\n\n* R2(boring): CPU 1\n  * C1: 3/4 \u003d ((1 - (1/2)) + (1 - (0/2))) / 2 \n  * C2: 1/4 \u003d ((1 - (1/2))) / 1 \n  * C3: \u003d ((1 - (1/2)) + (1 - (0/0))) / 2  \u003d\u003e division by zero \n    * a) ignore the RC with no inventory  C3 \u003d C2 \u003d 1/4\n    * b) ...\n  * C4: 3/4 \u003d ((1 - (1/2)) + (1 - (0/4))) / 2\n\n\u003d\u003e C1 and C4 is preferred which is wrong as those are the expensive hosts.\n\nDid I miss something?","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7f53137defe5924266990f6caec3166f4ead4800","unresolved":true,"context_lines":[{"line_number":259,"context_line":"   the weigher penalizes placements that consume a large fraction of what\u0027s"},{"line_number":260,"context_line":"   currently available, even if the absolute utilization remains reasonable."},{"line_number":261,"context_line":"   This helps preserve capacity on hosts with more available resources,"},{"line_number":262,"context_line":"   supporting the \"most boring host\" strategy"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"3. **Trait Calculation**: Calculate ratio ``(requested_traits_present /"},{"line_number":265,"context_line":"   total_traits_on_provider)``"}],"source_content_type":"text/x-rst","patch_set":6,"id":"802a8a3a_6a079e7b","line":262,"in_reply_to":"20bd61bb_4bb5898e","updated":"2025-11-19 11:32:24.000000000","message":"\u003e we wont have devision by 0 as placement has already confirm that there are resouce and the once we have requested can fit.\n\u003e \n\nThe R2 only requests CPU but not GPU. So placement wont filter out C3 where there is fully allocated GPU inventory. On that host R2 requests 0 GPUs and the host has 0 GPUs available that is 0/0. \n\nOr do you suggest that only the RCs that the request contains are considered in the algo? But if so then I don\u0027t see how such algo can downprioritize requests against hosts that has expensive resources the request does not contain.\n\n\u003e if we want packing vs spreading to be cleanly selectable woe may need to factor out the sign of the multiple or have a dedicated config flag.\n\u003e \n\nMy point here that if the weigher has a bias to packing or spreading across preferred hosts (while downprio non preferred ones) then at least we need to document such bias, but also we might need to consider that such bias will not bee good for the user.\n\nAlso it seems you missed my point about R2 that the weigher wrongly prefers expensive hosts for it even though R2 is cheap request. What did I miss in that example? or is it a bug?","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1d8808e897786c244f1c7577d292f87cc8fc1d33","unresolved":true,"context_lines":[{"line_number":259,"context_line":"   the weigher penalizes placements that consume a large fraction of what\u0027s"},{"line_number":260,"context_line":"   currently available, even if the absolute utilization remains reasonable."},{"line_number":261,"context_line":"   This helps preserve capacity on hosts with more available resources,"},{"line_number":262,"context_line":"   supporting the \"most boring host\" strategy"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"3. **Trait Calculation**: Calculate ratio ``(requested_traits_present /"},{"line_number":265,"context_line":"   total_traits_on_provider)``"}],"source_content_type":"text/x-rst","patch_set":6,"id":"0ee4f698_9fd06dd0","line":262,"in_reply_to":"802a8a3a_6a079e7b","updated":"2025-11-19 12:24:33.000000000","message":"```The R2 only requests CPU but not GPU. So placement wont filter out C3 where there is fully allocated GPU inventory. On that host R2 requests 0 GPUs and the host has 0 GPUs available that is 0/0.\n``` \n\nah yes your correct we either need to handel teh case where there are no free resource for resouce classes we didnt request to avoid the devid by 0\nor we need to change the alghortim to your definitoin of utilisation which is\n\nrequested/total rhater then requested/free \n\nin both cases the compoente of the calluation woudl be 1-0 or just 1 for that resouce class.\n\nalthough im am tempted to say the correct behvior in this case is if you didn not request X and all X inventy is already consumed then you shoudl not consider X to make it expensive.  so in that case wehn there is 0 free capastiy we would jsut ignore that resouce class entirly. that effectivly woudl make the contibution to the cost 0 instead of 1 for that resouce class.\n\ni do not have a stong prefence either way.\n\nyou can either argure that  the host is still expensive becuase if the other workload is remove you want to make sure there is enough cpu/ram aviable to create a new worklaod that uses the gpu\n\nor you can argue that if there are no expensive resouce free on the host its not an expensive host anymore.\n\nboth are reasonable we just need to chose oen and docuement it.\nany prefernce on how to adress that.?\n\n\non the second point it on packign vs spreading its a bug that a negative multipleply is not packing. my orginal intent was for the weigher to spread by default like the ram/cpu/disk weighers do and to pack if the multipler is negitvie\n\nthe sign of the multipleer shoudl only affect the contibution form the resouce calss and not the traits where the magniture shoudl just be used.\n\ni think we can fix this bug by  makign the resource cost \n`cost \u003d 1 - (requested / free_capacity) if multipler \u003e\u003d 0 else  (requested / free_capacity)`\n\nthat should create the packign/spreading behavior i orginally inteneded.\n\nso this i just a minor bug and we shoudl update the spec and code to reflect that.","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b56dd74ea39daadd76d5423f803908110085c8e2","unresolved":true,"context_lines":[{"line_number":259,"context_line":"   the weigher penalizes placements that consume a large fraction of what\u0027s"},{"line_number":260,"context_line":"   currently available, even if the absolute utilization remains reasonable."},{"line_number":261,"context_line":"   This helps preserve capacity on hosts with more available resources,"},{"line_number":262,"context_line":"   supporting the \"most boring host\" strategy"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"3. **Trait Calculation**: Calculate ratio ``(requested_traits_present /"},{"line_number":265,"context_line":"   total_traits_on_provider)``"}],"source_content_type":"text/x-rst","patch_set":6,"id":"20bd61bb_4bb5898e","line":262,"in_reply_to":"982ee5f6_3e8c025a","updated":"2025-11-18 16:28:57.000000000","message":"we wont have devision by 0 as placement has already confirm that there are resouce and the once we have requested can fit.\n\nif we want packing vs spreading to be cleanly selectable woe may need to factor out the sign of the multiple or have a dedicated config flag.\n\ni also think that we only need to apply this to the recouses class part.\n\nthe traits can use the multiple absolute value.\ni think we can make this work cleanly but the current poc may not handle this properly.","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7f53137defe5924266990f6caec3166f4ead4800","unresolved":true,"context_lines":[{"line_number":261,"context_line":"   This helps preserve capacity on hosts with more available resources,"},{"line_number":262,"context_line":"   supporting the \"most boring host\" strategy"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"3. **Trait Calculation**: Calculate ratio ``(requested_traits_present /"},{"line_number":265,"context_line":"   total_traits_on_provider)``"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"4. **Weight Composition**: Combine scores"},{"line_number":268,"context_line":"   ``(resource_score + trait_score) / 2`` and apply configured multiplier"}],"source_content_type":"text/x-rst","patch_set":6,"id":"8280082c_fca4198d","line":265,"range":{"start_line":264,"start_character":0,"end_line":265,"end_character":30},"updated":"2025-11-19 11:32:24.000000000","message":"* Does requested_traits_present means traits that are requested for the instance and provided by the host? If so then requested_traits_present is equal to requested_traits during weighing as if there were a requested trait that is not present on the host placement would filter out the host already. So we can simplify here and say len(requested_traits) / len(all_traits_on_host).\n\n* total_traits_on_provider should be total_traits_on_host as above you described that traits are collected from all providers in the host\u0027s provider tree.\n\n* What about traits that are requested not to be present? E.g. via flavor extra_spec trait:HW_CPU_X86_AVX2\u003dforbidden\n\n* Does requested_traits includes all automatically generated traits by nova\u0027s placement pre-filter? e.g. root_required\u003d!COMPUTE_STATUS_DISABLED Or just the ones explicitly requested via flavor extra_spec or image property?\n\n\nHow does this formula assigns a smaller weight to a host that has special traits when the request does not asks for such trait or no traits at all?\n\nC1: provides AVX2, SSE\n\nC2: provides SSE\n\nR1: no trait requested\n* C1: 0 / 2 \u003d 0\n* C2: 0 / 1 \u003d 0 \n\u003d\u003e so the weigher does not down prioritize the C1 host but C1 host is more expensive than C2 and the request does not need AVX2 so it could go to the cheaper C2 host.\n\nR2: SEE requested\n* C1: 1/ 2 \u003d 1/2\n* C2: 1/ 1 \u003d 1 \n\u003d\u003e This is good C2 is prioritized","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"3c3ba1eab9e896a3b6ed4f581465056f31f5a1aa","unresolved":true,"context_lines":[{"line_number":261,"context_line":"   This helps preserve capacity on hosts with more available resources,"},{"line_number":262,"context_line":"   supporting the \"most boring host\" strategy"},{"line_number":263,"context_line":""},{"line_number":264,"context_line":"3. **Trait Calculation**: Calculate ratio ``(requested_traits_present /"},{"line_number":265,"context_line":"   total_traits_on_provider)``"},{"line_number":266,"context_line":""},{"line_number":267,"context_line":"4. **Weight Composition**: Combine scores"},{"line_number":268,"context_line":"   ``(resource_score + trait_score) / 2`` and apply configured multiplier"}],"source_content_type":"text/x-rst","patch_set":6,"id":"ba068aaa_6de853d6","line":265,"range":{"start_line":264,"start_character":0,"end_line":265,"end_character":30},"in_reply_to":"8280082c_fca4198d","updated":"2025-11-19 12:38:19.000000000","message":"yes `len(requested_traits) / len(all_traits_on_host)`\nis what i ment  in other words its just the count \nthe word present is misleading and confusing.\n\n\n```\nWhat about traits that are requested not to be present? E.g. via flavor extra_spec trait:HW_CPU_X86_AVX2\u003dforbidden\n```\nin my poc im doing\n\n```\n        # and traits from the request spec, including flavor-based resources\n        resource_request \u003d utils.ResourceRequest.from_request_spec(\n            request_spec)\n        # Extract requested resources and traits from the resource request\n        requested_resources \u003d resource_request.merged_resources()\n        requested_traits \u003d resource_request.all_required_traits\n```\n\n\nso i am only considering required traits to be requested traits in this propsal.\n\nthis shodul be the union of the required traits form teh flavor and image.\n\nhttps://review.opendev.org/c/openstack/nova/+/953131/5/nova/scheduler/weights/resource_provider.py#100\n\ni do not consider forbiden trait to be requessted because we shoudl not get any host with those trait becasue of placement.\n\nif we extned this to perfered and avoided trait i woudl also include those as described in the spec.\n\n\n```\nDoes requested_traits includes all automatically generated traits by nova\u0027s placement pre-filter? e.g. root_required\u003d!COMPUTE_STATUS_DISABLED Or just the ones explicitly requested via flavor extra_spec or image property?\n```\n\nif traits requests are added by the pre-filters then i guess those are not considered today in my poc\n\ni dont thinkw we have a clean way to generate those today but they could eb added.\n\nanything that is generated form the request spec however which is all the one for sev ectra are included.","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7f53137defe5924266990f6caec3166f4ead4800","unresolved":true,"context_lines":[{"line_number":286,"context_line":"    resource_provider_resources \u003d VCPU,MEMORY_MB,DISK_GB"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    # Traits to consider (default: all)"},{"line_number":289,"context_line":"    resource_provider_traits \u003d HW_CPU_X86_AVX2,HW_CPU_X86_SSE"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"Example Weighting Calculation"},{"line_number":292,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":6,"id":"8012e5ac_e3ff8d79","line":289,"updated":"2025-11-19 11:32:24.000000000","message":"As more and more I playing with this idea I more and more feel that adding all traits to the scope by default is not a good default. \n\nHow do we balance / normalize the individual weight components due to the number of traits and the number of RCs and the size of their inventories through the formula?\n\nIn my default devstack I have 63 traits and 3 RCs are reported on the compute RP. If all traits are enabled then requesting an expensive trait has an equal contribution to the total weight that requesting a cheap one. And we have a lot of cheap ones on the compute by default.","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1d8808e897786c244f1c7577d292f87cc8fc1d33","unresolved":true,"context_lines":[{"line_number":286,"context_line":"    resource_provider_resources \u003d VCPU,MEMORY_MB,DISK_GB"},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"    # Traits to consider (default: all)"},{"line_number":289,"context_line":"    resource_provider_traits \u003d HW_CPU_X86_AVX2,HW_CPU_X86_SSE"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"Example Weighting Calculation"},{"line_number":292,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":6,"id":"14216f5a_543990d8","line":289,"in_reply_to":"8012e5ac_e3ff8d79","updated":"2025-11-19 12:24:33.000000000","message":"i disagree on the all traits being the incorect default.\n\ni really think that is the correct one but i acknowledge your point on the \n\n\ni sated somewhere that the only logical seam i saw in this weihter was to split resouce weighing and trait weighing into seperate weigher\n\nif we make that change you can then just use the weigher mutlipeler to do this\nalthernitively we can have a seperat config option to adjust the relitive contibution form the resouce classes adn traits and keep it in a signle weigher\n\ndo you have a prefernce?","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7f53137defe5924266990f6caec3166f4ead4800","unresolved":true,"context_lines":[{"line_number":561,"context_line":"resource classes and the capacity, availability and allocation of the"},{"line_number":562,"context_line":"custom resource classes are enforced by the placement service."},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"The ability to prioritize host selection is addressed by the"},{"line_number":565,"context_line":"ResourceProviderWeigher which will allow weighing of host based on"},{"line_number":566,"context_line":"these custom resource classes."},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"The downside of this approach is that it requires a new custom resource"},{"line_number":569,"context_line":"class for each cpu performance tier level and the ability to express"}],"source_content_type":"text/x-rst","patch_set":6,"id":"982840b6_08c27ae7","line":566,"range":{"start_line":564,"start_character":0,"end_line":566,"end_character":30},"updated":"2025-11-19 11:32:24.000000000","message":"This is the interesting part to me. \n\nIf we have single CUSTOM_CPU_PERFORMANCE_TIERx RC per compute as this example suggests then there is no need to weigh hosts with the RP weigher as each flavor needs an explicit tier RC requested. And therefore VMs with different tier requests will land on different hosts due to the explicit RC request.\n\nOr does this example suggest that the host still has VCPU resources consumed by non tiered flavors? And want to prefer non tiered hosts for non tiered VMs but don\u0027t want to forbid non tiered flavors on tiered hosts if non tiered hosts are full?","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1d8808e897786c244f1c7577d292f87cc8fc1d33","unresolved":true,"context_lines":[{"line_number":561,"context_line":"resource classes and the capacity, availability and allocation of the"},{"line_number":562,"context_line":"custom resource classes are enforced by the placement service."},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"The ability to prioritize host selection is addressed by the"},{"line_number":565,"context_line":"ResourceProviderWeigher which will allow weighing of host based on"},{"line_number":566,"context_line":"these custom resource classes."},{"line_number":567,"context_line":""},{"line_number":568,"context_line":"The downside of this approach is that it requires a new custom resource"},{"line_number":569,"context_line":"class for each cpu performance tier level and the ability to express"}],"source_content_type":"text/x-rst","patch_set":6,"id":"23246cab_15ab17df","line":566,"range":{"start_line":564,"start_character":0,"end_line":566,"end_character":30},"in_reply_to":"982840b6_08c27ae7","updated":"2025-11-19 12:24:33.000000000","message":"if that was true then we woudl not need to have cpu ram or disk weihter todya as all host provide those.\n\ni didn\u0027t actually put this in the example but in my head i was assuming \nreserved_host_cpus woudl be set equal to the number of cores in the cpu_shared_set and cpu_allocation_ratio woudl be set to 1.0\n\ni.e. all VCPU inventory woudlbe reserved.\n\norignally i was planning to use provider.yaml to set the vcpu invetion to 0 or remove it but when i read \nhttps://specs.openstack.org/openstack/nova-specs/specs/ussuri/approved/provider-config-file.html\n\ni realsied that is not possibel today and i forget to update the example to show this.\n\nthat also why i said \n```\nWhen using custom resource classes for CPU performance tiers in\nflavors, you must explicitly set ``resources:VCPU\u003d0`` in the flavor\nextra specs to disable the standard VCPU resource class.\n```\n\nbecause i was not expecting there to be any VCPU ivnentory aviable on the host because it woudl all be reserved.","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7f53137defe5924266990f6caec3166f4ead4800","unresolved":true,"context_lines":[{"line_number":591,"context_line":""},{"line_number":592,"context_line":"This is a simple approach that does not require the use of custom"},{"line_number":593,"context_line":"resource classes but can use required or preferred traits to express"},{"line_number":594,"context_line":"cpu performance tier levels provided you only want to support one tier"},{"line_number":595,"context_line":"of performance per host."},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"Unlike the first approach this does not require configuring custom"},{"line_number":598,"context_line":"quotas using unified limits."},{"line_number":599,"context_line":"But it does require partitioning the cloud based on cpu tier levels."}],"source_content_type":"text/x-rst","patch_set":6,"id":"753b59af_24f0f86c","line":596,"range":{"start_line":594,"start_character":41,"end_line":596,"end_character":0},"updated":"2025-11-19 11:32:24.000000000","message":"again if we have one tier per host then what we are using the RP weigher for? Is there flavors with no tier requests and we want to avoid tiered hosts?","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1d8808e897786c244f1c7577d292f87cc8fc1d33","unresolved":true,"context_lines":[{"line_number":591,"context_line":""},{"line_number":592,"context_line":"This is a simple approach that does not require the use of custom"},{"line_number":593,"context_line":"resource classes but can use required or preferred traits to express"},{"line_number":594,"context_line":"cpu performance tier levels provided you only want to support one tier"},{"line_number":595,"context_line":"of performance per host."},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"Unlike the first approach this does not require configuring custom"},{"line_number":598,"context_line":"quotas using unified limits."},{"line_number":599,"context_line":"But it does require partitioning the cloud based on cpu tier levels."}],"source_content_type":"text/x-rst","patch_set":6,"id":"9570b1cc_7aba30a5","line":596,"range":{"start_line":594,"start_character":41,"end_line":596,"end_character":0},"in_reply_to":"753b59af_24f0f86c","updated":"2025-11-19 12:24:33.000000000","message":"in this case its to provide soft anti affinity for flavor that dont request the trati explcity form a hsot that is designated for a given perfrmance teir\n\nso im assuming you woudl have some hsot without any teeir here and other with them.\n\notherwise your correct to asume the normal cpu weigher woudl be enough in this case","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7f53137defe5924266990f6caec3166f4ead4800","unresolved":true,"context_lines":[{"line_number":657,"context_line":"    openstack flavor set \u003cflavor-name\u003e --vcpus 10 \\"},{"line_number":658,"context_line":"        --property quota:cpu_period\u003d500000"},{"line_number":659,"context_line":"        --property resources:CUSTOM_CPU_TIME_MICROSECONDS\u003d5000000"},{"line_number":660,"context_line":""},{"line_number":661,"context_line":".. note ::"},{"line_number":662,"context_line":""},{"line_number":663,"context_line":"  As the period is specified per VCPU we do not need to multiply the"}],"source_content_type":"text/x-rst","patch_set":6,"id":"b9be167b_899bce50","line":660,"updated":"2025-11-19 11:32:24.000000000","message":"So how does the weigher help here?\n\nI assume we have the VCPU and the CUSTOM_CPU_TIME_MICROSECONDS RC configured for the weigher to consider.\n\n(assuming no allocation yet on any hosts)\n\nC1: small silver\nVCPU\u003d10\nCUSTOM_CPU_TIME_MICROSECONDS\u003d10M\n\nC2: large silver\nVCPU\u003d100\nCUSTOM_CPU_TIME_MICROSECONDS\u003d100M\n\nC3: small gold\nVCPU\u003d10\nCUSTOM_CPU_TIME_MICROSECONDS\u003d20M\n\nC3: large gold\nVCPU\u003d100\nCUSTOM_CPU_TIME_MICROSECONDS\u003d200M\n\n\nR1 (silver) CUSTOM_CPU_TIME_MICROSECONDS\u003d1M, VCPU\u003d1\n* C1: (1-1/10 + 1-1/10) / 2 \u003d 0.9\n* C2: (1-1/100 + 1-1/100) / 2 \u003d 0.99\n* C3: (1-1/10 + 1-1/20) / 2 \u003d 0.925\n* C4: (1-1/100 + 1-1/200) / 2 \u003d 0.9925\n\u003d\u003e So the order of hosts for a silver flavor is: C4(gold), C2(silver), C3(gold) C1(silver) This does not sound good to me. What did I miss? \n\n-- later -- \nWhat if you meant that only the CUSTOM_CPU_TIME_MICROSECONDS is configured for the weigher to consider\n\nR1 (silver) CUSTOM_CPU_TIME_MICROSECONDS\u003d1M\n* C1: 1-1/10 \u003d 0.9\n* C2: 1-1/100 \u003d 0.99\n* C3: 1-1/20 \u003d 0.95\n* C4: 1-1/200 \u003d 0.995\n\u003d\u003e So order of the hosts for a silver flavor is: C4(gold), C2(silver), C3(gold), C1(silver) so still not good","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1d8808e897786c244f1c7577d292f87cc8fc1d33","unresolved":true,"context_lines":[{"line_number":657,"context_line":"    openstack flavor set \u003cflavor-name\u003e --vcpus 10 \\"},{"line_number":658,"context_line":"        --property quota:cpu_period\u003d500000"},{"line_number":659,"context_line":"        --property resources:CUSTOM_CPU_TIME_MICROSECONDS\u003d5000000"},{"line_number":660,"context_line":""},{"line_number":661,"context_line":".. note ::"},{"line_number":662,"context_line":""},{"line_number":663,"context_line":"  As the period is specified per VCPU we do not need to multiply the"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7867e436_6e698029","line":660,"in_reply_to":"b9be167b_899bce50","updated":"2025-11-19 12:24:33.000000000","message":"there is no such thing as silve or gold host in this approach\n\nonly silver and goal worklaods which in this case id defiend by how much of a core it allcoated via quota:cpu_period and the accounting for that by resources:CUSTOM_CPU_TIME_MICROSECONDS\n\nyou also missing my note below about setting resouces:VCPU\u003d0 so that cpu assignment woudl only be done by the CUSTOM_CPU_TIME_MICROSECONDS\n\n\none of the goal of the cpu teirign usecase is to allwo a single host to have workload iwth diffent cpu perfromace teirs which is why \napproch 1 and 3 are explcity not desginating host by performace teir since that fails to meet that obejctive\n\napproch 2 does not consder that to be a requiremetn and just shows how you can acive teirhgin in a simply way when that is not required.\n\nso ya to do the math on this you need to have silver and goal flavor not hosts.","commit_id":"10487db642cf5580d20016dde25ab1423b0c1ad7"}]}
