)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"93a231e1a1aec1f83968a5f574a2e7310c708165","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Artom Lifshitz \u003califshit@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-02-08 01:47:40 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] LM: generate new NUMA XML on the dest and send it to the source"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Start using `claimed_numa_topology` in the live migration claim to"},{"line_number":10,"context_line":"calculate new instance XML, then send it to the source as part of the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9fdfeff1_40bb33c3","line":7,"range":{"start_line":7,"start_character":5,"end_line":7,"end_character":69},"updated":"2019-02-10 16:04:41.000000000","message":"am didnt we agree expclitly to generate the xml in the souce node not the dest so we should not do this.","commit_id":"351a4bd2922046e541465dff1527fa4148385a9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a32f22826fa852ad8aeb01b19c21ae84008d05ea","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Artom Lifshitz \u003califshit@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-02-08 01:47:40 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] LM: generate new NUMA XML on the dest and send it to the source"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Start using `claimed_numa_topology` in the live migration claim to"},{"line_number":10,"context_line":"calculate new instance XML, then send it to the source as part of the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9fdfeff1_a0cbff50","line":7,"in_reply_to":"","updated":"2019-02-10 16:13:21.000000000","message":"I may need to rewrite the commit message... I\u0027m basically saying we call _get_guest_numa_config() on the dest, grab the relevant bits, and send those to the source.","commit_id":"351a4bd2922046e541465dff1527fa4148385a9c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c962affe10f03ef6494b8e6ccf465db3979a55dd","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Artom Lifshitz \u003califshit@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2019-02-08 01:47:40 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] LM: generate new NUMA XML on the dest and send it to the source"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Start using `claimed_numa_topology` in the live migration claim to"},{"line_number":10,"context_line":"calculate new instance XML, then send it to the source as part of the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"9fdfeff1_80dfdbd4","line":7,"in_reply_to":"9fdfeff1_a0cbff50","updated":"2019-02-10 17:29:31.000000000","message":"ya i realsed you are not actully generateing the xml and then parsing it you are instead generateing all the python objects \nwe used to model the xml and iterating over the python objects so you are skipping the serialsisation phase but the commet is missleading.","commit_id":"351a4bd2922046e541465dff1527fa4148385a9c"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d9912eee6f3ab093f24134fb897e6268ec90e53","unresolved":false,"context_lines":[{"line_number":2397,"context_line":"                              vconfig.LibvirtConfigGuestGIDMap)"},{"line_number":2398,"context_line":""},{"line_number":2399,"context_line":"    @mock.patch.object(hardware, \u0027get_vcpu_pin_set\u0027)"},{"line_number":2400,"context_line":"    def test_get_dest_numa_config(self, _):"},{"line_number":2401,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"},{"line_number":2402,"context_line":""},{"line_number":2403,"context_line":"        vcpupin1 \u003d vconfig.LibvirtConfigGuestCPUTuneVCPUPin()"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_d2bbd10b","line":2400,"range":{"start_line":2400,"start_character":40,"end_line":2400,"end_character":41},"updated":"2019-07-04 10:32:09.000000000","message":"See efried/melwitt\u0027s \u0027new\u003dmock.Mock()\u0027 trick in other tests to avoid passing through a parameter","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd18362323859831935ec0652f836c21548fbd36","unresolved":false,"context_lines":[{"line_number":2397,"context_line":"                              vconfig.LibvirtConfigGuestGIDMap)"},{"line_number":2398,"context_line":""},{"line_number":2399,"context_line":"    @mock.patch.object(hardware, \u0027get_vcpu_pin_set\u0027)"},{"line_number":2400,"context_line":"    def test_get_dest_numa_config(self, _):"},{"line_number":2401,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"},{"line_number":2402,"context_line":""},{"line_number":2403,"context_line":"        vcpupin1 \u003d vconfig.LibvirtConfigGuestCPUTuneVCPUPin()"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_94c6a616","line":2400,"range":{"start_line":2400,"start_character":40,"end_line":2400,"end_character":41},"in_reply_to":"7faddb67_d2bbd10b","updated":"2019-07-04 12:19:51.000000000","message":"Done","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d9912eee6f3ab093f24134fb897e6268ec90e53","unresolved":false,"context_lines":[{"line_number":2401,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"},{"line_number":2402,"context_line":""},{"line_number":2403,"context_line":"        vcpupin1 \u003d vconfig.LibvirtConfigGuestCPUTuneVCPUPin()"},{"line_number":2404,"context_line":"        vcpupin1.id \u003d 0"},{"line_number":2405,"context_line":"        vcpupin1.cpuset \u003d set([0, 1])"},{"line_number":2406,"context_line":"        vcpupin2 \u003d vconfig.LibvirtConfigGuestCPUTuneVCPUPin()"},{"line_number":2407,"context_line":"        vcpupin2.id \u003d 1"},{"line_number":2408,"context_line":"        vcpupin2.cpuset \u003d set([2, 3])"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_325905fe","line":2405,"range":{"start_line":2404,"start_character":0,"end_line":2405,"end_character":37},"updated":"2019-07-04 10:32:09.000000000","message":"side note: It seems like a weakness of these classes that we can\u0027t pass these through as parameters when initializing the object","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d9912eee6f3ab093f24134fb897e6268ec90e53","unresolved":false,"context_lines":[{"line_number":2411,"context_line":"        guest_cpu_tune \u003d vconfig.LibvirtConfigGuestCPUTune()"},{"line_number":2412,"context_line":"        guest_cpu_tune.vcpupin \u003d [vcpupin1, vcpupin2]"},{"line_number":2413,"context_line":"        guest_cpu_tune.emulatorpin \u003d emulatorpin"},{"line_number":2414,"context_line":"        guest_cpu_tune.vcpusched \u003d \\"},{"line_number":2415,"context_line":"            [vconfig.LibvirtConfigGuestCPUTuneVCPUSched()]"},{"line_number":2416,"context_line":"        guest_cpu_tune.vcpusched[0].vcpus \u003d set([6, 7])"},{"line_number":2417,"context_line":"        guest_cpu_tune.vcpusched[0].priority \u003d 8"},{"line_number":2418,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_32402508","line":2415,"range":{"start_line":2414,"start_character":35,"end_line":2415,"end_character":13},"updated":"2019-07-04 10:32:09.000000000","message":"nit: just drag the bracket up?","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd18362323859831935ec0652f836c21548fbd36","unresolved":false,"context_lines":[{"line_number":2411,"context_line":"        guest_cpu_tune \u003d vconfig.LibvirtConfigGuestCPUTune()"},{"line_number":2412,"context_line":"        guest_cpu_tune.vcpupin \u003d [vcpupin1, vcpupin2]"},{"line_number":2413,"context_line":"        guest_cpu_tune.emulatorpin \u003d emulatorpin"},{"line_number":2414,"context_line":"        guest_cpu_tune.vcpusched \u003d \\"},{"line_number":2415,"context_line":"            [vconfig.LibvirtConfigGuestCPUTuneVCPUSched()]"},{"line_number":2416,"context_line":"        guest_cpu_tune.vcpusched[0].vcpus \u003d set([6, 7])"},{"line_number":2417,"context_line":"        guest_cpu_tune.vcpusched[0].priority \u003d 8"},{"line_number":2418,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_94ef8686","line":2415,"range":{"start_line":2414,"start_character":35,"end_line":2415,"end_character":13},"in_reply_to":"7faddb67_32402508","updated":"2019-07-04 12:19:51.000000000","message":"Done","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d9912eee6f3ab093f24134fb897e6268ec90e53","unresolved":false,"context_lines":[{"line_number":2425,"context_line":"        guest_numa_tune \u003d vconfig.LibvirtConfigGuestNUMATune()"},{"line_number":2426,"context_line":"        guest_numa_tune.memnodes \u003d [memnode1, memnode2]"},{"line_number":2427,"context_line":""},{"line_number":2428,"context_line":"        expected_nmd \u003d objects.NUMAMigrateData("},{"line_number":2429,"context_line":"            cpu_pins\u003d[objects.PinMapping(guest_id\u003d0, host_ids\u003dset([0, 1])),"},{"line_number":2430,"context_line":"                      objects.PinMapping(guest_id\u003d1, host_ids\u003dset([2, 3]))],"},{"line_number":2431,"context_line":"            cell_pins\u003d[objects.PinMapping(guest_id\u003d2, host_ids\u003dset([6, 7])),"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_92d79924","line":2428,"range":{"start_line":2428,"start_character":8,"end_line":2428,"end_character":20},"updated":"2019-07-04 10:32:09.000000000","message":"nit: Just \u0027expected\u0027 ?","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd18362323859831935ec0652f836c21548fbd36","unresolved":false,"context_lines":[{"line_number":2425,"context_line":"        guest_numa_tune \u003d vconfig.LibvirtConfigGuestNUMATune()"},{"line_number":2426,"context_line":"        guest_numa_tune.memnodes \u003d [memnode1, memnode2]"},{"line_number":2427,"context_line":""},{"line_number":2428,"context_line":"        expected_nmd \u003d objects.NUMAMigrateData("},{"line_number":2429,"context_line":"            cpu_pins\u003d[objects.PinMapping(guest_id\u003d0, host_ids\u003dset([0, 1])),"},{"line_number":2430,"context_line":"                      objects.PinMapping(guest_id\u003d1, host_ids\u003dset([2, 3]))],"},{"line_number":2431,"context_line":"            cell_pins\u003d[objects.PinMapping(guest_id\u003d2, host_ids\u003dset([6, 7])),"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_f7bb5c0b","line":2428,"range":{"start_line":2428,"start_character":8,"end_line":2428,"end_character":20},"in_reply_to":"7faddb67_92d79924","updated":"2019-07-04 12:19:51.000000000","message":"I\u0027d rather not, if at all possible. Same argument as the instance_numa_topology thing.","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d9912eee6f3ab093f24134fb897e6268ec90e53","unresolved":false,"context_lines":[{"line_number":2426,"context_line":"        guest_numa_tune.memnodes \u003d [memnode1, memnode2]"},{"line_number":2427,"context_line":""},{"line_number":2428,"context_line":"        expected_nmd \u003d objects.NUMAMigrateData("},{"line_number":2429,"context_line":"            cpu_pins\u003d[objects.PinMapping(guest_id\u003d0, host_ids\u003dset([0, 1])),"},{"line_number":2430,"context_line":"                      objects.PinMapping(guest_id\u003d1, host_ids\u003dset([2, 3]))],"},{"line_number":2431,"context_line":"            cell_pins\u003d[objects.PinMapping(guest_id\u003d2, host_ids\u003dset([6, 7])),"},{"line_number":2432,"context_line":"                       objects.PinMapping(guest_id\u003d3, host_ids\u003dset([8, 9]))],"},{"line_number":2433,"context_line":"            emulator_pins\u003dset([4, 5]),"},{"line_number":2434,"context_line":"            sched_cpus\u003dset([7, 6]),"},{"line_number":2435,"context_line":"            sched_priority\u003d8)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_b26c159d","line":2432,"range":{"start_line":2429,"start_character":0,"end_line":2432,"end_character":77},"updated":"2019-07-04 10:32:09.000000000","message":"this really feels like DictOfInteger territory","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b38dd6231ce7af076ffc952125157ec93751a3e2","unresolved":false,"context_lines":[{"line_number":2426,"context_line":"        guest_numa_tune.memnodes \u003d [memnode1, memnode2]"},{"line_number":2427,"context_line":""},{"line_number":2428,"context_line":"        expected_nmd \u003d objects.NUMAMigrateData("},{"line_number":2429,"context_line":"            cpu_pins\u003d[objects.PinMapping(guest_id\u003d0, host_ids\u003dset([0, 1])),"},{"line_number":2430,"context_line":"                      objects.PinMapping(guest_id\u003d1, host_ids\u003dset([2, 3]))],"},{"line_number":2431,"context_line":"            cell_pins\u003d[objects.PinMapping(guest_id\u003d2, host_ids\u003dset([6, 7])),"},{"line_number":2432,"context_line":"                       objects.PinMapping(guest_id\u003d3, host_ids\u003dset([8, 9]))],"},{"line_number":2433,"context_line":"            emulator_pins\u003dset([4, 5]),"},{"line_number":2434,"context_line":"            sched_cpus\u003dset([7, 6]),"},{"line_number":2435,"context_line":"            sched_priority\u003d8)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_43270e66","line":2432,"range":{"start_line":2429,"start_character":0,"end_line":2432,"end_character":77},"in_reply_to":"7faddb67_23c21287","updated":"2019-07-04 15:47:13.000000000","message":"To be clear, I\u0027m suggesting a new field type, \u0027DictOfListOfIntegersField\u0027 (or \u0027DictOfSetOfIntegersField\u0027, so we will be storing ints, not strings)","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7f669a5bb1892e2a82295a65d5feaf6dbccda2c6","unresolved":false,"context_lines":[{"line_number":2426,"context_line":"        guest_numa_tune.memnodes \u003d [memnode1, memnode2]"},{"line_number":2427,"context_line":""},{"line_number":2428,"context_line":"        expected_nmd \u003d objects.NUMAMigrateData("},{"line_number":2429,"context_line":"            cpu_pins\u003d[objects.PinMapping(guest_id\u003d0, host_ids\u003dset([0, 1])),"},{"line_number":2430,"context_line":"                      objects.PinMapping(guest_id\u003d1, host_ids\u003dset([2, 3]))],"},{"line_number":2431,"context_line":"            cell_pins\u003d[objects.PinMapping(guest_id\u003d2, host_ids\u003dset([6, 7])),"},{"line_number":2432,"context_line":"                       objects.PinMapping(guest_id\u003d3, host_ids\u003dset([8, 9]))],"},{"line_number":2433,"context_line":"            emulator_pins\u003dset([4, 5]),"},{"line_number":2434,"context_line":"            sched_cpus\u003dset([7, 6]),"},{"line_number":2435,"context_line":"            sched_priority\u003d8)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_23c21287","line":2432,"range":{"start_line":2429,"start_character":0,"end_line":2432,"end_character":77},"in_reply_to":"7faddb67_83e8a616","updated":"2019-07-04 15:20:22.000000000","message":"They\u0027re technically ints, not strings, but OK.","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd18362323859831935ec0652f836c21548fbd36","unresolved":false,"context_lines":[{"line_number":2426,"context_line":"        guest_numa_tune.memnodes \u003d [memnode1, memnode2]"},{"line_number":2427,"context_line":""},{"line_number":2428,"context_line":"        expected_nmd \u003d objects.NUMAMigrateData("},{"line_number":2429,"context_line":"            cpu_pins\u003d[objects.PinMapping(guest_id\u003d0, host_ids\u003dset([0, 1])),"},{"line_number":2430,"context_line":"                      objects.PinMapping(guest_id\u003d1, host_ids\u003dset([2, 3]))],"},{"line_number":2431,"context_line":"            cell_pins\u003d[objects.PinMapping(guest_id\u003d2, host_ids\u003dset([6, 7])),"},{"line_number":2432,"context_line":"                       objects.PinMapping(guest_id\u003d3, host_ids\u003dset([8, 9]))],"},{"line_number":2433,"context_line":"            emulator_pins\u003dset([4, 5]),"},{"line_number":2434,"context_line":"            sched_cpus\u003dset([7, 6]),"},{"line_number":2435,"context_line":"            sched_priority\u003d8)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_f7e27c2f","line":2432,"range":{"start_line":2429,"start_character":0,"end_line":2432,"end_character":77},"in_reply_to":"7faddb67_b26c159d","updated":"2019-07-04 12:19:51.000000000","message":"I thought DictOfIntegers was 1:1...","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"d64acca21f5e9b527aa6f748fc1ac33bd754b242","unresolved":false,"context_lines":[{"line_number":2426,"context_line":"        guest_numa_tune.memnodes \u003d [memnode1, memnode2]"},{"line_number":2427,"context_line":""},{"line_number":2428,"context_line":"        expected_nmd \u003d objects.NUMAMigrateData("},{"line_number":2429,"context_line":"            cpu_pins\u003d[objects.PinMapping(guest_id\u003d0, host_ids\u003dset([0, 1])),"},{"line_number":2430,"context_line":"                      objects.PinMapping(guest_id\u003d1, host_ids\u003dset([2, 3]))],"},{"line_number":2431,"context_line":"            cell_pins\u003d[objects.PinMapping(guest_id\u003d2, host_ids\u003dset([6, 7])),"},{"line_number":2432,"context_line":"                       objects.PinMapping(guest_id\u003d3, host_ids\u003dset([8, 9]))],"},{"line_number":2433,"context_line":"            emulator_pins\u003dset([4, 5]),"},{"line_number":2434,"context_line":"            sched_cpus\u003dset([7, 6]),"},{"line_number":2435,"context_line":"            sched_priority\u003d8)"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_83e8a616","line":2432,"range":{"start_line":2429,"start_character":0,"end_line":2432,"end_character":77},"in_reply_to":"7faddb67_f7e27c2f","updated":"2019-07-04 15:18:25.000000000","message":"Doh, it is - the pluralization of Integer threw me. *However*, we do have a \u0027DictOfListOfStringsField\u0027 (yes, it\u0027s quite a mouthful). No reason to not have a \u0027DictOfListOfIntegersField\u0027 and remove that special object","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d9912eee6f3ab093f24134fb897e6268ec90e53","unresolved":false,"context_lines":[{"line_number":2434,"context_line":"            sched_cpus\u003dset([7, 6]),"},{"line_number":2435,"context_line":"            sched_priority\u003d8)"},{"line_number":2436,"context_line":""},{"line_number":2437,"context_line":"        guest_numa_config \u003d (None, guest_cpu_tune, None, guest_numa_tune)"},{"line_number":2438,"context_line":""},{"line_number":2439,"context_line":"        with mock.patch.object(drvr, \u0027_get_guest_numa_config\u0027,"},{"line_number":2440,"context_line":"                               return_value\u003dguest_numa_config):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_5213610e","line":2437,"updated":"2019-07-04 10:32:09.000000000","message":"Maybe a comment about the format of this tuple?","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd18362323859831935ec0652f836c21548fbd36","unresolved":false,"context_lines":[{"line_number":2434,"context_line":"            sched_cpus\u003dset([7, 6]),"},{"line_number":2435,"context_line":"            sched_priority\u003d8)"},{"line_number":2436,"context_line":""},{"line_number":2437,"context_line":"        guest_numa_config \u003d (None, guest_cpu_tune, None, guest_numa_tune)"},{"line_number":2438,"context_line":""},{"line_number":2439,"context_line":"        with mock.patch.object(drvr, \u0027_get_guest_numa_config\u0027,"},{"line_number":2440,"context_line":"                               return_value\u003dguest_numa_config):"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_d7c8a075","line":2437,"in_reply_to":"7faddb67_5213610e","updated":"2019-07-04 12:19:51.000000000","message":"Done","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d9912eee6f3ab093f24134fb897e6268ec90e53","unresolved":false,"context_lines":[{"line_number":2447,"context_line":"    def test_get_dest_numa_config_empty(self, _):"},{"line_number":2448,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"},{"line_number":2449,"context_line":"        with mock.patch.object(drvr, \u0027_get_guest_numa_config\u0027,"},{"line_number":2450,"context_line":"                               return_value\u003d(None, None, None, None)):"},{"line_number":2451,"context_line":"            self.assertEqual("},{"line_number":2452,"context_line":"                drvr.get_dst_numa_config(\u0027fake-instance-numa-topology\u0027,"},{"line_number":2453,"context_line":"                                         \u0027fake-flavor\u0027, \u0027fake-image-meta\u0027),"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_52e121fe","line":2450,"range":{"start_line":2450,"start_character":44,"end_line":2450,"end_character":68},"updated":"2019-07-04 10:32:09.000000000","message":"Maybe drag this out as a \u0027guest_numa_config\u0027 variable just so we have the symmetry with the above function","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd18362323859831935ec0652f836c21548fbd36","unresolved":false,"context_lines":[{"line_number":2447,"context_line":"    def test_get_dest_numa_config_empty(self, _):"},{"line_number":2448,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)"},{"line_number":2449,"context_line":"        with mock.patch.object(drvr, \u0027_get_guest_numa_config\u0027,"},{"line_number":2450,"context_line":"                               return_value\u003d(None, None, None, None)):"},{"line_number":2451,"context_line":"            self.assertEqual("},{"line_number":2452,"context_line":"                drvr.get_dst_numa_config(\u0027fake-instance-numa-topology\u0027,"},{"line_number":2453,"context_line":"                                         \u0027fake-flavor\u0027, \u0027fake-image-meta\u0027),"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_f7c59c5c","line":2450,"range":{"start_line":2450,"start_character":44,"end_line":2450,"end_character":68},"in_reply_to":"7faddb67_52e121fe","updated":"2019-07-04 12:19:51.000000000","message":"Done","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"}],"nova/virt/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"efe6769f2812a0800ce7ab7c523c745f1bc81a17","unresolved":false,"context_lines":[{"line_number":1156,"context_line":"        :param dst_compute_info: Info about the receiving machine"},{"line_number":1157,"context_line":"        :param block_migration: if true, prepare for block migration"},{"line_number":1158,"context_line":"        :param disk_over_commit: if true, allow disk over commit"},{"line_number":1159,"context_line":"        :param instance_numa_topology: the InstanceNUMATopology of the"},{"line_number":1160,"context_line":"                                       instance, as fitted to the destination"},{"line_number":1161,"context_line":"                                       (aka this host)"},{"line_number":1162,"context_line":"        :returns: a LiveMigrateData object (hypervisor-dependent)"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_418c8bd6","line":1159,"range":{"start_line":1159,"start_character":15,"end_line":1159,"end_character":37},"updated":"2019-02-24 22:42:46.000000000","message":"Why can\u0027t we just use instance.numa_topology? Or is that not the \u0027claimed\u0027 numa topology?","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd31e8320f48812c869c5d0d673bf13d7a207421","unresolved":false,"context_lines":[{"line_number":1156,"context_line":"        :param dst_compute_info: Info about the receiving machine"},{"line_number":1157,"context_line":"        :param block_migration: if true, prepare for block migration"},{"line_number":1158,"context_line":"        :param disk_over_commit: if true, allow disk over commit"},{"line_number":1159,"context_line":"        :param instance_numa_topology: the InstanceNUMATopology of the"},{"line_number":1160,"context_line":"                                       instance, as fitted to the destination"},{"line_number":1161,"context_line":"                                       (aka this host)"},{"line_number":1162,"context_line":"        :returns: a LiveMigrateData object (hypervisor-dependent)"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_4817beef","line":1159,"range":{"start_line":1159,"start_character":15,"end_line":1159,"end_character":37},"in_reply_to":"9fdfeff1_418c8bd6","updated":"2019-02-25 17:06:11.000000000","message":"Yeah, the claimed numa topology might be different because of the different fit on the dest.\n\nAnd actually this makes me realize that we\u0027re not actually saving the new instance NUMA topology after the live migration - dropping the claim and the migration context cleans up resources, but I don\u0027t see them updating the instance object anywhere. So I\u0027ll have to add that to the final patch.","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"21d6861d80b97ca3c90cf377fa98ee486d40cb26","unresolved":false,"context_lines":[{"line_number":1144,"context_line":"                                           src_compute_info, dst_compute_info,"},{"line_number":1145,"context_line":"                                           block_migration\u003dFalse,"},{"line_number":1146,"context_line":"                                           disk_over_commit\u003dFalse,"},{"line_number":1147,"context_line":"                                           instance_numa_topology\u003dNone):"},{"line_number":1148,"context_line":"        \"\"\"Check if it is possible to execute live migration."},{"line_number":1149,"context_line":""},{"line_number":1150,"context_line":"        This runs checks on the destination host, and then calls"}],"source_content_type":"text/x-python","patch_set":28,"id":"9fdfeff1_eac1ab4f","line":1147,"updated":"2019-02-26 17:10:48.000000000","message":"I don\u0027t think I see why we need to make this part of the formal interface for everyone here. It matters to libvirt, which is going to use it to make the returned migrate_data.\n\nIn compute manager\u0027s check_can_live_migrate_destination(), we call this check for the driver, and then call straight to the source.\n\nWouldn\u0027t it be cleaner to have the source return the numa_topology (since it\u0027s clearly in the same cell as the instance, and knows about the instance)? Then if we need to call to another check in the driver after receiving the info from the source, we could do that from compute manager, passing the updated migrate_data that the source has augmented, etc.\n\nThat would mean instead of modifying every driver to take this parameter it doesn\u0027t support, we add one new method to the driver base class, which is a no-op for everything that doesn\u0027t need to re-check after the source\u0027s pre-check was completed.","commit_id":"d74dac266f8142e9bae3471cd9f0b1680bb76902"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8391f766b7625aa0bec77655b6f107065dc18f25","unresolved":false,"context_lines":[{"line_number":1144,"context_line":"                                           src_compute_info, dst_compute_info,"},{"line_number":1145,"context_line":"                                           block_migration\u003dFalse,"},{"line_number":1146,"context_line":"                                           disk_over_commit\u003dFalse,"},{"line_number":1147,"context_line":"                                           instance_numa_topology\u003dNone):"},{"line_number":1148,"context_line":"        \"\"\"Check if it is possible to execute live migration."},{"line_number":1149,"context_line":""},{"line_number":1150,"context_line":"        This runs checks on the destination host, and then calls"}],"source_content_type":"text/x-python","patch_set":28,"id":"9fdfeff1_ea268bcb","line":1147,"in_reply_to":"9fdfeff1_2a8573ad","updated":"2019-02-26 17:28:56.000000000","message":"Also, I think that if you can decouple the claim from the destination check, your upgrade problem gets a lot easier. If you wait to claim until after you know if the source is going to do the right thing, you can avoid the error-prone checking in this very first step to determine whether or not you should do a claim which you might not be able to finish. Going to another driver call after the source-side check seems like that would solve several problems to me.","commit_id":"d74dac266f8142e9bae3471cd9f0b1680bb76902"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b6355f508f800fc5d99fcee647b23289ec167289","unresolved":false,"context_lines":[{"line_number":1144,"context_line":"                                           src_compute_info, dst_compute_info,"},{"line_number":1145,"context_line":"                                           block_migration\u003dFalse,"},{"line_number":1146,"context_line":"                                           disk_over_commit\u003dFalse,"},{"line_number":1147,"context_line":"                                           instance_numa_topology\u003dNone):"},{"line_number":1148,"context_line":"        \"\"\"Check if it is possible to execute live migration."},{"line_number":1149,"context_line":""},{"line_number":1150,"context_line":"        This runs checks on the destination host, and then calls"}],"source_content_type":"text/x-python","patch_set":28,"id":"9fdfeff1_d5a7a8a7","line":1147,"in_reply_to":"9fdfeff1_ea268bcb","updated":"2019-02-26 17:50:57.000000000","message":"\u003e Also, I think that if you can decouple the claim from the\n \u003e destination check\n\nI don\u0027t think we can. The claim could fail if the instance doesn\u0027t fit, at which point we need to reject that destination.\n\n \u003e your upgrade problem gets a lot easier. If you\n \u003e wait to claim until after you know if the source is going to do the\n \u003e right thing, you can avoid the error-prone checking in this very\n \u003e first step to determine whether or not you should do a claim which\n \u003e you might not be able to finish. Going to another driver call after\n \u003e the source-side check seems like that would solve several problems\n \u003e to me.","commit_id":"d74dac266f8142e9bae3471cd9f0b1680bb76902"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"744db9aec179cc88f2990e3ba0a3933644da7be4","unresolved":false,"context_lines":[{"line_number":1144,"context_line":"                                           src_compute_info, dst_compute_info,"},{"line_number":1145,"context_line":"                                           block_migration\u003dFalse,"},{"line_number":1146,"context_line":"                                           disk_over_commit\u003dFalse,"},{"line_number":1147,"context_line":"                                           instance_numa_topology\u003dNone):"},{"line_number":1148,"context_line":"        \"\"\"Check if it is possible to execute live migration."},{"line_number":1149,"context_line":""},{"line_number":1150,"context_line":"        This runs checks on the destination host, and then calls"}],"source_content_type":"text/x-python","patch_set":28,"id":"9fdfeff1_2a8573ad","line":1147,"in_reply_to":"9fdfeff1_eac1ab4f","updated":"2019-02-26 17:23:09.000000000","message":"Okay, so numa_topology comes from the claim on the dest I guess, even though it\u0027s entirely calculated from the instance_type (and host state I assume). So I assume you\u0027re doing things in the order you are just because of where the claim is and when you\u0027ve got the numa_topology that came from it. That seems like some unfortunately deep-coupling of multiple services which can be running at different versions, so I think it would be good if we could try to avoid that.","commit_id":"d74dac266f8142e9bae3471cd9f0b1680bb76902"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d9912eee6f3ab093f24134fb897e6268ec90e53","unresolved":false,"context_lines":[{"line_number":1250,"context_line":"                                       the destination by the live migration"},{"line_number":1251,"context_line":"                                       Claim."},{"line_number":1252,"context_line":"        :param flavor: The instance flavor."},{"line_number":1253,"context_line":"        :param image_metada: The instance\u0027s image properties."},{"line_number":1254,"context_line":"        \"\"\""},{"line_number":1255,"context_line":"        raise NotImplementedError()"},{"line_number":1256,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_12e3a907","line":1253,"range":{"start_line":1253,"start_character":25,"end_line":1253,"end_character":27},"updated":"2019-07-04 10:32:09.000000000","message":"x","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd18362323859831935ec0652f836c21548fbd36","unresolved":false,"context_lines":[{"line_number":1250,"context_line":"                                       the destination by the live migration"},{"line_number":1251,"context_line":"                                       Claim."},{"line_number":1252,"context_line":"        :param flavor: The instance flavor."},{"line_number":1253,"context_line":"        :param image_metada: The instance\u0027s image properties."},{"line_number":1254,"context_line":"        \"\"\""},{"line_number":1255,"context_line":"        raise NotImplementedError()"},{"line_number":1256,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_9789c827","line":1253,"range":{"start_line":1253,"start_character":25,"end_line":1253,"end_character":27},"in_reply_to":"7faddb67_12e3a907","updated":"2019-07-04 12:19:51.000000000","message":"Done","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"}],"nova/virt/hyperv/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"efe6769f2812a0800ce7ab7c523c745f1bc81a17","unresolved":false,"context_lines":[{"line_number":275,"context_line":"                                           instance_numa_topology\u003dNone):"},{"line_number":276,"context_line":"        return self._livemigrationops.check_can_live_migrate_destination("},{"line_number":277,"context_line":"            context, instance, src_compute_info, dst_compute_info,"},{"line_number":278,"context_line":"            block_migration, disk_over_commit, instance_numa_topology)"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def cleanup_live_migration_destination_check(self, context,"},{"line_number":281,"context_line":"                                                 dest_check_data):"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_a1b69789","line":278,"range":{"start_line":278,"start_character":47,"end_line":278,"end_character":69},"updated":"2019-02-24 22:42:46.000000000","message":"Just don\u0027t pass this through, it\u0027s not used.","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd31e8320f48812c869c5d0d673bf13d7a207421","unresolved":false,"context_lines":[{"line_number":275,"context_line":"                                           instance_numa_topology\u003dNone):"},{"line_number":276,"context_line":"        return self._livemigrationops.check_can_live_migrate_destination("},{"line_number":277,"context_line":"            context, instance, src_compute_info, dst_compute_info,"},{"line_number":278,"context_line":"            block_migration, disk_over_commit, instance_numa_topology)"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def cleanup_live_migration_destination_check(self, context,"},{"line_number":281,"context_line":"                                                 dest_check_data):"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_681402ea","line":278,"range":{"start_line":278,"start_character":47,"end_line":278,"end_character":69},"in_reply_to":"9fdfeff1_a1b69789","updated":"2019-02-25 17:06:11.000000000","message":"Done","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"}],"nova/virt/hyperv/livemigrationops.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"efe6769f2812a0800ce7ab7c523c745f1bc81a17","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                                           src_compute_info, dst_compute_info,"},{"line_number":130,"context_line":"                                           block_migration\u003dFalse,"},{"line_number":131,"context_line":"                                           disk_over_commit\u003dFalse,"},{"line_number":132,"context_line":"                                           instance_numa_topology\u003dNone):"},{"line_number":133,"context_line":"        LOG.debug(\"check_can_live_migrate_destination called\","},{"line_number":134,"context_line":"                  instance\u003dinstance_ref)"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_01c0c3df","line":132,"range":{"start_line":132,"start_character":43,"end_line":132,"end_character":70},"updated":"2019-02-24 22:42:46.000000000","message":"I would just omit this since it\u0027s not going to be used.","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd31e8320f48812c869c5d0d673bf13d7a207421","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                                           src_compute_info, dst_compute_info,"},{"line_number":130,"context_line":"                                           block_migration\u003dFalse,"},{"line_number":131,"context_line":"                                           disk_over_commit\u003dFalse,"},{"line_number":132,"context_line":"                                           instance_numa_topology\u003dNone):"},{"line_number":133,"context_line":"        LOG.debug(\"check_can_live_migrate_destination called\","},{"line_number":134,"context_line":"                  instance\u003dinstance_ref)"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_e8ab1285","line":132,"range":{"start_line":132,"start_character":43,"end_line":132,"end_character":70},"in_reply_to":"9fdfeff1_01c0c3df","updated":"2019-02-25 17:06:11.000000000","message":"Done","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e07f0fe6654f35d29a6ced98092649cb9777006e","unresolved":false,"context_lines":[{"line_number":6773,"context_line":"            self._host.has_min_version(MIN_LIBVIRT_FILE_BACKED_DISCARD_VERSION,"},{"line_number":6774,"context_line":"                                       MIN_QEMU_FILE_BACKED_DISCARD_VERSION))"},{"line_number":6775,"context_line":"        if instance_numa_topology:"},{"line_number":6776,"context_line":"            data.dst_numa_config \u003d \\"},{"line_number":6777,"context_line":"                self._get_dst_numa_config(instance_numa_topology,"},{"line_number":6778,"context_line":"                                          instance.flavor,"},{"line_number":6779,"context_line":"                                          instance.image_meta)"},{"line_number":6780,"context_line":"        return data"},{"line_number":6781,"context_line":""},{"line_number":6782,"context_line":"    def _get_dst_numa_config(self, instance_numa_topology, flavor, image_meta):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_f79d820a","line":6779,"range":{"start_line":6776,"start_character":11,"end_line":6779,"end_character":62},"updated":"2019-02-06 20:32:36.000000000","message":"nit:\n we usually prefer () over \\\ne.g.\ndata.dst_numa_config \u003d (\n    self._get_dst_numa_config(instance_numa_topology,\n        instance.flavor, instance.image_meta))","commit_id":"f114ea2a8b4c0052ac67399c2a452b6bf86a697b"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"c262dd385eddea467d473e5e2d4b432eac56b061","unresolved":false,"context_lines":[{"line_number":6773,"context_line":"            self._host.has_min_version(MIN_LIBVIRT_FILE_BACKED_DISCARD_VERSION,"},{"line_number":6774,"context_line":"                                       MIN_QEMU_FILE_BACKED_DISCARD_VERSION))"},{"line_number":6775,"context_line":"        if instance_numa_topology:"},{"line_number":6776,"context_line":"            data.dst_numa_config \u003d \\"},{"line_number":6777,"context_line":"                self._get_dst_numa_config(instance_numa_topology,"},{"line_number":6778,"context_line":"                                          instance.flavor,"},{"line_number":6779,"context_line":"                                          instance.image_meta)"},{"line_number":6780,"context_line":"        return data"},{"line_number":6781,"context_line":""},{"line_number":6782,"context_line":"    def _get_dst_numa_config(self, instance_numa_topology, flavor, image_meta):"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fdfeff1_5a490e5e","line":6779,"range":{"start_line":6776,"start_character":11,"end_line":6779,"end_character":62},"in_reply_to":"9fdfeff1_f79d820a","updated":"2019-02-07 00:18:55.000000000","message":"I\u0027d change it, but literally 5 lines above there\u0027s a \\, so I\u0027d rather remain consistent.","commit_id":"f114ea2a8b4c0052ac67399c2a452b6bf86a697b"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"95c2a07c0d57916bf4f371e4630574333f009673","unresolved":false,"context_lines":[{"line_number":6778,"context_line":"        data.file_backed_memory_discard \u003d (CONF.libvirt.file_backed_memory and"},{"line_number":6779,"context_line":"            self._host.has_min_version(MIN_LIBVIRT_FILE_BACKED_DISCARD_VERSION,"},{"line_number":6780,"context_line":"                                       MIN_QEMU_FILE_BACKED_DISCARD_VERSION))"},{"line_number":6781,"context_line":"        if instance_numa_topology:"},{"line_number":6782,"context_line":"            data.dst_numa_config \u003d \\"},{"line_number":6783,"context_line":"                self._get_dst_numa_config(instance_numa_topology,"},{"line_number":6784,"context_line":"                                          instance.flavor,"},{"line_number":6785,"context_line":"                                          instance.image_meta)"},{"line_number":6786,"context_line":"        return data"},{"line_number":6787,"context_line":""},{"line_number":6788,"context_line":"    def _get_dst_numa_config(self, instance_numa_topology, flavor, image_meta):"},{"line_number":6789,"context_line":"        config \u003d objects.NUMAMigrateData(cpu_pins\u003d[], emulator_pins\u003dNone,"},{"line_number":6790,"context_line":"                                         cell_pins\u003d[])"},{"line_number":6791,"context_line":"        allowed_cpus \u003d hardware.get_vcpu_pin_set()"},{"line_number":6792,"context_line":"        cpu_set, guest_cpu_tune, guest_cpu_numa, guest_numa_tune \u003d \\"},{"line_number":6793,"context_line":"            self._get_guest_numa_config(instance_numa_topology, flavor,"},{"line_number":6794,"context_line":"                                        allowed_cpus, image_meta)"},{"line_number":6795,"context_line":"        if guest_cpu_tune:"},{"line_number":6796,"context_line":"            for pin in guest_cpu_tune.vcpupin:"},{"line_number":6797,"context_line":"                config.cpu_pins.append(objects.PinMapping("},{"line_number":6798,"context_line":"                    guest_id\u003dint(pin.id), host_ids\u003dpin.cpuset))"},{"line_number":6799,"context_line":""},{"line_number":6800,"context_line":"            config.emulator_pins \u003d hardware.parse_cpu_spec("},{"line_number":6801,"context_line":"                guest_cpu_tune.emulatorpin.cpuset)"},{"line_number":6802,"context_line":""},{"line_number":6803,"context_line":"        if guest_numa_tune:"},{"line_number":6804,"context_line":"            for node in guest_numa_tune.memnodes:"},{"line_number":6805,"context_line":"                config.cell_pins.append(objects.PinMapping("},{"line_number":6806,"context_line":"                    guest_id\u003dnode.cellid, host_ids\u003dnode.nodeset))"},{"line_number":6807,"context_line":""},{"line_number":6808,"context_line":"        return config"},{"line_number":6809,"context_line":""},{"line_number":6810,"context_line":"    def cleanup_live_migration_destination_check(self, context,"},{"line_number":6811,"context_line":"                                                 dest_check_data):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_60c5173c","line":6808,"range":{"start_line":6781,"start_character":7,"end_line":6808,"end_character":21},"updated":"2019-02-10 16:10:07.000000000","message":"no of this should be requried.\nyou can generate this on the souce node form the object introduced in https://review.openstack.org/#/c/634827/9","commit_id":"351a4bd2922046e541465dff1527fa4148385a9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"4646626b55b0d58747767cb21426a396ce54ab0d","unresolved":false,"context_lines":[{"line_number":6805,"context_line":"                config.cell_pins.append(objects.PinMapping("},{"line_number":6806,"context_line":"                    guest_id\u003dnode.cellid, host_ids\u003dnode.nodeset))"},{"line_number":6807,"context_line":""},{"line_number":6808,"context_line":"        return config"},{"line_number":6809,"context_line":""},{"line_number":6810,"context_line":"    def cleanup_live_migration_destination_check(self, context,"},{"line_number":6811,"context_line":"                                                 dest_check_data):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_e06ca709","line":6808,"in_reply_to":"9fdfeff1_40657344","updated":"2019-02-10 18:31:42.000000000","message":"I\u0027m doing this on the go on my phone, so not the best way of thinking about this, but I believe I understand what you mean for everything except emulator threads. For those, if the policy is \u0027share\u0027, we need the destination\u0027s cpu_shared_set config option, which isn\u0027t stored in InstanceNUMACell. So maybe we don\u0027t need to go through the whole _get_numa_config() on the dest, but we need a way of communicating shared emulator threads pinning from the dest to the source. I suppose we could just call _get_emulatorpin_cpuset but itself, and send the result of that to the source. But I\u0027m lazily wondering if it\u0027s not simpler from the human pov to just call the whole _get_guest_numa_config...","commit_id":"351a4bd2922046e541465dff1527fa4148385a9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a32f22826fa852ad8aeb01b19c21ae84008d05ea","unresolved":false,"context_lines":[{"line_number":6805,"context_line":"                config.cell_pins.append(objects.PinMapping("},{"line_number":6806,"context_line":"                    guest_id\u003dnode.cellid, host_ids\u003dnode.nodeset))"},{"line_number":6807,"context_line":""},{"line_number":6808,"context_line":"        return config"},{"line_number":6809,"context_line":""},{"line_number":6810,"context_line":"    def cleanup_live_migration_destination_check(self, context,"},{"line_number":6811,"context_line":"                                                 dest_check_data):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_e0e6e7e8","line":6808,"in_reply_to":"9fdfeff1_60c5173c","updated":"2019-02-10 16:13:21.000000000","message":"But how do we know what to put in those objects? Don\u0027t we need to generate the XML on the dest to know the host pins?","commit_id":"351a4bd2922046e541465dff1527fa4148385a9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"679b1b586252c6e4b687042c0d2b1795221531f5","unresolved":false,"context_lines":[{"line_number":6805,"context_line":"                config.cell_pins.append(objects.PinMapping("},{"line_number":6806,"context_line":"                    guest_id\u003dnode.cellid, host_ids\u003dnode.nodeset))"},{"line_number":6807,"context_line":""},{"line_number":6808,"context_line":"        return config"},{"line_number":6809,"context_line":""},{"line_number":6810,"context_line":"    def cleanup_live_migration_destination_check(self, context,"},{"line_number":6811,"context_line":"                                                 dest_check_data):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_3bd5fe43","line":6808,"in_reply_to":"9fdfeff1_7b8ce67e","updated":"2019-02-10 20:29:27.000000000","message":"\u003e can you maybe just leave a not that we should possibly optimise/clean this up later.\n \u003e \n \u003e its a little wastful to generate all the libvirt config object but it might be the best thing to do in the short term.\n\nI\u0027ll fix the commit message and leave a TODO in the code. I\u0027m definitely happy leaving the optimization for later :)","commit_id":"351a4bd2922046e541465dff1527fa4148385a9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"679b1b586252c6e4b687042c0d2b1795221531f5","unresolved":false,"context_lines":[{"line_number":6805,"context_line":"                config.cell_pins.append(objects.PinMapping("},{"line_number":6806,"context_line":"                    guest_id\u003dnode.cellid, host_ids\u003dnode.nodeset))"},{"line_number":6807,"context_line":""},{"line_number":6808,"context_line":"        return config"},{"line_number":6809,"context_line":""},{"line_number":6810,"context_line":"    def cleanup_live_migration_destination_check(self, context,"},{"line_number":6811,"context_line":"                                                 dest_check_data):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_1bd27a5d","line":6808,"in_reply_to":"9fdfeff1_7b8ce67e","updated":"2019-02-10 20:29:27.000000000","message":"\u003e i had assumed that cell.cpuset_reserved whould have been populated with that value. but if its not ok.\n\nlooking at _get_emulatorpin_cpuset() it\u0027s only using cpuset_reserved of the policy is isolate, is the policy is share then it looks at the cpu_shared_set config option.","commit_id":"351a4bd2922046e541465dff1527fa4148385a9c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d231226d2f3e157396b074163047fef3a89f58c7","unresolved":false,"context_lines":[{"line_number":6805,"context_line":"                config.cell_pins.append(objects.PinMapping("},{"line_number":6806,"context_line":"                    guest_id\u003dnode.cellid, host_ids\u003dnode.nodeset))"},{"line_number":6807,"context_line":""},{"line_number":6808,"context_line":"        return config"},{"line_number":6809,"context_line":""},{"line_number":6810,"context_line":"    def cleanup_live_migration_destination_check(self, context,"},{"line_number":6811,"context_line":"                                                 dest_check_data):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_7b8ce67e","line":6808,"in_reply_to":"9fdfeff1_e06ca709","updated":"2019-02-10 20:22:42.000000000","message":"i had assumed that cell.cpuset_reserved whould have been populated with that value. but if its not ok.\n\ni think this is just highlighting that the datamodel is imcomplete and we whave too tightly coupled the driver code to the xml generation.\n\ncan you maybe just leave a not that we should possibly optimise/clean this up later.\n\nits a little wastful to generate all the libvirt config object but it might be the best thing to do in the short term.\n\nat least you are not rendering those object into xml and then parsing the xml to extract the values you need so its not as expencive as the commit message implied.","commit_id":"351a4bd2922046e541465dff1527fa4148385a9c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"75ef37bc8f28f1659f46636df65a535134e80940","unresolved":false,"context_lines":[{"line_number":6805,"context_line":"                config.cell_pins.append(objects.PinMapping("},{"line_number":6806,"context_line":"                    guest_id\u003dnode.cellid, host_ids\u003dnode.nodeset))"},{"line_number":6807,"context_line":""},{"line_number":6808,"context_line":"        return config"},{"line_number":6809,"context_line":""},{"line_number":6810,"context_line":"    def cleanup_live_migration_destination_check(self, context,"},{"line_number":6811,"context_line":"                                                 dest_check_data):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_80435baf","line":6808,"in_reply_to":"9fdfeff1_e0e6e7e8","updated":"2019-02-10 16:25:42.000000000","message":"OK, so there\u0027s cpu_pinning_raw in InstanceNUMACell, but is that enough? That doesn\u0027t cover emulator threads, or NUMA node pins, right?","commit_id":"351a4bd2922046e541465dff1527fa4148385a9c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c962affe10f03ef6494b8e6ccf465db3979a55dd","unresolved":false,"context_lines":[{"line_number":6805,"context_line":"                config.cell_pins.append(objects.PinMapping("},{"line_number":6806,"context_line":"                    guest_id\u003dnode.cellid, host_ids\u003dnode.nodeset))"},{"line_number":6807,"context_line":""},{"line_number":6808,"context_line":"        return config"},{"line_number":6809,"context_line":""},{"line_number":6810,"context_line":"    def cleanup_live_migration_destination_check(self, context,"},{"line_number":6811,"context_line":"                                                 dest_check_data):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_40657344","line":6808,"in_reply_to":"9fdfeff1_e0e6e7e8","updated":"2019-02-10 17:29:31.000000000","message":"the instance numa toplogy object already has all of the info you need.\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/instance_numa_topology.py#L135\n\nspecifically it is all stored in the nested InstanceNUMACell objects\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/instance_numa_topology.py#L47-L60\n\nso i think you can calulate the three values with the following\n\ncell_pins \u003d { guest_id : cell.id for guest_id, cell in enumerate(instance_numa_toplogy.cells)}\n\ncpu_pins \u003d reduce(lambda d, cell: d.update(cell.cpu_pinning) or d, instance_numa_topology.cells, dict())\n\nemulator_pins \u003d reduce(lambda d, cell: d.update(cell.cpuset_reserved) or d, instance_numa_topology.cells, set()) or reduce(lambda d, cell: d.update(cell.pinning.values()) or d,instance_numa_topology.cells , set())\n\n\nso there should be no need to generate all the libvirt objects then iterate over them.","commit_id":"351a4bd2922046e541465dff1527fa4148385a9c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"e36ea74560ef337d04259f49185e751a5e63dda2","unresolved":false,"context_lines":[{"line_number":6780,"context_line":"            for node in guest_numa_tune.memnodes:"},{"line_number":6781,"context_line":"                config.cell_pins.append(objects.PinMapping("},{"line_number":6782,"context_line":"                    guest_id\u003dnode.cellid, host_ids\u003dset(node.nodeset)))"},{"line_number":6783,"context_line":""},{"line_number":6784,"context_line":"        LOG.debug(\u0027Built NUMA live migration data: %s\u0027, config)"},{"line_number":6785,"context_line":"        return config"},{"line_number":6786,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"9fdfeff1_9535d6dd","line":6783,"updated":"2019-02-23 06:14:12.000000000","message":"So there is pre-node configuration \u0027CONF.libvirt.realtime_scheduler_priority\u0027 for real time, https://github.com/openstack/nova/blob/master/nova/virt/libvirt/driver.py#L4504\n\n I\u0027not sure whether there is a real usecase people really set a different value for this config option. So I ask this question at here.\n\nI guess Stephen or Sean can help answer this question.\n\nIf there is case people have different value for this on different host, we probably should bring that value from dest to here. If that isn\u0027t a real usecase, then let us ignore this.","commit_id":"fb35706d52f313220a0a6380a411dc76e99f78c9"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"34fbc5a9915ff389d0d1bbd454ef8b98eee3b072","unresolved":false,"context_lines":[{"line_number":6780,"context_line":"            for node in guest_numa_tune.memnodes:"},{"line_number":6781,"context_line":"                config.cell_pins.append(objects.PinMapping("},{"line_number":6782,"context_line":"                    guest_id\u003dnode.cellid, host_ids\u003dset(node.nodeset)))"},{"line_number":6783,"context_line":""},{"line_number":6784,"context_line":"        LOG.debug(\u0027Built NUMA live migration data: %s\u0027, config)"},{"line_number":6785,"context_line":"        return config"},{"line_number":6786,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"9fdfeff1_4146b952","line":6783,"in_reply_to":"9fdfeff1_9535d6dd","updated":"2019-02-25 18:34:43.000000000","message":"Talked about this on IRC, probably a good idea to include this - although besides unit tests I have no way of testing this. Added to the patch below this one, this one, and the one above.","commit_id":"fb35706d52f313220a0a6380a411dc76e99f78c9"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"efe6769f2812a0800ce7ab7c523c745f1bc81a17","unresolved":false,"context_lines":[{"line_number":6728,"context_line":"                                       MIN_QEMU_FILE_BACKED_DISCARD_VERSION))"},{"line_number":6729,"context_line":"        if instance_numa_topology:"},{"line_number":6730,"context_line":"            data.dst_numa_config \u003d \\"},{"line_number":6731,"context_line":"                self._get_dst_numa_config(instance_numa_topology,"},{"line_number":6732,"context_line":"                                          instance.flavor,"},{"line_number":6733,"context_line":"                                          instance.image_meta)"},{"line_number":6734,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_61b0af8c","line":6731,"updated":"2019-02-24 22:42:46.000000000","message":"You don\u0027t have any unit test to see that this method is actually called when instance_numa_topology is supplied.","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd31e8320f48812c869c5d0d673bf13d7a207421","unresolved":false,"context_lines":[{"line_number":6728,"context_line":"                                       MIN_QEMU_FILE_BACKED_DISCARD_VERSION))"},{"line_number":6729,"context_line":"        if instance_numa_topology:"},{"line_number":6730,"context_line":"            data.dst_numa_config \u003d \\"},{"line_number":6731,"context_line":"                self._get_dst_numa_config(instance_numa_topology,"},{"line_number":6732,"context_line":"                                          instance.flavor,"},{"line_number":6733,"context_line":"                                          instance.image_meta)"},{"line_number":6734,"context_line":"        return data"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_68ec02bb","line":6731,"in_reply_to":"9fdfeff1_61b0af8c","updated":"2019-02-25 17:06:11.000000000","message":"Done","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"efe6769f2812a0800ce7ab7c523c745f1bc81a17","unresolved":false,"context_lines":[{"line_number":6756,"context_line":"        cpu_set, guest_cpu_tune, guest_cpu_numa, guest_numa_tune \u003d \\"},{"line_number":6757,"context_line":"            self._get_guest_numa_config(instance_numa_topology, flavor,"},{"line_number":6758,"context_line":"                                        allowed_cpus, image_meta)"},{"line_number":6759,"context_line":"        LOG.debug(\u0027Guest NUMA config is: %s, %s, %s, %s\u0027,"},{"line_number":6760,"context_line":"                  cpu_set, guest_cpu_tune, guest_cpu_numa, guest_numa_tune)"},{"line_number":6761,"context_line":"        if guest_cpu_tune:"},{"line_number":6762,"context_line":"            for pin in guest_cpu_tune.vcpupin:"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_0165231d","line":6759,"range":{"start_line":6759,"start_character":41,"end_line":6759,"end_character":55},"updated":"2019-02-24 22:42:46.000000000","message":"nit: put something in this message for what the variables are otherwise this is going to be confusing unless you know what the code is, so something like:\n\nLOG.debug(\u0027Guest NUMA config is: cpu_set\u003d%s, guest_cpu_tune\u003d%s, guest_cpu_numa\u003d%s, guest_numa_tune\u003d%s\u0027,","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd31e8320f48812c869c5d0d673bf13d7a207421","unresolved":false,"context_lines":[{"line_number":6756,"context_line":"        cpu_set, guest_cpu_tune, guest_cpu_numa, guest_numa_tune \u003d \\"},{"line_number":6757,"context_line":"            self._get_guest_numa_config(instance_numa_topology, flavor,"},{"line_number":6758,"context_line":"                                        allowed_cpus, image_meta)"},{"line_number":6759,"context_line":"        LOG.debug(\u0027Guest NUMA config is: %s, %s, %s, %s\u0027,"},{"line_number":6760,"context_line":"                  cpu_set, guest_cpu_tune, guest_cpu_numa, guest_numa_tune)"},{"line_number":6761,"context_line":"        if guest_cpu_tune:"},{"line_number":6762,"context_line":"            for pin in guest_cpu_tune.vcpupin:"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_48a81e77","line":6759,"range":{"start_line":6759,"start_character":41,"end_line":6759,"end_character":55},"in_reply_to":"9fdfeff1_0165231d","updated":"2019-02-25 17:06:11.000000000","message":"Done","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"21d6861d80b97ca3c90cf377fa98ee486d40cb26","unresolved":false,"context_lines":[{"line_number":6669,"context_line":"        :param disk_over_commit: if true, allow disk over commit"},{"line_number":6670,"context_line":"        :param instance_numa_topology: the InstanceNUMATopology of the instance"},{"line_number":6671,"context_line":"                                       as fitted to the destination (aka this"},{"line_number":6672,"context_line":"                                       host)"},{"line_number":6673,"context_line":"        :returns: a LibvirtLiveMigrateData object"},{"line_number":6674,"context_line":"        \"\"\""},{"line_number":6675,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"9fdfeff1_0a7d0f1b","line":6672,"updated":"2019-02-26 17:10:48.000000000","message":"Do you mean the source? I\u0027m not sure why we need to pass the numa  config of the destination to the destination so it can return ... the proposed numa config for the destination. I guess if I push further in the set, I\u0027ll see where this actually gets passed, but still.\n\nIsn\u0027t this the numa topology that was specified at boot (plus maybe current fitting info on the source), that the destination uses to figure out what the fitting will look like once it moves there?","commit_id":"d74dac266f8142e9bae3471cd9f0b1680bb76902"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b6355f508f800fc5d99fcee647b23289ec167289","unresolved":false,"context_lines":[{"line_number":6669,"context_line":"        :param disk_over_commit: if true, allow disk over commit"},{"line_number":6670,"context_line":"        :param instance_numa_topology: the InstanceNUMATopology of the instance"},{"line_number":6671,"context_line":"                                       as fitted to the destination (aka this"},{"line_number":6672,"context_line":"                                       host)"},{"line_number":6673,"context_line":"        :returns: a LibvirtLiveMigrateData object"},{"line_number":6674,"context_line":"        \"\"\""},{"line_number":6675,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"9fdfeff1_75ab5c87","line":6672,"in_reply_to":"9fdfeff1_0a7d0f1b","updated":"2019-02-26 17:50:57.000000000","message":"It\u0027s passed from the claim and indicates how the claim has fitted the instance to the destination. This is different from how the instance is currently fitted onto the source.\n\nThis is why the claim needs to happen before we call  driver.check_can_live_migrate_at_destination. driver.cclmad() needs the new fit to call _get_guest_numa_config(), generate the new XML config objects, and put the relevant bits into migrate_data.\n\nAs far as I can see there\u0027s no other opportunity for the destination driver to do this.","commit_id":"d74dac266f8142e9bae3471cd9f0b1680bb76902"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d9912eee6f3ab093f24134fb897e6268ec90e53","unresolved":false,"context_lines":[{"line_number":6741,"context_line":"                                       the destination by the live migration"},{"line_number":6742,"context_line":"                                       Claim."},{"line_number":6743,"context_line":"        :param flavor: The instance flavor."},{"line_number":6744,"context_line":"        :param image_metada: The instance\u0027s image properties."},{"line_number":6745,"context_line":"        \"\"\""},{"line_number":6746,"context_line":"        LOG.debug(\u0027Building NUMA live migration data\u0027)"},{"line_number":6747,"context_line":"        config \u003d objects.NUMAMigrateData(cpu_pins\u003d[], emulator_pins\u003dNone,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9fdfeff1_5e91229a","line":6744,"range":{"start_line":6744,"start_character":15,"end_line":6744,"end_character":27},"updated":"2019-07-04 10:32:09.000000000","message":"image_meta","commit_id":"ffaae307349100214a6578e2db53481263185846"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd18362323859831935ec0652f836c21548fbd36","unresolved":false,"context_lines":[{"line_number":6741,"context_line":"                                       the destination by the live migration"},{"line_number":6742,"context_line":"                                       Claim."},{"line_number":6743,"context_line":"        :param flavor: The instance flavor."},{"line_number":6744,"context_line":"        :param image_metada: The instance\u0027s image properties."},{"line_number":6745,"context_line":"        \"\"\""},{"line_number":6746,"context_line":"        LOG.debug(\u0027Building NUMA live migration data\u0027)"},{"line_number":6747,"context_line":"        config \u003d objects.NUMAMigrateData(cpu_pins\u003d[], emulator_pins\u003dNone,"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_7788cc1e","line":6744,"range":{"start_line":6744,"start_character":15,"end_line":6744,"end_character":27},"in_reply_to":"9fdfeff1_5e91229a","updated":"2019-07-04 12:19:51.000000000","message":"Done","commit_id":"ffaae307349100214a6578e2db53481263185846"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d9912eee6f3ab093f24134fb897e6268ec90e53","unresolved":false,"context_lines":[{"line_number":6742,"context_line":"                                       Claim."},{"line_number":6743,"context_line":"        :param flavor: The instance flavor."},{"line_number":6744,"context_line":"        :param image_metada: The instance\u0027s image properties."},{"line_number":6745,"context_line":"        \"\"\""},{"line_number":6746,"context_line":"        LOG.debug(\u0027Building NUMA live migration data\u0027)"},{"line_number":6747,"context_line":"        config \u003d objects.NUMAMigrateData(cpu_pins\u003d[], emulator_pins\u003dNone,"},{"line_number":6748,"context_line":"                                         cell_pins\u003d[], sched_vcpus\u003dNone,"}],"source_content_type":"text/x-python","patch_set":32,"id":"9fdfeff1_bee5ae40","line":6745,"updated":"2019-07-04 10:32:09.000000000","message":":return: ?","commit_id":"ffaae307349100214a6578e2db53481263185846"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd18362323859831935ec0652f836c21548fbd36","unresolved":false,"context_lines":[{"line_number":6742,"context_line":"                                       Claim."},{"line_number":6743,"context_line":"        :param flavor: The instance flavor."},{"line_number":6744,"context_line":"        :param image_metada: The instance\u0027s image properties."},{"line_number":6745,"context_line":"        \"\"\""},{"line_number":6746,"context_line":"        LOG.debug(\u0027Building NUMA live migration data\u0027)"},{"line_number":6747,"context_line":"        config \u003d objects.NUMAMigrateData(cpu_pins\u003d[], emulator_pins\u003dNone,"},{"line_number":6748,"context_line":"                                         cell_pins\u003d[], sched_vcpus\u003dNone,"}],"source_content_type":"text/x-python","patch_set":32,"id":"7faddb67_57983069","line":6745,"in_reply_to":"9fdfeff1_bee5ae40","updated":"2019-07-04 12:19:51.000000000","message":"Done","commit_id":"ffaae307349100214a6578e2db53481263185846"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d9912eee6f3ab093f24134fb897e6268ec90e53","unresolved":false,"context_lines":[{"line_number":7299,"context_line":"        data.file_backed_memory_discard \u003d (CONF.libvirt.file_backed_memory and"},{"line_number":7300,"context_line":"            self._host.has_min_version(MIN_LIBVIRT_FILE_BACKED_DISCARD_VERSION,"},{"line_number":7301,"context_line":"                                       MIN_QEMU_FILE_BACKED_DISCARD_VERSION))"},{"line_number":7302,"context_line":"        return data"},{"line_number":7303,"context_line":""},{"line_number":7304,"context_line":"    def get_dst_numa_config(self, instance_numa_topology, flavor, image_meta):"},{"line_number":7305,"context_line":"        \"\"\"Builds a NUMAMigrateData object to send to the source of a live"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_12cc0988","line":7302,"updated":"2019-07-04 10:32:09.000000000","message":"Unrelated and unwanted change (the line drop)","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd18362323859831935ec0652f836c21548fbd36","unresolved":false,"context_lines":[{"line_number":7299,"context_line":"        data.file_backed_memory_discard \u003d (CONF.libvirt.file_backed_memory and"},{"line_number":7300,"context_line":"            self._host.has_min_version(MIN_LIBVIRT_FILE_BACKED_DISCARD_VERSION,"},{"line_number":7301,"context_line":"                                       MIN_QEMU_FILE_BACKED_DISCARD_VERSION))"},{"line_number":7302,"context_line":"        return data"},{"line_number":7303,"context_line":""},{"line_number":7304,"context_line":"    def get_dst_numa_config(self, instance_numa_topology, flavor, image_meta):"},{"line_number":7305,"context_line":"        \"\"\"Builds a NUMAMigrateData object to send to the source of a live"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_97b788d9","line":7302,"in_reply_to":"7faddb67_12cc0988","updated":"2019-07-04 12:19:51.000000000","message":"Done","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3d9912eee6f3ab093f24134fb897e6268ec90e53","unresolved":false,"context_lines":[{"line_number":7306,"context_line":"        migration, containing information about how the instance is to be"},{"line_number":7307,"context_line":"        pinned on the destination host."},{"line_number":7308,"context_line":""},{"line_number":7309,"context_line":"        TODO(artom) This should be optimized away. We should decouple the"},{"line_number":7310,"context_line":"        XML-related bits from the business logic, and obtain everything we need"},{"line_number":7311,"context_line":"        from InstanceNUMATopology, which is already included in the live"},{"line_number":7312,"context_line":"        migration Claim."},{"line_number":7313,"context_line":""},{"line_number":7314,"context_line":"        :param instance_numa_topology: The InstanceNUMATopology as fitted to"},{"line_number":7315,"context_line":"                                       the destination by the live migration"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_72bbfde4","line":7312,"range":{"start_line":7309,"start_character":0,"end_line":7312,"end_character":24},"updated":"2019-07-04 10:32:09.000000000","message":"This doesn\u0027t feel very actionable. Why are we doing any of this if it\u0027s that easy?","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd18362323859831935ec0652f836c21548fbd36","unresolved":false,"context_lines":[{"line_number":7306,"context_line":"        migration, containing information about how the instance is to be"},{"line_number":7307,"context_line":"        pinned on the destination host."},{"line_number":7308,"context_line":""},{"line_number":7309,"context_line":"        TODO(artom) This should be optimized away. We should decouple the"},{"line_number":7310,"context_line":"        XML-related bits from the business logic, and obtain everything we need"},{"line_number":7311,"context_line":"        from InstanceNUMATopology, which is already included in the live"},{"line_number":7312,"context_line":"        migration Claim."},{"line_number":7313,"context_line":""},{"line_number":7314,"context_line":"        :param instance_numa_topology: The InstanceNUMATopology as fitted to"},{"line_number":7315,"context_line":"                                       the destination by the live migration"}],"source_content_type":"text/x-python","patch_set":34,"id":"7faddb67_f7c11c30","line":7312,"range":{"start_line":7309,"start_character":0,"end_line":7312,"end_character":24},"in_reply_to":"7faddb67_72bbfde4","updated":"2019-07-04 12:19:51.000000000","message":"I think someone asked for this? I agree, it\u0027s not going to get done in 1 cycle (or 2, or perhaps even 3).","commit_id":"5af8fe8f7d5eab7ef0d5f4e120b15c9fc63e17e0"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d6279e3a68e02a5ddbca76ff7dd5a17e524ca74b","unresolved":false,"context_lines":[{"line_number":7337,"context_line":"                  the XML for the destination host."},{"line_number":7338,"context_line":"        \"\"\""},{"line_number":7339,"context_line":"        LOG.debug(\u0027Building NUMA live migration data\u0027)"},{"line_number":7340,"context_line":"        config \u003d objects.LibvirtLiveMigrateNUMAInfo("},{"line_number":7341,"context_line":"            cpu_pins\u003d{}, emulator_pins\u003dNone, cell_pins\u003d{}, sched_vcpus\u003dNone,"},{"line_number":7342,"context_line":"            sched_priority\u003dNone)"},{"line_number":7343,"context_line":"        allowed_cpus \u003d hardware.get_vcpu_pin_set()"}],"source_content_type":"text/x-python","patch_set":44,"id":"7faddb67_f5adfbe9","line":7340,"range":{"start_line":7340,"start_character":8,"end_line":7340,"end_character":14},"updated":"2019-08-16 18:02:25.000000000","message":"This seems like a strange name for what this actually is. For that matter, so is the name of this method.","commit_id":"2d3842fda7fa07d7a289999b910e3c709b6285f5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"8b5090678e5f5515950699396416f762a86d2107","unresolved":false,"context_lines":[{"line_number":7337,"context_line":"                  the XML for the destination host."},{"line_number":7338,"context_line":"        \"\"\""},{"line_number":7339,"context_line":"        LOG.debug(\u0027Building NUMA live migration data\u0027)"},{"line_number":7340,"context_line":"        config \u003d objects.LibvirtLiveMigrateNUMAInfo("},{"line_number":7341,"context_line":"            cpu_pins\u003d{}, emulator_pins\u003dNone, cell_pins\u003d{}, sched_vcpus\u003dNone,"},{"line_number":7342,"context_line":"            sched_priority\u003dNone)"},{"line_number":7343,"context_line":"        allowed_cpus \u003d hardware.get_vcpu_pin_set()"}],"source_content_type":"text/x-python","patch_set":44,"id":"7faddb67_b269758d","line":7340,"range":{"start_line":7340,"start_character":8,"end_line":7340,"end_character":14},"in_reply_to":"7faddb67_f5adfbe9","updated":"2019-08-22 20:41:10.000000000","message":"Err, yeah. It may have made more sense with LibvirtLiveMigrateNUMAInfo\u0027s previous name.\n\nAnd I\u0027ll probably rename the dst_numa_config field in the previous patch as well.","commit_id":"2d3842fda7fa07d7a289999b910e3c709b6285f5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d6279e3a68e02a5ddbca76ff7dd5a17e524ca74b","unresolved":false,"context_lines":[{"line_number":7360,"context_line":"            config.emulator_pins \u003d guest_cpu_tune.emulatorpin.cpuset"},{"line_number":7361,"context_line":""},{"line_number":7362,"context_line":"            if guest_cpu_tune.vcpusched:"},{"line_number":7363,"context_line":"                # NOTE(artom) vcpushed is a list, but there\u0027s only ever 1"},{"line_number":7364,"context_line":"                # element in it (see _get_guest_numa_config under"},{"line_number":7365,"context_line":"                # wants_realtime)"},{"line_number":7366,"context_line":"                config.sched_vcpus \u003d guest_cpu_tune.vcpusched[0].vcpus"}],"source_content_type":"text/x-python","patch_set":44,"id":"7faddb67_d5b0ff42","line":7363,"range":{"start_line":7363,"start_character":72,"end_line":7363,"end_character":73},"updated":"2019-08-16 18:02:25.000000000","message":"one","commit_id":"2d3842fda7fa07d7a289999b910e3c709b6285f5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d6279e3a68e02a5ddbca76ff7dd5a17e524ca74b","unresolved":false,"context_lines":[{"line_number":7360,"context_line":"            config.emulator_pins \u003d guest_cpu_tune.emulatorpin.cpuset"},{"line_number":7361,"context_line":""},{"line_number":7362,"context_line":"            if guest_cpu_tune.vcpusched:"},{"line_number":7363,"context_line":"                # NOTE(artom) vcpushed is a list, but there\u0027s only ever 1"},{"line_number":7364,"context_line":"                # element in it (see _get_guest_numa_config under"},{"line_number":7365,"context_line":"                # wants_realtime)"},{"line_number":7366,"context_line":"                config.sched_vcpus \u003d guest_cpu_tune.vcpusched[0].vcpus"}],"source_content_type":"text/x-python","patch_set":44,"id":"7faddb67_15abf7d5","line":7363,"range":{"start_line":7363,"start_character":30,"end_line":7363,"end_character":38},"updated":"2019-08-16 18:02:25.000000000","message":"vcpusched","commit_id":"2d3842fda7fa07d7a289999b910e3c709b6285f5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"8b5090678e5f5515950699396416f762a86d2107","unresolved":false,"context_lines":[{"line_number":7360,"context_line":"            config.emulator_pins \u003d guest_cpu_tune.emulatorpin.cpuset"},{"line_number":7361,"context_line":""},{"line_number":7362,"context_line":"            if guest_cpu_tune.vcpusched:"},{"line_number":7363,"context_line":"                # NOTE(artom) vcpushed is a list, but there\u0027s only ever 1"},{"line_number":7364,"context_line":"                # element in it (see _get_guest_numa_config under"},{"line_number":7365,"context_line":"                # wants_realtime)"},{"line_number":7366,"context_line":"                config.sched_vcpus \u003d guest_cpu_tune.vcpusched[0].vcpus"}],"source_content_type":"text/x-python","patch_set":44,"id":"7faddb67_12bf29fd","line":7363,"range":{"start_line":7363,"start_character":30,"end_line":7363,"end_character":38},"in_reply_to":"7faddb67_15abf7d5","updated":"2019-08-22 20:41:10.000000000","message":"Done","commit_id":"2d3842fda7fa07d7a289999b910e3c709b6285f5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"8b5090678e5f5515950699396416f762a86d2107","unresolved":false,"context_lines":[{"line_number":7360,"context_line":"            config.emulator_pins \u003d guest_cpu_tune.emulatorpin.cpuset"},{"line_number":7361,"context_line":""},{"line_number":7362,"context_line":"            if guest_cpu_tune.vcpusched:"},{"line_number":7363,"context_line":"                # NOTE(artom) vcpushed is a list, but there\u0027s only ever 1"},{"line_number":7364,"context_line":"                # element in it (see _get_guest_numa_config under"},{"line_number":7365,"context_line":"                # wants_realtime)"},{"line_number":7366,"context_line":"                config.sched_vcpus \u003d guest_cpu_tune.vcpusched[0].vcpus"}],"source_content_type":"text/x-python","patch_set":44,"id":"7faddb67_b2bbb50d","line":7363,"range":{"start_line":7363,"start_character":72,"end_line":7363,"end_character":73},"in_reply_to":"7faddb67_d5b0ff42","updated":"2019-08-22 20:41:10.000000000","message":"Done","commit_id":"2d3842fda7fa07d7a289999b910e3c709b6285f5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"2ac90ac4c3c14f1f0d4f650de6398c0fa6129125","unresolved":false,"context_lines":[{"line_number":7332,"context_line":"        return data"},{"line_number":7333,"context_line":""},{"line_number":7334,"context_line":"    def post_claim_migrate_data(self, context, instance, migrate_data, claim):"},{"line_number":7335,"context_line":"        migrate_data.dst_numa_config \u003d self._get_live_migrate_numa_info("},{"line_number":7336,"context_line":"                claim.claimed_numa_topology, instance.flavor,"},{"line_number":7337,"context_line":"                instance.image_meta)"},{"line_number":7338,"context_line":"        return migrate_data"}],"source_content_type":"text/x-python","patch_set":45,"id":"7faddb67_2a709e73","line":7335,"range":{"start_line":7335,"start_character":30,"end_line":7335,"end_character":36},"updated":"2019-08-23 14:11:37.000000000","message":"info?","commit_id":"74d6c9a9ea7558f502d43e058a255818359160b5"}],"nova/virt/xenapi/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"efe6769f2812a0800ce7ab7c523c745f1bc81a17","unresolved":false,"context_lines":[{"line_number":572,"context_line":"        :param instance: nova.db.sqlalchemy.models.Instance object"},{"line_number":573,"context_line":"        :param block_migration: if true, prepare for block migration"},{"line_number":574,"context_line":"        :param disk_over_commit: if true, allow disk over commit"},{"line_number":575,"context_line":"        :param instance_numa_topology: the InstanceNUMATopology of the"},{"line_number":576,"context_line":"                                       instance, as fitted to the destination"},{"line_number":577,"context_line":"                                       (aka this host)"},{"line_number":578,"context_line":"        :returns: a XenapiLiveMigrateData object"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_c1471b77","line":575,"updated":"2019-02-24 22:42:46.000000000","message":"For the description I\u0027d just say \"Not used by this driver.\"","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd31e8320f48812c869c5d0d673bf13d7a207421","unresolved":false,"context_lines":[{"line_number":572,"context_line":"        :param instance: nova.db.sqlalchemy.models.Instance object"},{"line_number":573,"context_line":"        :param block_migration: if true, prepare for block migration"},{"line_number":574,"context_line":"        :param disk_over_commit: if true, allow disk over commit"},{"line_number":575,"context_line":"        :param instance_numa_topology: the InstanceNUMATopology of the"},{"line_number":576,"context_line":"                                       instance, as fitted to the destination"},{"line_number":577,"context_line":"                                       (aka this host)"},{"line_number":578,"context_line":"        :returns: a XenapiLiveMigrateData object"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_28bd9ab6","line":575,"in_reply_to":"9fdfeff1_c1471b77","updated":"2019-02-25 17:06:11.000000000","message":"Done","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"}],"nova/virt/xenapi/vmops.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"efe6769f2812a0800ce7ab7c523c745f1bc81a17","unresolved":false,"context_lines":[{"line_number":2327,"context_line":"    def check_can_live_migrate_destination(self, ctxt, instance_ref,"},{"line_number":2328,"context_line":"                                           block_migration\u003dFalse,"},{"line_number":2329,"context_line":"                                           disk_over_commit\u003dFalse,"},{"line_number":2330,"context_line":"                                           instance_numa_topology\u003dNone):"},{"line_number":2331,"context_line":"        \"\"\"Check if it is possible to execute live migration."},{"line_number":2332,"context_line":""},{"line_number":2333,"context_line":"        :param ctxt: security context"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_e12fbfa4","line":2330,"range":{"start_line":2330,"start_character":43,"end_line":2330,"end_character":70},"updated":"2019-02-24 22:42:46.000000000","message":"Just omit this (like the hyperv driver) since the driver code doesn\u0027t pass it through. Avoid the confusion of having unused kwargs.","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bd31e8320f48812c869c5d0d673bf13d7a207421","unresolved":false,"context_lines":[{"line_number":2327,"context_line":"    def check_can_live_migrate_destination(self, ctxt, instance_ref,"},{"line_number":2328,"context_line":"                                           block_migration\u003dFalse,"},{"line_number":2329,"context_line":"                                           disk_over_commit\u003dFalse,"},{"line_number":2330,"context_line":"                                           instance_numa_topology\u003dNone):"},{"line_number":2331,"context_line":"        \"\"\"Check if it is possible to execute live migration."},{"line_number":2332,"context_line":""},{"line_number":2333,"context_line":"        :param ctxt: security context"}],"source_content_type":"text/x-python","patch_set":26,"id":"9fdfeff1_68be42af","line":2330,"range":{"start_line":2330,"start_character":43,"end_line":2330,"end_character":70},"in_reply_to":"9fdfeff1_e12fbfa4","updated":"2019-02-25 17:06:11.000000000","message":"Done","commit_id":"55a81b2ac49182870a29cd604fa15fb034891b5f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"21d6861d80b97ca3c90cf377fa98ee486d40cb26","unresolved":false,"context_lines":[{"line_number":2334,"context_line":"        :param block_migration: if true, prepare for block migration"},{"line_number":2335,"context_line":"                                if None, calculate it from driver"},{"line_number":2336,"context_line":"        :param disk_over_commit: if true, allow disk over commit"},{"line_number":2337,"context_line":""},{"line_number":2338,"context_line":"        \"\"\""},{"line_number":2339,"context_line":"        dest_check_data \u003d objects.XenapiLiveMigrateData()"},{"line_number":2340,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"9fdfeff1_0acf4f7f","side":"PARENT","line":2337,"updated":"2019-02-26 17:10:48.000000000","message":"Unrelated random whitespace damage.","commit_id":"f7ff49ddec263ff17888de9a89414e67095b6a51"}]}
