)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"be801bbc9e02a0ccb94e8e3075ea50bc738aa220","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     René Ribaud \u003crribaud@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-03-04 15:51:15 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Reproduce OSPRH-25388: NUMA cell sorting bug for non-PCI VMs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Show that when using the \u0027pack\u0027 NUMA cell allocation strategy, a VM"},{"line_number":10,"context_line":"that does not request PCI devices is placed on the NUMA node holding"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"689c72d0_f4d245fb","line":7,"range":{"start_line":7,"start_character":10,"end_line":7,"end_character":21},"updated":"2026-03-04 17:25:52.000000000","message":"Although this is a public bug. Please tell me if you prefer a corresponding upstream bug.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9694bf72c7de08b01d64c4024dc5d47ab29c5962","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     René Ribaud \u003crribaud@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-03-04 15:51:15 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Reproduce OSPRH-25388: NUMA cell sorting bug for non-PCI VMs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Show that when using the \u0027pack\u0027 NUMA cell allocation strategy, a VM"},{"line_number":10,"context_line":"that does not request PCI devices is placed on the NUMA node holding"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"d6fd728a_59ba0637","line":7,"range":{"start_line":7,"start_character":10,"end_line":7,"end_character":21},"in_reply_to":"689c72d0_f4d245fb","updated":"2026-03-19 16:43:06.000000000","message":"-1 until this is removed we do not allow refence ot our downstream tracker in commit\n\nthe can be in the upstream bug but this should be remvoed as a blocker in my opion before proceeding with this.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"06c6838664f98bd7dcccb12ca3762d148935550f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     René Ribaud \u003crribaud@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-03-04 15:51:15 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Reproduce OSPRH-25388: NUMA cell sorting bug for non-PCI VMs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Show that when using the \u0027pack\u0027 NUMA cell allocation strategy, a VM"},{"line_number":10,"context_line":"that does not request PCI devices is placed on the NUMA node holding"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"8b810fe0_d07d73e4","line":7,"range":{"start_line":7,"start_character":10,"end_line":7,"end_character":21},"in_reply_to":"689c72d0_f4d245fb","updated":"2026-03-17 17:27:38.000000000","message":"Done","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"8cf4b94cec8ed4d7c55a264a1fd27a7d8b12688a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     René Ribaud \u003crribaud@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-03-04 15:51:15 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Reproduce OSPRH-25388: NUMA cell sorting bug for non-PCI VMs"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Show that when using the \u0027pack\u0027 NUMA cell allocation strategy, a VM"},{"line_number":10,"context_line":"that does not request PCI devices is placed on the NUMA node holding"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"19f041e3_65d0b575","line":7,"range":{"start_line":7,"start_character":10,"end_line":7,"end_character":21},"in_reply_to":"d6fd728a_59ba0637","updated":"2026-03-20 10:25:53.000000000","message":"Done","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"898c9fc8fe60532b8150db455e25648daf2958d5","unresolved":true,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Related-Bug: #2144660"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Co-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"},{"line_number":27,"context_line":"Change-Id: I45ec7017d5d54a1a101ed32f4b5f47a7f4caf735"},{"line_number":28,"context_line":"Signed-off-by: René Ribaud \u003crene.ribaud@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9bf8ea48_c8dd9423","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":14},"updated":"2026-03-19 17:11:13.000000000","message":"this should be \n\n`Assisted-By: \u003ctool\u003e [model]` \nor\n`Generated-By: \u003ctool\u003e [model]` \n\nthe model is optional but prefered if you know it\n\ni.e.\n`Generated-By: claud-code opus 4.6`\nor\n`Assisted-By: cursor auto`\n\nsee the `Contributor Checklist` section of https://openinfra.org/legal/ai-policy\n\nwe also use generated-by for the bot or standard tool generated patches too now.\n\nwhen using claude code or cursor use Assisted-By if you layed out the framework and had the tool fill in the missing pices i.e. you had it update the tests or spell check a doc your wrote\n\nuse generated by if teh tooel generated the majority of the content in the patch based on your guidance.","commit_id":"ed58a08ffa60c3b9dbb3ca14a89c95f6b6f35ac6"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"8cf4b94cec8ed4d7c55a264a1fd27a7d8b12688a","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Related-Bug: #2144660"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Co-Authored-By: Claude Opus 4.6 \u003cnoreply@anthropic.com\u003e"},{"line_number":27,"context_line":"Change-Id: I45ec7017d5d54a1a101ed32f4b5f47a7f4caf735"},{"line_number":28,"context_line":"Signed-off-by: René Ribaud \u003crene.ribaud@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"4a8870d2_7df3e49b","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":14},"in_reply_to":"9bf8ea48_c8dd9423","updated":"2026-03-20 10:25:53.000000000","message":"Done","commit_id":"ed58a08ffa60c3b9dbb3ca14a89c95f6b6f35ac6"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e04cbee7062f4d10c4ad99250ddc6383a21b172c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"30cf107d_1b497da5","updated":"2026-03-10 15:27:11.000000000","message":"I have a bunch of requests inline but I think the reproducer itself is valid. This is a bug in the compute claim.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"54534037acee72694536c8d5ef8e63ed559f8dd9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9aedeab3_ceb5ec45","updated":"2026-03-18 19:15:16.000000000","message":"No real complaints, but a suggestion for what gibi was asking about. Otherwise this seems well-documented and easy to follow.","commit_id":"80da89f9c4cd07a2c9bb91694ca90c526a8cc204"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"724585914e1b99bd93e6236704a19fe867a6b1bf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"e109a16c_2d69bd3b","updated":"2026-03-19 15:14:25.000000000","message":"Looks good to me, thanks.","commit_id":"ed58a08ffa60c3b9dbb3ca14a89c95f6b6f35ac6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"898c9fc8fe60532b8150db455e25648daf2958d5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":4,"id":"4b58a971_f320aef0","updated":"2026-03-19 17:11:13.000000000","message":"it woudl be nice ot fix the commit message but the repoducer logic looks correct to me","commit_id":"ed58a08ffa60c3b9dbb3ca14a89c95f6b6f35ac6"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"8cf4b94cec8ed4d7c55a264a1fd27a7d8b12688a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"f63e0d66_a2833fe6","in_reply_to":"4b58a971_f320aef0","updated":"2026-03-20 10:25:53.000000000","message":"Done","commit_id":"ed58a08ffa60c3b9dbb3ca14a89c95f6b6f35ac6"}],"nova/tests/functional/libvirt/test_pci_sriov_servers.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e04cbee7062f4d10c4ad99250ddc6383a21b172c","unresolved":true,"context_lines":[{"line_number":6870,"context_line":""},{"line_number":6871,"context_line":""},{"line_number":6872,"context_line":"class TestPackNUMACellsWithPCIDevices(_PCIServersTestBase):"},{"line_number":6873,"context_line":"    \"\"\"Regression test for OSPRH-25388."},{"line_number":6874,"context_line":""},{"line_number":6875,"context_line":"    When using the \u0027pack\u0027 NUMA cell allocation strategy, a VM that does NOT"},{"line_number":6876,"context_line":"    request any PCI device should be placed on a NUMA node that does NOT"}],"source_content_type":"text/x-python","patch_set":1,"id":"e6908834_4eeaff09","line":6873,"updated":"2026-03-10 15:27:11.000000000","message":"I would not refer to RH\u0027s downstream bug tracker. Do we have a launchpad bug?","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"8cf4b94cec8ed4d7c55a264a1fd27a7d8b12688a","unresolved":false,"context_lines":[{"line_number":6870,"context_line":""},{"line_number":6871,"context_line":""},{"line_number":6872,"context_line":"class TestPackNUMACellsWithPCIDevices(_PCIServersTestBase):"},{"line_number":6873,"context_line":"    \"\"\"Regression test for OSPRH-25388."},{"line_number":6874,"context_line":""},{"line_number":6875,"context_line":"    When using the \u0027pack\u0027 NUMA cell allocation strategy, a VM that does NOT"},{"line_number":6876,"context_line":"    request any PCI device should be placed on a NUMA node that does NOT"}],"source_content_type":"text/x-python","patch_set":1,"id":"3c3fe733_ff714f57","line":6873,"in_reply_to":"9d6bb95f_e46f2b16","updated":"2026-03-20 10:25:53.000000000","message":"Acknowledged","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6fe97ba4df3a145b71d525d1a07dfb52f020d0db","unresolved":false,"context_lines":[{"line_number":6870,"context_line":""},{"line_number":6871,"context_line":""},{"line_number":6872,"context_line":"class TestPackNUMACellsWithPCIDevices(_PCIServersTestBase):"},{"line_number":6873,"context_line":"    \"\"\"Regression test for OSPRH-25388."},{"line_number":6874,"context_line":""},{"line_number":6875,"context_line":"    When using the \u0027pack\u0027 NUMA cell allocation strategy, a VM that does NOT"},{"line_number":6876,"context_line":"    request any PCI device should be placed on a NUMA node that does NOT"}],"source_content_type":"text/x-python","patch_set":1,"id":"24205839_3eadb700","line":6873,"in_reply_to":"9d6bb95f_e46f2b16","updated":"2026-03-19 19:11:31.000000000","message":"Done","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9694bf72c7de08b01d64c4024dc5d47ab29c5962","unresolved":true,"context_lines":[{"line_number":6870,"context_line":""},{"line_number":6871,"context_line":""},{"line_number":6872,"context_line":"class TestPackNUMACellsWithPCIDevices(_PCIServersTestBase):"},{"line_number":6873,"context_line":"    \"\"\"Regression test for OSPRH-25388."},{"line_number":6874,"context_line":""},{"line_number":6875,"context_line":"    When using the \u0027pack\u0027 NUMA cell allocation strategy, a VM that does NOT"},{"line_number":6876,"context_line":"    request any PCI device should be placed on a NUMA node that does NOT"}],"source_content_type":"text/x-python","patch_set":1,"id":"9d6bb95f_e46f2b16","line":6873,"in_reply_to":"e6908834_4eeaff09","updated":"2026-03-19 16:43:06.000000000","message":"+1","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"06c6838664f98bd7dcccb12ca3762d148935550f","unresolved":false,"context_lines":[{"line_number":6870,"context_line":""},{"line_number":6871,"context_line":""},{"line_number":6872,"context_line":"class TestPackNUMACellsWithPCIDevices(_PCIServersTestBase):"},{"line_number":6873,"context_line":"    \"\"\"Regression test for OSPRH-25388."},{"line_number":6874,"context_line":""},{"line_number":6875,"context_line":"    When using the \u0027pack\u0027 NUMA cell allocation strategy, a VM that does NOT"},{"line_number":6876,"context_line":"    request any PCI device should be placed on a NUMA node that does NOT"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a384c6e_7d058ecc","line":6873,"in_reply_to":"e6908834_4eeaff09","updated":"2026-03-17 17:27:38.000000000","message":"Done","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e04cbee7062f4d10c4ad99250ddc6383a21b172c","unresolved":true,"context_lines":[{"line_number":6924,"context_line":"        \"\"\""},{"line_number":6925,"context_line":"        # 4 NUMA nodes, 2 cores * 1 thread each \u003d 8 CPUs total"},{"line_number":6926,"context_line":"        # 4GB per node \u003d 16GB total"},{"line_number":6927,"context_line":"        per_node_mem_kb \u003d 4 * units.Mi  # 4GB in KB"},{"line_number":6928,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":6929,"context_line":"            cpu_nodes\u003d4, cpu_sockets\u003d1, cpu_cores\u003d2, cpu_threads\u003d1,"},{"line_number":6930,"context_line":"            kB_mem\u003dper_node_mem_kb * 4,"}],"source_content_type":"text/x-python","patch_set":1,"id":"779d85c4_b690a496","line":6927,"updated":"2026-03-10 15:27:11.000000000","message":"We could encoded that comment as (16 * units.Gi) // units.Ki) as used by other testcases in this file","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"8cf4b94cec8ed4d7c55a264a1fd27a7d8b12688a","unresolved":false,"context_lines":[{"line_number":6924,"context_line":"        \"\"\""},{"line_number":6925,"context_line":"        # 4 NUMA nodes, 2 cores * 1 thread each \u003d 8 CPUs total"},{"line_number":6926,"context_line":"        # 4GB per node \u003d 16GB total"},{"line_number":6927,"context_line":"        per_node_mem_kb \u003d 4 * units.Mi  # 4GB in KB"},{"line_number":6928,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":6929,"context_line":"            cpu_nodes\u003d4, cpu_sockets\u003d1, cpu_cores\u003d2, cpu_threads\u003d1,"},{"line_number":6930,"context_line":"            kB_mem\u003dper_node_mem_kb * 4,"}],"source_content_type":"text/x-python","patch_set":1,"id":"62f9bf16_3ec336b0","line":6927,"in_reply_to":"24446e50_0bc77b55","updated":"2026-03-20 10:25:53.000000000","message":"Acknowledged","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6fe97ba4df3a145b71d525d1a07dfb52f020d0db","unresolved":false,"context_lines":[{"line_number":6924,"context_line":"        \"\"\""},{"line_number":6925,"context_line":"        # 4 NUMA nodes, 2 cores * 1 thread each \u003d 8 CPUs total"},{"line_number":6926,"context_line":"        # 4GB per node \u003d 16GB total"},{"line_number":6927,"context_line":"        per_node_mem_kb \u003d 4 * units.Mi  # 4GB in KB"},{"line_number":6928,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":6929,"context_line":"            cpu_nodes\u003d4, cpu_sockets\u003d1, cpu_cores\u003d2, cpu_threads\u003d1,"},{"line_number":6930,"context_line":"            kB_mem\u003dper_node_mem_kb * 4,"}],"source_content_type":"text/x-python","patch_set":1,"id":"8c5e9b4d_314f69cd","line":6927,"in_reply_to":"24446e50_0bc77b55","updated":"2026-03-19 19:11:31.000000000","message":"Done","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"06c6838664f98bd7dcccb12ca3762d148935550f","unresolved":false,"context_lines":[{"line_number":6924,"context_line":"        \"\"\""},{"line_number":6925,"context_line":"        # 4 NUMA nodes, 2 cores * 1 thread each \u003d 8 CPUs total"},{"line_number":6926,"context_line":"        # 4GB per node \u003d 16GB total"},{"line_number":6927,"context_line":"        per_node_mem_kb \u003d 4 * units.Mi  # 4GB in KB"},{"line_number":6928,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":6929,"context_line":"            cpu_nodes\u003d4, cpu_sockets\u003d1, cpu_cores\u003d2, cpu_threads\u003d1,"},{"line_number":6930,"context_line":"            kB_mem\u003dper_node_mem_kb * 4,"}],"source_content_type":"text/x-python","patch_set":1,"id":"766e710d_80696ccb","line":6927,"in_reply_to":"779d85c4_b690a496","updated":"2026-03-17 17:27:38.000000000","message":"Done","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9694bf72c7de08b01d64c4024dc5d47ab29c5962","unresolved":true,"context_lines":[{"line_number":6924,"context_line":"        \"\"\""},{"line_number":6925,"context_line":"        # 4 NUMA nodes, 2 cores * 1 thread each \u003d 8 CPUs total"},{"line_number":6926,"context_line":"        # 4GB per node \u003d 16GB total"},{"line_number":6927,"context_line":"        per_node_mem_kb \u003d 4 * units.Mi  # 4GB in KB"},{"line_number":6928,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":6929,"context_line":"            cpu_nodes\u003d4, cpu_sockets\u003d1, cpu_cores\u003d2, cpu_threads\u003d1,"},{"line_number":6930,"context_line":"            kB_mem\u003dper_node_mem_kb * 4,"}],"source_content_type":"text/x-python","patch_set":1,"id":"24446e50_0bc77b55","line":6927,"in_reply_to":"779d85c4_b690a496","updated":"2026-03-19 16:43:06.000000000","message":"im ok with either i guess but following the convetion of the other test is proably better","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e04cbee7062f4d10c4ad99250ddc6383a21b172c","unresolved":true,"context_lines":[{"line_number":6935,"context_line":"            hugepages_1g \u003d per_node_mem_kb // units.Mi  # 4 x 1GB pages"},{"line_number":6936,"context_line":"            cell.mempages \u003d fakelibvirt.create_mempages(["},{"line_number":6937,"context_line":"                (4, 0),               # no small pages"},{"line_number":6938,"context_line":"                (units.Mi, hugepages_1g),  # 1GB hugepages"},{"line_number":6939,"context_line":"            ])"},{"line_number":6940,"context_line":""},{"line_number":6941,"context_line":"        # Place PCI device exclusively on NUMA node 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"adee5bca_259d3d45","line":6938,"updated":"2026-03-10 15:27:11.000000000","message":"the fist value is the size in Kbytes the second is the number of pages. So this would be nicer to write as \n(4, 0)  # no small pages\n((units.Gi // units.Ki), 4)  # 4 x 1GB pages","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"06c6838664f98bd7dcccb12ca3762d148935550f","unresolved":false,"context_lines":[{"line_number":6935,"context_line":"            hugepages_1g \u003d per_node_mem_kb // units.Mi  # 4 x 1GB pages"},{"line_number":6936,"context_line":"            cell.mempages \u003d fakelibvirt.create_mempages(["},{"line_number":6937,"context_line":"                (4, 0),               # no small pages"},{"line_number":6938,"context_line":"                (units.Mi, hugepages_1g),  # 1GB hugepages"},{"line_number":6939,"context_line":"            ])"},{"line_number":6940,"context_line":""},{"line_number":6941,"context_line":"        # Place PCI device exclusively on NUMA node 0"}],"source_content_type":"text/x-python","patch_set":1,"id":"4f4e564a_43d29a44","line":6938,"in_reply_to":"adee5bca_259d3d45","updated":"2026-03-17 17:27:38.000000000","message":"Done","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e04cbee7062f4d10c4ad99250ddc6383a21b172c","unresolved":true,"context_lines":[{"line_number":6949,"context_line":"        )"},{"line_number":6950,"context_line":""},{"line_number":6951,"context_line":"        # Create a VM with CPU pinning and hugepages but WITHOUT any PCI"},{"line_number":6952,"context_line":"        # request — matching the customer scenario (OSPRH-25388)"},{"line_number":6953,"context_line":"        extra_spec \u003d {"},{"line_number":6954,"context_line":"            \u0027hw:cpu_policy\u0027: \u0027dedicated\u0027,"},{"line_number":6955,"context_line":"            \u0027hw:mem_page_size\u0027: \u00271GB\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"2b2098ec_4d1dcf63","line":6952,"updated":"2026-03-10 15:27:11.000000000","message":"ditto does not use the downstream tracker.\nAlso you don\u0027t have to refer to the customer scenario. You defined the scenario in the doc comment of the test class. You can extend that description if needed to be self containing.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"06c6838664f98bd7dcccb12ca3762d148935550f","unresolved":false,"context_lines":[{"line_number":6949,"context_line":"        )"},{"line_number":6950,"context_line":""},{"line_number":6951,"context_line":"        # Create a VM with CPU pinning and hugepages but WITHOUT any PCI"},{"line_number":6952,"context_line":"        # request — matching the customer scenario (OSPRH-25388)"},{"line_number":6953,"context_line":"        extra_spec \u003d {"},{"line_number":6954,"context_line":"            \u0027hw:cpu_policy\u0027: \u0027dedicated\u0027,"},{"line_number":6955,"context_line":"            \u0027hw:mem_page_size\u0027: \u00271GB\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"d28241bb_c8cb3231","line":6952,"in_reply_to":"2b2098ec_4d1dcf63","updated":"2026-03-17 17:27:38.000000000","message":"Done","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e04cbee7062f4d10c4ad99250ddc6383a21b172c","unresolved":true,"context_lines":[{"line_number":6962,"context_line":"        inst \u003d objects.Instance.get_by_uuid(self.ctxt, server[\u0027id\u0027])"},{"line_number":6963,"context_line":"        self.assertIsNotNone(inst.numa_topology)"},{"line_number":6964,"context_line":"        self.assertEqual(1, len(inst.numa_topology.cells))"},{"line_number":6965,"context_line":""},{"line_number":6966,"context_line":"        placed_on_node \u003d inst.numa_topology.cells[0].id"},{"line_number":6967,"context_line":""},{"line_number":6968,"context_line":"        # This is bug OSPRH-25388."}],"source_content_type":"text/x-python","patch_set":1,"id":"b380e8f5_67ac16ff","line":6965,"updated":"2026-03-10 15:27:11.000000000","message":"How hard it would be to assert that the scheduler did the right thing to prove that only only the compute claim was faulty?","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"06c6838664f98bd7dcccb12ca3762d148935550f","unresolved":false,"context_lines":[{"line_number":6962,"context_line":"        inst \u003d objects.Instance.get_by_uuid(self.ctxt, server[\u0027id\u0027])"},{"line_number":6963,"context_line":"        self.assertIsNotNone(inst.numa_topology)"},{"line_number":6964,"context_line":"        self.assertEqual(1, len(inst.numa_topology.cells))"},{"line_number":6965,"context_line":""},{"line_number":6966,"context_line":"        placed_on_node \u003d inst.numa_topology.cells[0].id"},{"line_number":6967,"context_line":""},{"line_number":6968,"context_line":"        # This is bug OSPRH-25388."}],"source_content_type":"text/x-python","patch_set":1,"id":"1340042a_6bef570a","line":6965,"in_reply_to":"b380e8f5_67ac16ff","updated":"2026-03-17 17:27:38.000000000","message":"Done","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e04cbee7062f4d10c4ad99250ddc6383a21b172c","unresolved":true,"context_lines":[{"line_number":6964,"context_line":"        self.assertEqual(1, len(inst.numa_topology.cells))"},{"line_number":6965,"context_line":""},{"line_number":6966,"context_line":"        placed_on_node \u003d inst.numa_topology.cells[0].id"},{"line_number":6967,"context_line":""},{"line_number":6968,"context_line":"        # This is bug OSPRH-25388."},{"line_number":6969,"context_line":"        # The compute claim (claims.py) does not pass pci_stats to"},{"line_number":6970,"context_line":"        # numa_fit_instance_to_host when the VM has no PCI requests,"}],"source_content_type":"text/x-python","patch_set":1,"id":"467b0013_f23f9269","line":6967,"updated":"2026-03-10 15:27:11.000000000","message":"Would be nice to assert that NUMA node 0 has the PCI devices.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"06c6838664f98bd7dcccb12ca3762d148935550f","unresolved":false,"context_lines":[{"line_number":6964,"context_line":"        self.assertEqual(1, len(inst.numa_topology.cells))"},{"line_number":6965,"context_line":""},{"line_number":6966,"context_line":"        placed_on_node \u003d inst.numa_topology.cells[0].id"},{"line_number":6967,"context_line":""},{"line_number":6968,"context_line":"        # This is bug OSPRH-25388."},{"line_number":6969,"context_line":"        # The compute claim (claims.py) does not pass pci_stats to"},{"line_number":6970,"context_line":"        # numa_fit_instance_to_host when the VM has no PCI requests,"}],"source_content_type":"text/x-python","patch_set":1,"id":"f5ac08ad_316599c6","line":6967,"in_reply_to":"467b0013_f23f9269","updated":"2026-03-17 17:27:38.000000000","message":"Done","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e04cbee7062f4d10c4ad99250ddc6383a21b172c","unresolved":true,"context_lines":[{"line_number":6965,"context_line":""},{"line_number":6966,"context_line":"        placed_on_node \u003d inst.numa_topology.cells[0].id"},{"line_number":6967,"context_line":""},{"line_number":6968,"context_line":"        # This is bug OSPRH-25388."},{"line_number":6969,"context_line":"        # The compute claim (claims.py) does not pass pci_stats to"},{"line_number":6970,"context_line":"        # numa_fit_instance_to_host when the VM has no PCI requests,"},{"line_number":6971,"context_line":"        # so the PCI-aware NUMA sort is skipped and the VM lands on"}],"source_content_type":"text/x-python","patch_set":1,"id":"e2116c00_0fb76873","line":6968,"updated":"2026-03-10 15:27:11.000000000","message":"ditto","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"06c6838664f98bd7dcccb12ca3762d148935550f","unresolved":false,"context_lines":[{"line_number":6965,"context_line":""},{"line_number":6966,"context_line":"        placed_on_node \u003d inst.numa_topology.cells[0].id"},{"line_number":6967,"context_line":""},{"line_number":6968,"context_line":"        # This is bug OSPRH-25388."},{"line_number":6969,"context_line":"        # The compute claim (claims.py) does not pass pci_stats to"},{"line_number":6970,"context_line":"        # numa_fit_instance_to_host when the VM has no PCI requests,"},{"line_number":6971,"context_line":"        # so the PCI-aware NUMA sort is skipped and the VM lands on"}],"source_content_type":"text/x-python","patch_set":1,"id":"6b4c17fa_0e4fd456","line":6968,"in_reply_to":"e2116c00_0fb76873","updated":"2026-03-17 17:27:38.000000000","message":"Done","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e04cbee7062f4d10c4ad99250ddc6383a21b172c","unresolved":true,"context_lines":[{"line_number":6978,"context_line":"    def test_non_pci_vm_pack_sequential_avoids_pci_node(self):"},{"line_number":6979,"context_line":"        \"\"\"Launch 3 non-PCI VMs sequentially - none should land on NUMA 0."},{"line_number":6980,"context_line":""},{"line_number":6981,"context_line":"        This reproduces the customer scenario from OSPRH-25388 where 3 VMs"},{"line_number":6982,"context_line":"        were launched and 2 of them ended up on the PCI NUMA node."},{"line_number":6983,"context_line":"        \"\"\""},{"line_number":6984,"context_line":"        per_node_mem_kb \u003d 4 * units.Mi  # 4GB per node"}],"source_content_type":"text/x-python","patch_set":1,"id":"2005c147_55bba619","line":6981,"updated":"2026-03-10 15:27:11.000000000","message":"ditto, define the scenario here directly instead of an external reference","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"06c6838664f98bd7dcccb12ca3762d148935550f","unresolved":false,"context_lines":[{"line_number":6978,"context_line":"    def test_non_pci_vm_pack_sequential_avoids_pci_node(self):"},{"line_number":6979,"context_line":"        \"\"\"Launch 3 non-PCI VMs sequentially - none should land on NUMA 0."},{"line_number":6980,"context_line":""},{"line_number":6981,"context_line":"        This reproduces the customer scenario from OSPRH-25388 where 3 VMs"},{"line_number":6982,"context_line":"        were launched and 2 of them ended up on the PCI NUMA node."},{"line_number":6983,"context_line":"        \"\"\""},{"line_number":6984,"context_line":"        per_node_mem_kb \u003d 4 * units.Mi  # 4GB per node"}],"source_content_type":"text/x-python","patch_set":1,"id":"a124a6af_3ce743c0","line":6981,"in_reply_to":"2005c147_55bba619","updated":"2026-03-17 17:27:38.000000000","message":"Done","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e04cbee7062f4d10c4ad99250ddc6383a21b172c","unresolved":true,"context_lines":[{"line_number":6996,"context_line":"            ])"},{"line_number":6997,"context_line":""},{"line_number":6998,"context_line":"        pci_info \u003d fakelibvirt.HostPCIDevicesInfo("},{"line_number":6999,"context_line":"            num_pci\u003d1, numa_node\u003d0)"},{"line_number":7000,"context_line":""},{"line_number":7001,"context_line":"        self.start_compute("},{"line_number":7002,"context_line":"            hostname\u003d\u0027compute1\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"2a1ef9fd_986a05c4","line":6999,"updated":"2026-03-10 15:27:11.000000000","message":"Can we pull out the common setup to a single helper?","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"06c6838664f98bd7dcccb12ca3762d148935550f","unresolved":false,"context_lines":[{"line_number":6996,"context_line":"            ])"},{"line_number":6997,"context_line":""},{"line_number":6998,"context_line":"        pci_info \u003d fakelibvirt.HostPCIDevicesInfo("},{"line_number":6999,"context_line":"            num_pci\u003d1, numa_node\u003d0)"},{"line_number":7000,"context_line":""},{"line_number":7001,"context_line":"        self.start_compute("},{"line_number":7002,"context_line":"            hostname\u003d\u0027compute1\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"4f71c919_6af95198","line":6999,"in_reply_to":"2a1ef9fd_986a05c4","updated":"2026-03-17 17:27:38.000000000","message":"Done","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e04cbee7062f4d10c4ad99250ddc6383a21b172c","unresolved":true,"context_lines":[{"line_number":7011,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":7012,"context_line":""},{"line_number":7013,"context_line":"        placed_nodes \u003d []"},{"line_number":7014,"context_line":"        for i in range(3):"},{"line_number":7015,"context_line":"            server \u003d self._create_server("},{"line_number":7016,"context_line":"                flavor_id\u003dflavor_id, networks\u003d\u0027none\u0027)"},{"line_number":7017,"context_line":"            inst \u003d objects.Instance.get_by_uuid(self.ctxt, server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"5b22c44d_f9960807","line":7014,"updated":"2026-03-10 15:27:11.000000000","message":"this and the above test case only differs in this for loop. I suggest to keep only this test case and not the previous one as this one covers the previous case as well with the first i index.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"724585914e1b99bd93e6236704a19fe867a6b1bf","unresolved":false,"context_lines":[{"line_number":7011,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":7012,"context_line":""},{"line_number":7013,"context_line":"        placed_nodes \u003d []"},{"line_number":7014,"context_line":"        for i in range(3):"},{"line_number":7015,"context_line":"            server \u003d self._create_server("},{"line_number":7016,"context_line":"                flavor_id\u003dflavor_id, networks\u003d\u0027none\u0027)"},{"line_number":7017,"context_line":"            inst \u003d objects.Instance.get_by_uuid(self.ctxt, server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"c380d2bb_32c6ee7a","line":7014,"in_reply_to":"2e10c4db_9b5aa4d2","updated":"2026-03-19 15:14:25.000000000","message":"Yep, clearer to me now at least.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"06c6838664f98bd7dcccb12ca3762d148935550f","unresolved":true,"context_lines":[{"line_number":7011,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":7012,"context_line":""},{"line_number":7013,"context_line":"        placed_nodes \u003d []"},{"line_number":7014,"context_line":"        for i in range(3):"},{"line_number":7015,"context_line":"            server \u003d self._create_server("},{"line_number":7016,"context_line":"                flavor_id\u003dflavor_id, networks\u003d\u0027none\u0027)"},{"line_number":7017,"context_line":"            inst \u003d objects.Instance.get_by_uuid(self.ctxt, server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"622a53fc_2c8b4826","line":7014,"in_reply_to":"5b22c44d_f9960807","updated":"2026-03-17 17:27:38.000000000","message":"The \"spy\" approach only works reliably with a single VM. With multiple VMs (as in the sequential test), the scheduler may legitimately place the 4th-fit call on node 0 once nodes 1, 2, 3 are full, so we cannot assert that every scheduler\ncall avoids node 0.\n\nSo I kept the first step for the above reason.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"54534037acee72694536c8d5ef8e63ed559f8dd9","unresolved":true,"context_lines":[{"line_number":7011,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":7012,"context_line":""},{"line_number":7013,"context_line":"        placed_nodes \u003d []"},{"line_number":7014,"context_line":"        for i in range(3):"},{"line_number":7015,"context_line":"            server \u003d self._create_server("},{"line_number":7016,"context_line":"                flavor_id\u003dflavor_id, networks\u003d\u0027none\u0027)"},{"line_number":7017,"context_line":"            inst \u003d objects.Instance.get_by_uuid(self.ctxt, server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"f1df720f_b40c400a","line":7014,"in_reply_to":"622a53fc_2c8b4826","updated":"2026-03-18 19:15:16.000000000","message":"I think it would be better to name and designate the one above as specific to checking that the compute node and scheduler agree. That\u0027s the salient bit of the above test that is not covered here. I think it\u0027s worthwhile to have it, but make it the _point_ of the above test and it will be clearer.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"8dd0d290f233d1b9cb7463fbaa9f5135f1640917","unresolved":true,"context_lines":[{"line_number":7011,"context_line":"        flavor_id \u003d self._create_flavor(extra_spec\u003dextra_spec)"},{"line_number":7012,"context_line":""},{"line_number":7013,"context_line":"        placed_nodes \u003d []"},{"line_number":7014,"context_line":"        for i in range(3):"},{"line_number":7015,"context_line":"            server \u003d self._create_server("},{"line_number":7016,"context_line":"                flavor_id\u003dflavor_id, networks\u003d\u0027none\u0027)"},{"line_number":7017,"context_line":"            inst \u003d objects.Instance.get_by_uuid(self.ctxt, server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"2e10c4db_9b5aa4d2","line":7014,"in_reply_to":"f1df720f_b40c400a","updated":"2026-03-19 15:05:22.000000000","message":"OK I have revised this point tell me if you like it now.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e04cbee7062f4d10c4ad99250ddc6383a21b172c","unresolved":true,"context_lines":[{"line_number":7028,"context_line":"        #     self.assertNotEqual(0, node_id)"},{"line_number":7029,"context_line":""},{"line_number":7030,"context_line":"    def test_pci_vm_lands_on_pci_numa_node_with_pack(self):"},{"line_number":7031,"context_line":"        \"\"\"A VM that requests a PCI device should land on the PCI NUMA node."},{"line_number":7032,"context_line":""},{"line_number":7033,"context_line":"        This is the positive control: when a VM explicitly requests a PCI"},{"line_number":7034,"context_line":"        device, the PCI-aware sort should place it on the NUMA node that"}],"source_content_type":"text/x-python","patch_set":1,"id":"980d52d8_89d5197a","line":7031,"updated":"2026-03-10 15:27:11.000000000","message":"Do we have this test case already somewhere? I assume when the NUMA packing feature was added such positive test is provided. Could you check it please?","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"54534037acee72694536c8d5ef8e63ed559f8dd9","unresolved":true,"context_lines":[{"line_number":7028,"context_line":"        #     self.assertNotEqual(0, node_id)"},{"line_number":7029,"context_line":""},{"line_number":7030,"context_line":"    def test_pci_vm_lands_on_pci_numa_node_with_pack(self):"},{"line_number":7031,"context_line":"        \"\"\"A VM that requests a PCI device should land on the PCI NUMA node."},{"line_number":7032,"context_line":""},{"line_number":7033,"context_line":"        This is the positive control: when a VM explicitly requests a PCI"},{"line_number":7034,"context_line":"        device, the PCI-aware sort should place it on the NUMA node that"}],"source_content_type":"text/x-python","patch_set":1,"id":"876bd03c_fb86333d","line":7031,"in_reply_to":"05b34d18_2049747f","updated":"2026-03-18 19:15:16.000000000","message":"I haven\u0027t gone looking but I believe uggla if he says so. Agree it seems like it _should_ have been covered initially though.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"8dd0d290f233d1b9cb7463fbaa9f5135f1640917","unresolved":true,"context_lines":[{"line_number":7028,"context_line":"        #     self.assertNotEqual(0, node_id)"},{"line_number":7029,"context_line":""},{"line_number":7030,"context_line":"    def test_pci_vm_lands_on_pci_numa_node_with_pack(self):"},{"line_number":7031,"context_line":"        \"\"\"A VM that requests a PCI device should land on the PCI NUMA node."},{"line_number":7032,"context_line":""},{"line_number":7033,"context_line":"        This is the positive control: when a VM explicitly requests a PCI"},{"line_number":7034,"context_line":"        device, the PCI-aware sort should place it on the NUMA node that"}],"source_content_type":"text/x-python","patch_set":1,"id":"90179c4d_6f12415f","line":7031,"in_reply_to":"876bd03c_fb86333d","updated":"2026-03-19 15:05:22.000000000","message":"The original fix does not include a functional test:                                                                                                                                                                                      \n805649: Fix to implement \u0027pack\u0027 or \u0027spread\u0027 VM\u0027s NUMA cells | https://review.opendev.org/c/openstack/nova/+/805649\n                                                                                                                                                                                                                                              \nI searched the functional test suite in case it was added in a separate patch, but I couldn\u0027t find a similar functional test. I may have missed it, though.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"724585914e1b99bd93e6236704a19fe867a6b1bf","unresolved":true,"context_lines":[{"line_number":7028,"context_line":"        #     self.assertNotEqual(0, node_id)"},{"line_number":7029,"context_line":""},{"line_number":7030,"context_line":"    def test_pci_vm_lands_on_pci_numa_node_with_pack(self):"},{"line_number":7031,"context_line":"        \"\"\"A VM that requests a PCI device should land on the PCI NUMA node."},{"line_number":7032,"context_line":""},{"line_number":7033,"context_line":"        This is the positive control: when a VM explicitly requests a PCI"},{"line_number":7034,"context_line":"        device, the PCI-aware sort should place it on the NUMA node that"}],"source_content_type":"text/x-python","patch_set":1,"id":"c051eb3a_5794804c","line":7031,"in_reply_to":"90179c4d_6f12415f","updated":"2026-03-19 15:14:25.000000000","message":"Yeah, no functional tests in that patch at least.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"06c6838664f98bd7dcccb12ca3762d148935550f","unresolved":true,"context_lines":[{"line_number":7028,"context_line":"        #     self.assertNotEqual(0, node_id)"},{"line_number":7029,"context_line":""},{"line_number":7030,"context_line":"    def test_pci_vm_lands_on_pci_numa_node_with_pack(self):"},{"line_number":7031,"context_line":"        \"\"\"A VM that requests a PCI device should land on the PCI NUMA node."},{"line_number":7032,"context_line":""},{"line_number":7033,"context_line":"        This is the positive control: when a VM explicitly requests a PCI"},{"line_number":7034,"context_line":"        device, the PCI-aware sort should place it on the NUMA node that"}],"source_content_type":"text/x-python","patch_set":1,"id":"05b34d18_2049747f","line":7031,"in_reply_to":"980d52d8_89d5197a","updated":"2026-03-17 17:27:38.000000000","message":"There are unit tests covering this test_sort_pci_stats_pci_req_no_shared_cpu_policy and test_sort_pci_stats_pci_req_shared_cpu_policy, but no functional test validating the end-to-end path for a PCI VM with pack strategy. So I\u0027d prefer to keep it. Tell me what you think.","commit_id":"d805d23a009d0d27bdf676843e10c1587d079a41"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"54534037acee72694536c8d5ef8e63ed559f8dd9","unresolved":true,"context_lines":[{"line_number":7046,"context_line":"        correctly because claims.py does pass pci_stats when"},{"line_number":7047,"context_line":"        pci_requests.requests is non-empty."},{"line_number":7048,"context_line":"        \"\"\""},{"line_number":7049,"context_line":"        self._start_compute_with_pci_on_numa0()"},{"line_number":7050,"context_line":""},{"line_number":7051,"context_line":"        # Create a VM that DOES request a PCI device"},{"line_number":7052,"context_line":"        extra_spec \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"962a9ddb_a031b9de","line":7049,"updated":"2026-03-18 19:15:16.000000000","message":"This is maybe not that important, but the above tests rely (I think?) on the fact that numa0 will be the default place we land if we\u0027re not specifically avoiding it. Should this test not try to avoid passing because of such default? Meaning, seems like maybe having numa1 be the one with the PCI device to ensure that we actively pick it and not just default?","commit_id":"80da89f9c4cd07a2c9bb91694ca90c526a8cc204"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"8dd0d290f233d1b9cb7463fbaa9f5135f1640917","unresolved":false,"context_lines":[{"line_number":7046,"context_line":"        correctly because claims.py does pass pci_stats when"},{"line_number":7047,"context_line":"        pci_requests.requests is non-empty."},{"line_number":7048,"context_line":"        \"\"\""},{"line_number":7049,"context_line":"        self._start_compute_with_pci_on_numa0()"},{"line_number":7050,"context_line":""},{"line_number":7051,"context_line":"        # Create a VM that DOES request a PCI device"},{"line_number":7052,"context_line":"        extra_spec \u003d {"}],"source_content_type":"text/x-python","patch_set":3,"id":"229fcc2b_0d6ecc1e","line":7049,"in_reply_to":"962a9ddb_a031b9de","updated":"2026-03-19 15:05:22.000000000","message":"Done","commit_id":"80da89f9c4cd07a2c9bb91694ca90c526a8cc204"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"898c9fc8fe60532b8150db455e25648daf2958d5","unresolved":true,"context_lines":[{"line_number":6911,"context_line":"        self.flags(cpu_dedicated_set\u003d\u00270-7\u0027, group\u003d\u0027compute\u0027)"},{"line_number":6912,"context_line":""},{"line_number":6913,"context_line":"    def _start_compute_with_pci(self, pci_numa_node):"},{"line_number":6914,"context_line":"        \"\"\"Start a compute with 4 NUMA nodes and PCI devices on a given node."},{"line_number":6915,"context_line":""},{"line_number":6916,"context_line":"        - 4 NUMA nodes (0-3), each with 2 CPUs and 4GB RAM with 1GB hugepages"},{"line_number":6917,"context_line":"        - PCI device only on the specified NUMA node"},{"line_number":6918,"context_line":"        \"\"\""},{"line_number":6919,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":6920,"context_line":"            cpu_nodes\u003d4, cpu_sockets\u003d1, cpu_cores\u003d2, cpu_threads\u003d1,"},{"line_number":6921,"context_line":"            kB_mem\u003d(16 * units.Gi) // units.Ki,"}],"source_content_type":"text/x-python","patch_set":4,"id":"80968518_51fae652","line":6918,"range":{"start_line":6914,"start_character":0,"end_line":6918,"end_character":11},"updated":"2026-03-19 17:11:13.000000000","message":"ok so pci_numa_node is an init representign the numa node where the device are created.\n\nthat clear form teh code but not that clear form the doc string.","commit_id":"ed58a08ffa60c3b9dbb3ca14a89c95f6b6f35ac6"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"8cf4b94cec8ed4d7c55a264a1fd27a7d8b12688a","unresolved":false,"context_lines":[{"line_number":6911,"context_line":"        self.flags(cpu_dedicated_set\u003d\u00270-7\u0027, group\u003d\u0027compute\u0027)"},{"line_number":6912,"context_line":""},{"line_number":6913,"context_line":"    def _start_compute_with_pci(self, pci_numa_node):"},{"line_number":6914,"context_line":"        \"\"\"Start a compute with 4 NUMA nodes and PCI devices on a given node."},{"line_number":6915,"context_line":""},{"line_number":6916,"context_line":"        - 4 NUMA nodes (0-3), each with 2 CPUs and 4GB RAM with 1GB hugepages"},{"line_number":6917,"context_line":"        - PCI device only on the specified NUMA node"},{"line_number":6918,"context_line":"        \"\"\""},{"line_number":6919,"context_line":"        host_info \u003d fakelibvirt.HostInfo("},{"line_number":6920,"context_line":"            cpu_nodes\u003d4, cpu_sockets\u003d1, cpu_cores\u003d2, cpu_threads\u003d1,"},{"line_number":6921,"context_line":"            kB_mem\u003d(16 * units.Gi) // units.Ki,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1dca58a1_ebdfc16a","line":6918,"range":{"start_line":6914,"start_character":0,"end_line":6918,"end_character":11},"in_reply_to":"80968518_51fae652","updated":"2026-03-20 10:25:53.000000000","message":"Done","commit_id":"ed58a08ffa60c3b9dbb3ca14a89c95f6b6f35ac6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"898c9fc8fe60532b8150db455e25648daf2958d5","unresolved":false,"context_lines":[{"line_number":6978,"context_line":"        def spy_numa_fit(*args, **kwargs):"},{"line_number":6979,"context_line":"            result \u003d orig_fit(*args, **kwargs)"},{"line_number":6980,"context_line":"            fit_results.append(result)"},{"line_number":6981,"context_line":"            return result"},{"line_number":6982,"context_line":""},{"line_number":6983,"context_line":"        with mock.patch("},{"line_number":6984,"context_line":"            \u0027nova.virt.hardware.numa_fit_instance_to_host\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"90fdb37c_a2f79d00","line":6981,"updated":"2026-03-19 17:11:13.000000000","message":"+1 for using the spy pattern\n\nwe do this in simialr tests elsewhere","commit_id":"ed58a08ffa60c3b9dbb3ca14a89c95f6b6f35ac6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"898c9fc8fe60532b8150db455e25648daf2958d5","unresolved":false,"context_lines":[{"line_number":6997,"context_line":"        # and avoid the PCI NUMA node."},{"line_number":6998,"context_line":"        scheduler_result \u003d fit_results[0]"},{"line_number":6999,"context_line":"        self.assertIsNotNone(scheduler_result)"},{"line_number":7000,"context_line":"        self.assertNotEqual("},{"line_number":7001,"context_line":"            0, scheduler_result.cells[0].id,"},{"line_number":7002,"context_line":"            \"The scheduler correctly avoided the PCI NUMA node.\","},{"line_number":7003,"context_line":"        )"},{"line_number":7004,"context_line":""},{"line_number":7005,"context_line":"        # Verify the final placement matches the scheduler\u0027s decision"},{"line_number":7006,"context_line":"        inst \u003d objects.Instance.get_by_uuid(self.ctxt, server[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"2e8e6228_f118d2c6","line":7003,"range":{"start_line":7000,"start_character":0,"end_line":7003,"end_character":9},"updated":"2026-03-19 17:11:13.000000000","message":"ack that is the correct expecation based on `self._start_compute_with_pci(pci_numa_node\u003d0)`","commit_id":"ed58a08ffa60c3b9dbb3ca14a89c95f6b6f35ac6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"898c9fc8fe60532b8150db455e25648daf2958d5","unresolved":true,"context_lines":[{"line_number":7014,"context_line":"        # NUMA node 0."},{"line_number":7015,"context_line":"        self.assertEqual(0, placed_on_node)"},{"line_number":7016,"context_line":"        # After the fix the following should pass:"},{"line_number":7017,"context_line":"        # self.assertNotEqual(0, placed_on_node)"},{"line_number":7018,"context_line":""},{"line_number":7019,"context_line":"    def test_non_pci_vm_pack_sequential_avoids_pci_node(self):"},{"line_number":7020,"context_line":"        \"\"\"Launch 3 non-PCI VMs sequentially - none should land on NUMA 0."}],"source_content_type":"text/x-python","patch_set":4,"id":"c3cbf9ee_478f5877","line":7017,"updated":"2026-03-19 17:11:13.000000000","message":"+1 yep i agree this is a good reproducer of the no pci request case.","commit_id":"ed58a08ffa60c3b9dbb3ca14a89c95f6b6f35ac6"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"8cf4b94cec8ed4d7c55a264a1fd27a7d8b12688a","unresolved":false,"context_lines":[{"line_number":7014,"context_line":"        # NUMA node 0."},{"line_number":7015,"context_line":"        self.assertEqual(0, placed_on_node)"},{"line_number":7016,"context_line":"        # After the fix the following should pass:"},{"line_number":7017,"context_line":"        # self.assertNotEqual(0, placed_on_node)"},{"line_number":7018,"context_line":""},{"line_number":7019,"context_line":"    def test_non_pci_vm_pack_sequential_avoids_pci_node(self):"},{"line_number":7020,"context_line":"        \"\"\"Launch 3 non-PCI VMs sequentially - none should land on NUMA 0."}],"source_content_type":"text/x-python","patch_set":4,"id":"64ef87af_f14f88a1","line":7017,"in_reply_to":"c3cbf9ee_478f5877","updated":"2026-03-20 10:25:53.000000000","message":"Acknowledged","commit_id":"ed58a08ffa60c3b9dbb3ca14a89c95f6b6f35ac6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"898c9fc8fe60532b8150db455e25648daf2958d5","unresolved":false,"context_lines":[{"line_number":7044,"context_line":"        self.assertIn(0, placed_nodes)"},{"line_number":7045,"context_line":"        # After the fix the following should pass:"},{"line_number":7046,"context_line":"        # for node_id in placed_nodes:"},{"line_number":7047,"context_line":"        #     self.assertNotEqual(0, node_id)"},{"line_number":7048,"context_line":""},{"line_number":7049,"context_line":"    def test_pci_vm_lands_on_pci_numa_node_with_pack(self):"},{"line_number":7050,"context_line":"        \"\"\"A VM that requests a PCI device should land on the PCI NUMA node."}],"source_content_type":"text/x-python","patch_set":4,"id":"9912627f_9bdf5ac4","line":7047,"updated":"2026-03-19 17:11:13.000000000","message":"sure the multi vm case looks reasonable as well.\n\nthis an dthe previous case is impliclty relying on the fact we iterate over the numa nodes sequally wehn the sorting code is not activated.","commit_id":"ed58a08ffa60c3b9dbb3ca14a89c95f6b6f35ac6"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"898c9fc8fe60532b8150db455e25648daf2958d5","unresolved":false,"context_lines":[{"line_number":7058,"context_line":"        This path works correctly because claims.py does pass pci_stats"},{"line_number":7059,"context_line":"        when pci_requests.requests is non-empty."},{"line_number":7060,"context_line":"        \"\"\""},{"line_number":7061,"context_line":"        self._start_compute_with_pci(pci_numa_node\u003d1)"},{"line_number":7062,"context_line":""},{"line_number":7063,"context_line":"        # Create a VM that DOES request a PCI device"},{"line_number":7064,"context_line":"        extra_spec \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"0e1e6973_5068f346","line":7061,"updated":"2026-03-19 17:11:13.000000000","message":"+1 we need to put the pci device on any numa node other then 0 for this to work as intended","commit_id":"ed58a08ffa60c3b9dbb3ca14a89c95f6b6f35ac6"}]}
