)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":20,"context_line":"   through the superconductor"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"* If a migration object is passed to"},{"line_number":23,"context_line":"check_can_live_migrate_destination(), the latter sets a"},{"line_number":24,"context_line":"numa_live_migration sentinel to True, and passes it to"},{"line_number":25,"context_line":"check_can_live_migrate_source()."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"* If the instance has a NUMA topology, the libvirt driver\u0027s"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":75,"id":"7faddb67_d3be97d2","line":24,"range":{"start_line":23,"start_character":38,"end_line":24,"end_character":36},"updated":"2019-09-05 20:57:42.000000000","message":"Again [1] I\u0027m not sure why this isn\u0027t a flag that lives in the LibvirtLiveMigrateData object since it seems to be pretty specific to that signaling it can do the thing. It just seems weird to me that we have src_suports_numa_live_migration in the object to signal from source to dest that the source can do the thing, but from dest to source we have a compute rpc api parameter rather than something in the migrate_data object. Why not be consistent?\n\n[1] https://review.opendev.org/#/c/634827/57//COMMIT_MSG@12","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":20,"context_line":"   through the superconductor"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"* If a migration object is passed to"},{"line_number":23,"context_line":"check_can_live_migrate_destination(), the latter sets a"},{"line_number":24,"context_line":"numa_live_migration sentinel to True, and passes it to"},{"line_number":25,"context_line":"check_can_live_migrate_source()."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"* If the instance has a NUMA topology, the libvirt driver\u0027s"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":75,"id":"5faad753_9c5fabe4","line":24,"range":{"start_line":23,"start_character":38,"end_line":24,"end_character":36},"in_reply_to":"7faddb67_d3be97d2","updated":"2019-09-06 16:44:40.000000000","message":"Done","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":27,"context_line":"* If the instance has a NUMA topology, the libvirt driver\u0027s"},{"line_number":28,"context_line":"check_can_live_migrate_source() adds src_supports_numa_live_migration"},{"line_number":29,"context_line":"to migrate_data, indicating that it can perform a NUMA live migration."},{"line_number":30,"context_line":"The compute manager\u0027s check_can_live_migrate_source() will *remove*"},{"line_number":31,"context_line":"src_supports_numa_live_migration from migrate_data unless a True"},{"line_number":32,"context_line":"numa_live_migration sentinel was received. The sentinel will also be"},{"line_number":33,"context_line":"removed if supports_numa_live_migration() returns False."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"* The previous bullet points make sure that a NUMA live migration is"},{"line_number":36,"context_line":"initiated if and only if the conductor, both computes, and the RPC"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":75,"id":"7faddb67_13950f3d","line":33,"range":{"start_line":30,"start_character":0,"end_line":33,"end_character":56},"updated":"2019-09-05 20:57:42.000000000","message":"This is confusing. I guess the point is, check_can_live_migrate_source will set src_supports_numa_live_migration on migrate_data iff:\n\n1. the dest sends numa_live_migration signaling it\u0027s DTF\n\n2. the instance has numa_topology\n\n3. supports_numa_live_migration (from the source) is true, meaning the source isn\u0027t rpc config pinned to not send things back to the dest\n\nRe-wording in such a way would be easier to understand for me than to say \"well the source adds the thing and then if a couple of things are true we remove it\".","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":27,"context_line":"* If the instance has a NUMA topology, the libvirt driver\u0027s"},{"line_number":28,"context_line":"check_can_live_migrate_source() adds src_supports_numa_live_migration"},{"line_number":29,"context_line":"to migrate_data, indicating that it can perform a NUMA live migration."},{"line_number":30,"context_line":"The compute manager\u0027s check_can_live_migrate_source() will *remove*"},{"line_number":31,"context_line":"src_supports_numa_live_migration from migrate_data unless a True"},{"line_number":32,"context_line":"numa_live_migration sentinel was received. The sentinel will also be"},{"line_number":33,"context_line":"removed if supports_numa_live_migration() returns False."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"* The previous bullet points make sure that a NUMA live migration is"},{"line_number":36,"context_line":"initiated if and only if the conductor, both computes, and the RPC"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":75,"id":"5faad753_7c13cf0e","line":33,"range":{"start_line":30,"start_character":0,"end_line":33,"end_character":56},"in_reply_to":"7faddb67_13950f3d","updated":"2019-09-06 16:44:40.000000000","message":"Done","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":33,"context_line":"removed if supports_numa_live_migration() returns False."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"* The previous bullet points make sure that a NUMA live migration is"},{"line_number":36,"context_line":"initiated if and only if the conductor, both computes, and the RPC"},{"line_number":37,"context_line":"version support it."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"* compute manager gets a new _live_migration_claim() method, called"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":75,"id":"7faddb67_33d04bf7","line":36,"range":{"start_line":36,"start_character":29,"end_line":36,"end_character":38},"updated":"2019-09-05 20:57:42.000000000","message":"Meaning the workaround option is set? Or just that the conductor isn\u0027t pinned to not send the migration object to the dest? I guess the latter.\n\nNormally we\u0027d have conductor check the compute service version on the source and dest to make sure they are new enough to do the dance but that doesn\u0027t mean they aren\u0027t configured to backlevel the rpc messages, so we\u0027re doing that implicitly by the parameters we get. OK.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"call to update_available_resource()."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"* If the migration fails, _rollback_live_migration() calls a new RPC"},{"line_number":58,"context_line":"method, drop_move_claim_at_destination(), to drop the move claim."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"* is_trackable_migration() is removed from the resource tracker, as"},{"line_number":61,"context_line":"we\u0027re now doing a claim for all types of migrations, including live"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":75,"id":"7faddb67_930c9f93","line":58,"updated":"2019-09-05 20:57:42.000000000","message":"nit: it would probably be good to explain why we don\u0027t try to use rollback_live_migration_at_destination - which is because that\u0027s only called conditionally and we don\u0027t want to munge the claims cleanup in that method since it\u0027s historically only there to deal with cleaning up storage on the dest host (though it also does network cleanup).","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":55,"context_line":"call to update_available_resource()."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"* If the migration fails, _rollback_live_migration() calls a new RPC"},{"line_number":58,"context_line":"method, drop_move_claim_at_destination(), to drop the move claim."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"* is_trackable_migration() is removed from the resource tracker, as"},{"line_number":61,"context_line":"we\u0027re now doing a claim for all types of migrations, including live"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":75,"id":"5faad753_bca5c7b7","line":58,"in_reply_to":"7faddb67_930c9f93","updated":"2019-09-06 16:44:40.000000000","message":"Done","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":58,"context_line":"method, drop_move_claim_at_destination(), to drop the move claim. This"},{"line_number":59,"context_line":"is done as an entirely new separate RPC method because"},{"line_number":60,"context_line":"rollback_live_migration_at_destination() is called conditionally and"},{"line_number":61,"context_line":"deals with cleaning up storage."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"* is_trackable_migration() is removed from the resource tracker, as"},{"line_number":64,"context_line":"we\u0027re now doing a claim for all types of migrations, including live"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":80,"id":"5faad753_4c307d57","line":61,"updated":"2019-09-09 18:08:49.000000000","message":"Well, mostly. It also cleans up networking (which for nova-net was dest specific I guess but for neutron it\u0027s not [1]).\n\n[1] I658e0a749e842163ed74f82c975bcaf19f9f7f07","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"ccf745a6e07ed7893e61176950c03da4ffa135e0","unresolved":false,"context_lines":[{"line_number":58,"context_line":"method, drop_move_claim_at_destination(), to drop the move claim. This"},{"line_number":59,"context_line":"is done as an entirely new separate RPC method because"},{"line_number":60,"context_line":"rollback_live_migration_at_destination() is called conditionally and"},{"line_number":61,"context_line":"deals with cleaning up storage."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"* is_trackable_migration() is removed from the resource tracker, as"},{"line_number":64,"context_line":"we\u0027re now doing a claim for all types of migrations, including live"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":80,"id":"5faad753_200505c3","line":61,"in_reply_to":"5faad753_4c307d57","updated":"2019-09-09 19:34:06.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"}],"nova/compute/claims.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"00517b5f4e2aaaf45f2c6e853594c9dc74634f29","unresolved":false,"context_lines":[{"line_number":265,"context_line":"    \"\"\""},{"line_number":266,"context_line":"    def __init__(self, context, instance, nodename, instance_type, image_meta,"},{"line_number":267,"context_line":"                 tracker, resources, pci_requests, overhead\u003dNone, limits\u003dNone,"},{"line_number":268,"context_line":"                 pagesize\u003dNone):"},{"line_number":269,"context_line":"        self.context \u003d context"},{"line_number":270,"context_line":"        self.instance_type \u003d instance_type"},{"line_number":271,"context_line":"        if isinstance(image_meta, dict):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_d2372ce3","line":268,"range":{"start_line":268,"start_character":17,"end_line":268,"end_character":30},"updated":"2019-02-06 21:05:37.000000000","message":"you might want to update the doc sting to not that pagesize should only be set on live migration as it allowed to chagne for resize/cold migrate.","commit_id":"e1af322246077ff6f825e52bd4db6d6e36dcc89a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2dd102cde21f5de1b1203a15eb8017a8f92b9d79","unresolved":false,"context_lines":[{"line_number":265,"context_line":"    \"\"\""},{"line_number":266,"context_line":"    def __init__(self, context, instance, nodename, instance_type, image_meta,"},{"line_number":267,"context_line":"                 tracker, resources, pci_requests, overhead\u003dNone, limits\u003dNone,"},{"line_number":268,"context_line":"                 pagesize\u003dNone):"},{"line_number":269,"context_line":"        self.context \u003d context"},{"line_number":270,"context_line":"        self.instance_type \u003d instance_type"},{"line_number":271,"context_line":"        if isinstance(image_meta, dict):"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_9ac45694","line":268,"range":{"start_line":268,"start_character":17,"end_line":268,"end_character":30},"in_reply_to":"9fdfeff1_d2372ce3","updated":"2019-02-07 00:56:46.000000000","message":"Done","commit_id":"e1af322246077ff6f825e52bd4db6d6e36dcc89a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"00517b5f4e2aaaf45f2c6e853594c9dc74634f29","unresolved":false,"context_lines":[{"line_number":295,"context_line":"    def numa_topology(self):"},{"line_number":296,"context_line":"        numa_topology \u003d hardware.numa_get_constraints(self.instance_type,"},{"line_number":297,"context_line":"                                                      self.image_meta)"},{"line_number":298,"context_line":"        if self.pagesize:"},{"line_number":299,"context_line":"            for cell in numa_topology.cells:"},{"line_number":300,"context_line":"                cell.pagesize \u003d self.pagesize"},{"line_number":301,"context_line":"        return numa_topology"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def abort(self):"},{"line_number":304,"context_line":"        \"\"\"Compute operation requiring claimed resources has failed or"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_52033c0e","line":301,"range":{"start_line":298,"start_character":8,"end_line":301,"end_character":28},"updated":"2019-02-06 21:05:37.000000000","message":"ok so if we have set the pagesize on the MoveClaim object we override the pagesize that was determined by looking at the flavor and image with the one  that was set.\n\nthis is how we are ensuring that the page size does not change on a live migration.\n\ncan you add a comment to that effect later.","commit_id":"e1af322246077ff6f825e52bd4db6d6e36dcc89a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2dd102cde21f5de1b1203a15eb8017a8f92b9d79","unresolved":false,"context_lines":[{"line_number":295,"context_line":"    def numa_topology(self):"},{"line_number":296,"context_line":"        numa_topology \u003d hardware.numa_get_constraints(self.instance_type,"},{"line_number":297,"context_line":"                                                      self.image_meta)"},{"line_number":298,"context_line":"        if self.pagesize:"},{"line_number":299,"context_line":"            for cell in numa_topology.cells:"},{"line_number":300,"context_line":"                cell.pagesize \u003d self.pagesize"},{"line_number":301,"context_line":"        return numa_topology"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def abort(self):"},{"line_number":304,"context_line":"        \"\"\"Compute operation requiring claimed resources has failed or"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_fa9c825e","line":301,"range":{"start_line":298,"start_character":8,"end_line":301,"end_character":28},"in_reply_to":"9fdfeff1_52033c0e","updated":"2019-02-07 00:56:46.000000000","message":"Done","commit_id":"e1af322246077ff6f825e52bd4db6d6e36dcc89a"}],"nova/compute/manager.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8512844cbc35bea0937ad7015927afec4bf45b49","unresolved":false,"context_lines":[{"line_number":6015,"context_line":"            migrate_data \u003d self.compute_rpcapi.\\"},{"line_number":6016,"context_line":"                                check_can_live_migrate_source(ctxt, instance,"},{"line_number":6017,"context_line":"                                                              dest_check_data)"},{"line_number":6018,"context_line":"            rt \u003d self._get_resource_tracker()"},{"line_number":6019,"context_line":"            # Don\u0027t actually do anything with the claim for now, just create"},{"line_number":6020,"context_line":"            # it to make sure resources are available. This can raise"},{"line_number":6021,"context_line":"            # ComputeResourcesUnavailable, which we need to catch in the right"},{"line_number":6022,"context_line":"            # places."},{"line_number":6023,"context_line":"            rt.live_migration_claim(ctxt, instance, migration)"},{"line_number":6024,"context_line":"        finally:"},{"line_number":6025,"context_line":"            self.driver.cleanup_live_migration_destination_check(ctxt,"},{"line_number":6026,"context_line":"                    dest_check_data)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_b2997e7a","line":6023,"range":{"start_line":6018,"start_character":12,"end_line":6023,"end_character":62},"updated":"2019-02-04 13:20:43.000000000","message":"nit: there is no reason we could not also claim resouces like this for normal instance spawns to prevent the current schduler race we have without needing placement support so we might want to rename this fucntin at some point.","commit_id":"7349f8190117d7bc408bde009caf287c222e4ba4"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"aab3c67872329fa2ff74de3eb67589a1b19cd2de","unresolved":false,"context_lines":[{"line_number":6015,"context_line":"            migrate_data \u003d self.compute_rpcapi.\\"},{"line_number":6016,"context_line":"                                check_can_live_migrate_source(ctxt, instance,"},{"line_number":6017,"context_line":"                                                              dest_check_data)"},{"line_number":6018,"context_line":"            rt \u003d self._get_resource_tracker()"},{"line_number":6019,"context_line":"            # Don\u0027t actually do anything with the claim for now, just create"},{"line_number":6020,"context_line":"            # it to make sure resources are available. This can raise"},{"line_number":6021,"context_line":"            # ComputeResourcesUnavailable, which we need to catch in the right"},{"line_number":6022,"context_line":"            # places."},{"line_number":6023,"context_line":"            rt.live_migration_claim(ctxt, instance, migration)"},{"line_number":6024,"context_line":"        finally:"},{"line_number":6025,"context_line":"            self.driver.cleanup_live_migration_destination_check(ctxt,"},{"line_number":6026,"context_line":"                    dest_check_data)"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_0ef5be83","line":6023,"range":{"start_line":6018,"start_character":12,"end_line":6023,"end_character":62},"in_reply_to":"9fdfeff1_b2997e7a","updated":"2019-02-04 20:14:08.000000000","message":"You mean rename live_migration_claim()? It returns a MoveClaim, which assumes a source and dest. Using it for normal spawns would be weird.","commit_id":"7349f8190117d7bc408bde009caf287c222e4ba4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"00517b5f4e2aaaf45f2c6e853594c9dc74634f29","unresolved":false,"context_lines":[{"line_number":6008,"context_line":"        dst_compute_info \u003d obj_base.obj_to_primitive("},{"line_number":6009,"context_line":"            self._get_compute_info(ctxt, CONF.host))"},{"line_number":6010,"context_line":""},{"line_number":6011,"context_line":"        rt \u003d self._get_resource_tracker()"},{"line_number":6012,"context_line":"        # Don\u0027t actually do anything with the claim for now, just create"},{"line_number":6013,"context_line":"        # it to make sure resources are available. This can raise"},{"line_number":6014,"context_line":"        # ComputeResourcesUnavailable, which we need to catch in the right"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_9231a4ef","line":6011,"range":{"start_line":6011,"start_character":8,"end_line":6011,"end_character":41},"updated":"2019-02-06 21:05:37.000000000","message":"this fucntion was removed 2 days ago.\n\nuse self.rt now instead.","commit_id":"e1af322246077ff6f825e52bd4db6d6e36dcc89a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2dd102cde21f5de1b1203a15eb8017a8f92b9d79","unresolved":false,"context_lines":[{"line_number":6008,"context_line":"        dst_compute_info \u003d obj_base.obj_to_primitive("},{"line_number":6009,"context_line":"            self._get_compute_info(ctxt, CONF.host))"},{"line_number":6010,"context_line":""},{"line_number":6011,"context_line":"        rt \u003d self._get_resource_tracker()"},{"line_number":6012,"context_line":"        # Don\u0027t actually do anything with the claim for now, just create"},{"line_number":6013,"context_line":"        # it to make sure resources are available. This can raise"},{"line_number":6014,"context_line":"        # ComputeResourcesUnavailable, which we need to catch in the right"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_1ab706db","line":6011,"range":{"start_line":6011,"start_character":8,"end_line":6011,"end_character":41},"in_reply_to":"9fdfeff1_9231a4ef","updated":"2019-02-07 00:56:46.000000000","message":"Thanks for the pointer, I was confused with the CI failures.","commit_id":"e1af322246077ff6f825e52bd4db6d6e36dcc89a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aed53b2f7b9ada500894b1b1c63c05510f225699","unresolved":false,"context_lines":[{"line_number":6077,"context_line":"        pagesize \u003d None"},{"line_number":6078,"context_line":"        if instance.numa_topology:"},{"line_number":6079,"context_line":"            pagesize \u003d instance.numa_topology.cells[0].pagesize"},{"line_number":6080,"context_line":"        self.rt.live_migration_claim(ctxt, instance,"},{"line_number":6081,"context_line":"                                     self._get_nodename(instance), migration,"},{"line_number":6082,"context_line":"                                     pagesize)"},{"line_number":6083,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"9fdfeff1_7959a08c","line":6080,"range":{"start_line":6080,"start_character":8,"end_line":6080,"end_character":52},"updated":"2019-02-19 17:22:59.000000000","message":"Do you need to claim resource_tracker.COMPUTE_RESOURCE_SEMAPHORE here?\n\n  with utils.lock(resource_tracker.COMPUTE_RESOURCE_SEMAPHORE):","commit_id":"37251fe42414e50ff26b8d72359ab34fdc742fed"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d2874f4cbe04be5960598f547d87ff3b06d283aa","unresolved":false,"context_lines":[{"line_number":6077,"context_line":"        pagesize \u003d None"},{"line_number":6078,"context_line":"        if instance.numa_topology:"},{"line_number":6079,"context_line":"            pagesize \u003d instance.numa_topology.cells[0].pagesize"},{"line_number":6080,"context_line":"        self.rt.live_migration_claim(ctxt, instance,"},{"line_number":6081,"context_line":"                                     self._get_nodename(instance), migration,"},{"line_number":6082,"context_line":"                                     pagesize)"},{"line_number":6083,"context_line":""}],"source_content_type":"text/x-python","patch_set":23,"id":"9fdfeff1_3568cbb8","line":6080,"range":{"start_line":6080,"start_character":8,"end_line":6080,"end_character":52},"in_reply_to":"9fdfeff1_7959a08c","updated":"2019-02-21 16:39:10.000000000","message":"live_migration_claim() is decorated with @utils.synchronized(COMPUTE_RESOURCE_SEMAPHORE), wouldn\u0027t that be enough? When we create a resize_claim on L4210 we don\u0027t lock on anything, presumably because resize_claim() is also decorated with @utils.synchronized(COMPUTE_RESOURCE_SEMAPHORE)","commit_id":"37251fe42414e50ff26b8d72359ab34fdc742fed"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aed53b2f7b9ada500894b1b1c63c05510f225699","unresolved":false,"context_lines":[{"line_number":6086,"context_line":"                ctxt, instance, src_compute_info, dst_compute_info,"},{"line_number":6087,"context_line":"                block_migration, disk_over_commit)"},{"line_number":6088,"context_line":"        except exception.MigrationPreCheckError:"},{"line_number":6089,"context_line":"            # The Claim will have modified the Migration object at this point,"},{"line_number":6090,"context_line":"            # need to clean up."},{"line_number":6091,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":6092,"context_line":"                migration.dest_node \u003d None"},{"line_number":6093,"context_line":"                migration.dest_compute \u003d None"}],"source_content_type":"text/x-python","patch_set":23,"id":"9fdfeff1_79b5207e","line":6090,"range":{"start_line":6089,"start_character":0,"end_line":6090,"end_character":31},"updated":"2019-02-19 17:22:59.000000000","message":"I was going to ask if this was something the called function could do, but I see there are many of them and the code paths are plentiful","commit_id":"37251fe42414e50ff26b8d72359ab34fdc742fed"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b92f55f133cae5452e1700002e8569230729e543","unresolved":false,"context_lines":[{"line_number":6086,"context_line":"                ctxt, instance, src_compute_info, dst_compute_info,"},{"line_number":6087,"context_line":"                block_migration, disk_over_commit)"},{"line_number":6088,"context_line":"        except exception.MigrationPreCheckError:"},{"line_number":6089,"context_line":"            # The Claim will have modified the Migration object at this point,"},{"line_number":6090,"context_line":"            # need to clean up."},{"line_number":6091,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":6092,"context_line":"                migration.dest_node \u003d None"},{"line_number":6093,"context_line":"                migration.dest_compute \u003d None"}],"source_content_type":"text/x-python","patch_set":23,"id":"9fdfeff1_cd25330c","line":6090,"range":{"start_line":6089,"start_character":0,"end_line":6090,"end_character":31},"in_reply_to":"9fdfeff1_75a3b301","updated":"2019-02-21 20:54:41.000000000","message":"So actually, when writing function tests for this, I came up with a better way of handing it: directly in check_can_migrate_destination. Catch it there, re-raise as MigrationPreCheck error, which is already handled in the upper layers.","commit_id":"37251fe42414e50ff26b8d72359ab34fdc742fed"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d2874f4cbe04be5960598f547d87ff3b06d283aa","unresolved":false,"context_lines":[{"line_number":6086,"context_line":"                ctxt, instance, src_compute_info, dst_compute_info,"},{"line_number":6087,"context_line":"                block_migration, disk_over_commit)"},{"line_number":6088,"context_line":"        except exception.MigrationPreCheckError:"},{"line_number":6089,"context_line":"            # The Claim will have modified the Migration object at this point,"},{"line_number":6090,"context_line":"            # need to clean up."},{"line_number":6091,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":6092,"context_line":"                migration.dest_node \u003d None"},{"line_number":6093,"context_line":"                migration.dest_compute \u003d None"}],"source_content_type":"text/x-python","patch_set":23,"id":"9fdfeff1_75a3b301","line":6090,"range":{"start_line":6089,"start_character":0,"end_line":6090,"end_character":31},"in_reply_to":"9fdfeff1_79b5207e","updated":"2019-02-21 16:39:10.000000000","message":"Yeah, better do it here.","commit_id":"37251fe42414e50ff26b8d72359ab34fdc742fed"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5cde60af3dec27726a3de38ca4687f4aa9930010","unresolved":false,"context_lines":[{"line_number":6076,"context_line":"        if instance.numa_topology:"},{"line_number":6077,"context_line":"            pagesize \u003d instance.numa_topology.cells[0].pagesize"},{"line_number":6078,"context_line":"        try:"},{"line_number":6079,"context_line":"            self.rt.live_migration_claim(ctxt, instance,"},{"line_number":6080,"context_line":"                                         self._get_nodename(instance),"},{"line_number":6081,"context_line":"                                         migration, pagesize)"},{"line_number":6082,"context_line":"        except exception.ComputeResourcesUnavailable as e:"},{"line_number":6083,"context_line":"            # The Claim will have modified the Migration object at this point,"},{"line_number":6084,"context_line":"            # need to clean up."}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_1119fb86","line":6081,"range":{"start_line":6079,"start_character":12,"end_line":6081,"end_character":61},"updated":"2019-02-23 06:02:37.000000000","message":"In the move claim, there is migration_context save to the instance, so after the live migration successful, we should apply the migration-context and drop the migration context, I didn\u0027t see you do that at where","commit_id":"081456e9ace848b67928b90d82d42e2ae54a8fc6"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5cde60af3dec27726a3de38ca4687f4aa9930010","unresolved":false,"context_lines":[{"line_number":6098,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":6099,"context_line":"                migration.dest_node \u003d None"},{"line_number":6100,"context_line":"                migration.dest_compute \u003d None"},{"line_number":6101,"context_line":"                migration.save()"},{"line_number":6102,"context_line":"        LOG.debug(\u0027destination check data is %s\u0027, dest_check_data)"},{"line_number":6103,"context_line":"        try:"},{"line_number":6104,"context_line":"            migrate_data \u003d self.compute_rpcapi.\\"}],"source_content_type":"text/x-python","patch_set":27,"id":"9fdfeff1_b11eef71","line":6101,"updated":"2019-02-23 06:02:37.000000000","message":"So we should drop the claim here?","commit_id":"081456e9ace848b67928b90d82d42e2ae54a8fc6"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a366c036e4e08f60dbea70c2d8a80d752744c505","unresolved":false,"context_lines":[{"line_number":6061,"context_line":"        \"\"\""},{"line_number":6062,"context_line":"        return self.driver.check_instance_shared_storage_remote(ctxt, data)"},{"line_number":6063,"context_line":""},{"line_number":6064,"context_line":"    def _supports_numa_lm(self, context, host):"},{"line_number":6065,"context_line":"        \"\"\"Checks whether the nova -compute service on the host is new enough to"},{"line_number":6066,"context_line":"        support NUMA live migration."},{"line_number":6067,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_543a07cd","line":6064,"range":{"start_line":6064,"start_character":23,"end_line":6064,"end_character":25},"updated":"2019-02-24 23:05:41.000000000","message":"live_migration","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":6061,"context_line":"        \"\"\""},{"line_number":6062,"context_line":"        return self.driver.check_instance_shared_storage_remote(ctxt, data)"},{"line_number":6063,"context_line":""},{"line_number":6064,"context_line":"    def _supports_numa_lm(self, context, host):"},{"line_number":6065,"context_line":"        \"\"\"Checks whether the nova -compute service on the host is new enough to"},{"line_number":6066,"context_line":"        support NUMA live migration."},{"line_number":6067,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_bc00e835","line":6064,"range":{"start_line":6064,"start_character":23,"end_line":6064,"end_character":25},"in_reply_to":"9fdfeff1_543a07cd","updated":"2019-02-25 20:06:55.000000000","message":"Done","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a366c036e4e08f60dbea70c2d8a80d752744c505","unresolved":false,"context_lines":[{"line_number":6099,"context_line":"        dst_compute_info \u003d obj_base.obj_to_primitive("},{"line_number":6100,"context_line":"            self._get_compute_info(ctxt, CONF.host))"},{"line_number":6101,"context_line":""},{"line_number":6102,"context_line":"        src_can_numa_lm \u003d self._supports_numa_lm(ctxt, instance.host)"},{"line_number":6103,"context_line":"        if src_can_numa_lm:"},{"line_number":6104,"context_line":"            pagesize \u003d None"},{"line_number":6105,"context_line":"            if instance.numa_topology:"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_b40a531d","line":6102,"updated":"2019-02-24 23:05:41.000000000","message":"You should have some comments here. This is checking if the source supports numa live migration data coming back from the destination, but what if it doesn\u0027t? Your next change in the series removes all of the code in conductor that was checking if numa was supported, so you\u0027d essentially be undoing that here right? Meaning we wouldn\u0027t do the numa claim on the dest and not honor it on the source - and that should still be a failure (unless that workaround config is enabled I guess).","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":6099,"context_line":"        dst_compute_info \u003d obj_base.obj_to_primitive("},{"line_number":6100,"context_line":"            self._get_compute_info(ctxt, CONF.host))"},{"line_number":6101,"context_line":""},{"line_number":6102,"context_line":"        src_can_numa_lm \u003d self._supports_numa_lm(ctxt, instance.host)"},{"line_number":6103,"context_line":"        if src_can_numa_lm:"},{"line_number":6104,"context_line":"            pagesize \u003d None"},{"line_number":6105,"context_line":"            if instance.numa_topology:"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_3c515837","line":6102,"in_reply_to":"9fdfeff1_b40a531d","updated":"2019-02-25 20:06:55.000000000","message":"I abandoned the next change - you\u0027re right, we need to keep it at least until Train, because Rocky -\u003e Stein NUMA live migration is still very fragile and should be disabled by default.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5ddbb96bf7d71d86dceaf57121934934eea66e69","unresolved":false,"context_lines":[{"line_number":6100,"context_line":"            self._get_compute_info(ctxt, CONF.host))"},{"line_number":6101,"context_line":""},{"line_number":6102,"context_line":"        src_can_numa_lm \u003d self._supports_numa_lm(ctxt, instance.host)"},{"line_number":6103,"context_line":"        if src_can_numa_lm:"},{"line_number":6104,"context_line":"            pagesize \u003d None"},{"line_number":6105,"context_line":"            if instance.numa_topology:"},{"line_number":6106,"context_line":"                pagesize \u003d instance.numa_topology.cells[0].pagesize"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_f24d4b99","line":6103,"range":{"start_line":6103,"start_character":8,"end_line":6103,"end_character":27},"updated":"2019-02-25 06:18:57.000000000","message":"When the dest host is new node in upgrade, I think the line 6082, migration should get a default value None https://review.openstack.org/#/c/634605/20/nova/compute/manager.py@6069\n\nThen you can just check \u0027if migration\u0027","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":6100,"context_line":"            self._get_compute_info(ctxt, CONF.host))"},{"line_number":6101,"context_line":""},{"line_number":6102,"context_line":"        src_can_numa_lm \u003d self._supports_numa_lm(ctxt, instance.host)"},{"line_number":6103,"context_line":"        if src_can_numa_lm:"},{"line_number":6104,"context_line":"            pagesize \u003d None"},{"line_number":6105,"context_line":"            if instance.numa_topology:"},{"line_number":6106,"context_line":"                pagesize \u003d instance.numa_topology.cells[0].pagesize"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_17ff8f01","line":6103,"range":{"start_line":6103,"start_character":8,"end_line":6103,"end_character":27},"in_reply_to":"9fdfeff1_f24d4b99","updated":"2019-02-25 20:06:55.000000000","message":"Smart :) If the conductor was able to send us a `migration`, it means the source supports NUMA LM. At first I thought \"but what if both computes support NUMA LM but we\u0027re RPC-pinned because an upgrade is in progress? Shouldn\u0027t we still do a NUMA LM?\" The answer is no, because in that case the conductor won\u0027t send us a `migration` because it\u0027s still pinned.\n\nHowever, this means that the check_can_live_migrate_destination `migration` param patch will merge into this one - if we\u0027re checking an what\u0027s essentially an RPC version bump, that RPC bump needs to happen in the same patch, no? We don\u0027t want a situation where a compute has the version bump patch but not the actual code that provides that bump\u0027s functionality (didn\u0027t RackSpace use to track master in prod?)","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a366c036e4e08f60dbea70c2d8a80d752744c505","unresolved":false,"context_lines":[{"line_number":6103,"context_line":"        if src_can_numa_lm:"},{"line_number":6104,"context_line":"            pagesize \u003d None"},{"line_number":6105,"context_line":"            if instance.numa_topology:"},{"line_number":6106,"context_line":"                pagesize \u003d instance.numa_topology.cells[0].pagesize"},{"line_number":6107,"context_line":"            try:"},{"line_number":6108,"context_line":"                claim \u003d self.rt.live_migration_claim("},{"line_number":6109,"context_line":"                    ctxt, instance, self._get_nodename(instance), migration,"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_14347fdd","line":6106,"range":{"start_line":6106,"start_character":55,"end_line":6106,"end_character":58},"updated":"2019-02-24 23:05:41.000000000","message":"Can there be multiple and if so, why do we just pick the first?","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":6103,"context_line":"        if src_can_numa_lm:"},{"line_number":6104,"context_line":"            pagesize \u003d None"},{"line_number":6105,"context_line":"            if instance.numa_topology:"},{"line_number":6106,"context_line":"                pagesize \u003d instance.numa_topology.cells[0].pagesize"},{"line_number":6107,"context_line":"            try:"},{"line_number":6108,"context_line":"                claim \u003d self.rt.live_migration_claim("},{"line_number":6109,"context_line":"                    ctxt, instance, self._get_nodename(instance), migration,"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_97129f57","line":6106,"range":{"start_line":6106,"start_character":55,"end_line":6106,"end_character":58},"in_reply_to":"9fdfeff1_14347fdd","updated":"2019-02-25 20:06:55.000000000","message":"There can be multiple, but all cells have the same pagesize.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5ddbb96bf7d71d86dceaf57121934934eea66e69","unresolved":false,"context_lines":[{"line_number":6109,"context_line":"                    ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6110,"context_line":"                    pagesize)"},{"line_number":6111,"context_line":"                LOG.debug(\u0027Created live migration claim %s\u0027, claim)"},{"line_number":6112,"context_line":"            except exception.ComputeResourcesUnavailable as e:"},{"line_number":6113,"context_line":"                # The Claim will have modified the Migration object at this"},{"line_number":6114,"context_line":"                # point, need to clean up."},{"line_number":6115,"context_line":"                migration.dest_node \u003d None"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_6da89ed8","line":6112,"updated":"2019-02-25 06:18:57.000000000","message":"so we should drop the migration_context at here","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":6109,"context_line":"                    ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6110,"context_line":"                    pagesize)"},{"line_number":6111,"context_line":"                LOG.debug(\u0027Created live migration claim %s\u0027, claim)"},{"line_number":6112,"context_line":"            except exception.ComputeResourcesUnavailable as e:"},{"line_number":6113,"context_line":"                # The Claim will have modified the Migration object at this"},{"line_number":6114,"context_line":"                # point, need to clean up."},{"line_number":6115,"context_line":"                migration.dest_node \u003d None"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_97405f37","line":6112,"in_reply_to":"9fdfeff1_6da89ed8","updated":"2019-02-25 20:06:55.000000000","message":"No - there\u0027s only be a migration_context if the claim succeeds: we create it here [1], but what\u0027s raising ComputeResourcesUnavailable is the claim __init__ here [2].\n\n[1] https://github.com/openstack/nova/blob/a90c8e1a359a236e06f3a78df74f55808bbef31b/nova/compute/resource_tracker.py#L346\n[2] https://github.com/openstack/nova/blob/a90c8e1a359a236e06f3a78df74f55808bbef31b/nova/compute/resource_tracker.py#L319","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a366c036e4e08f60dbea70c2d8a80d752744c505","unresolved":false,"context_lines":[{"line_number":6112,"context_line":"            except exception.ComputeResourcesUnavailable as e:"},{"line_number":6113,"context_line":"                # The Claim will have modified the Migration object at this"},{"line_number":6114,"context_line":"                # point, need to clean up."},{"line_number":6115,"context_line":"                migration.dest_node \u003d None"},{"line_number":6116,"context_line":"                migration.dest_compute \u003d None"},{"line_number":6117,"context_line":"                migration.save()"},{"line_number":6118,"context_line":"                raise exception.MigrationPreCheckError(reason\u003de)"},{"line_number":6119,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_94206f9d","line":6116,"range":{"start_line":6115,"start_character":16,"end_line":6116,"end_character":45},"updated":"2019-02-24 23:05:41.000000000","message":"See below. However, I\u0027m not sure this is really necessary is it? We don\u0027t do this if a resize_claim fails - we just reschedule to another dest host which will do the claim and update these fields, or we fail with MaxRetriesExceeded. I guess the live migration case is different because we may not claim, but if we claim here because the instance has a numa topology, we should assume we\u0027re always going to claim for it yeah? Because conductor should have rejected the live migration otherwise, i.e. if the dest compute service isn\u0027t new enough to support numa live migration.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":6112,"context_line":"            except exception.ComputeResourcesUnavailable as e:"},{"line_number":6113,"context_line":"                # The Claim will have modified the Migration object at this"},{"line_number":6114,"context_line":"                # point, need to clean up."},{"line_number":6115,"context_line":"                migration.dest_node \u003d None"},{"line_number":6116,"context_line":"                migration.dest_compute \u003d None"},{"line_number":6117,"context_line":"                migration.save()"},{"line_number":6118,"context_line":"                raise exception.MigrationPreCheckError(reason\u003de)"},{"line_number":6119,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_d7d82753","line":6116,"range":{"start_line":6115,"start_character":16,"end_line":6116,"end_character":45},"in_reply_to":"9fdfeff1_94206f9d","updated":"2019-02-25 20:06:55.000000000","message":"\u003e Because conductor should have rejected\n \u003e the live migration otherwise, i.e. if the dest compute service\n \u003e isn\u0027t new enough to support numa live migration.\n\nI thought we didn\u0027t want the conductor rejecting live migrations, did we? We want to leave the possibility of doing an old-style live migration, for example if the operator knows what they\u0027re doing and have provided an identical empty destination compute.\n\n \u003e See below. However, I\u0027m not sure this is really necessary is it? We\n \u003e don\u0027t do this if a resize_claim fails - we just reschedule to\n \u003e another dest host which will do the claim and update these fields,\n \u003e or we fail with MaxRetriesExceeded. I guess the live migration case\n \u003e is different because we may not claimbut if we claim here because\n \u003e the instance has a numa topology, we should assume we\u0027re always\n \u003e going to claim for it yeah?\n\nYeah, with this series all live migrations are going to have claims. They\u0027re only really used if there\u0027s a NUMA topology, but they\u0027ll happen for every live migration. It\u0027d be weird if an instance with NUMA gets a migration_context during LM, but not an instance without NUMA.\n\nBut I think you\u0027re right, cleanup isn\u0027t necessary - I was thinking if the user forces a host but the claim fails. But then it\u0027s perfectly reasonable to have a migration with the dest set to some host, but in ERROR status. And as you said, if the user doesn\u0027t force a host, we\u0027ll just reschedule to a different dest.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a366c036e4e08f60dbea70c2d8a80d752744c505","unresolved":false,"context_lines":[{"line_number":6115,"context_line":"                migration.dest_node \u003d None"},{"line_number":6116,"context_line":"                migration.dest_compute \u003d None"},{"line_number":6117,"context_line":"                migration.save()"},{"line_number":6118,"context_line":"                raise exception.MigrationPreCheckError(reason\u003de)"},{"line_number":6119,"context_line":""},{"line_number":6120,"context_line":"        try:"},{"line_number":6121,"context_line":"            dest_check_data \u003d self.driver.check_can_live_migrate_destination("}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_5411a752","line":6118,"range":{"start_line":6118,"start_character":62,"end_line":6118,"end_character":63},"updated":"2019-02-24 23:05:41.000000000","message":"This should be six.text_type(e) or e.format_message() yeah?","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":6115,"context_line":"                migration.dest_node \u003d None"},{"line_number":6116,"context_line":"                migration.dest_compute \u003d None"},{"line_number":6117,"context_line":"                migration.save()"},{"line_number":6118,"context_line":"                raise exception.MigrationPreCheckError(reason\u003de)"},{"line_number":6119,"context_line":""},{"line_number":6120,"context_line":"        try:"},{"line_number":6121,"context_line":"            dest_check_data \u003d self.driver.check_can_live_migrate_destination("}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_f7dd2b41","line":6118,"range":{"start_line":6118,"start_character":62,"end_line":6118,"end_character":63},"in_reply_to":"9fdfeff1_5411a752","updated":"2019-02-25 20:06:55.000000000","message":"Done","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0792ad100c05873dd1457c6196d0981f0fd9fa6d","unresolved":false,"context_lines":[{"line_number":6120,"context_line":"        try:"},{"line_number":6121,"context_line":"            dest_check_data \u003d self.driver.check_can_live_migrate_destination("},{"line_number":6122,"context_line":"                ctxt, instance, src_compute_info, dst_compute_info,"},{"line_number":6123,"context_line":"                block_migration, disk_over_commit, claim.claimed_numa_topology)"},{"line_number":6124,"context_line":"        except (exception.MigrationPreCheckError,"},{"line_number":6125,"context_line":"                exception.InvalidSharedStorage, exception.InvalidLocalStorage):"},{"line_number":6126,"context_line":"            with excutils.save_and_reraise_exception():"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_ed06cecd","line":6123,"range":{"start_line":6123,"start_character":51,"end_line":6123,"end_character":78},"updated":"2019-02-25 06:22:23.000000000","message":"You can\u0027t have a claim if src_can_numa_lm \u003d false, so there missing one check","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":6120,"context_line":"        try:"},{"line_number":6121,"context_line":"            dest_check_data \u003d self.driver.check_can_live_migrate_destination("},{"line_number":6122,"context_line":"                ctxt, instance, src_compute_info, dst_compute_info,"},{"line_number":6123,"context_line":"                block_migration, disk_over_commit, claim.claimed_numa_topology)"},{"line_number":6124,"context_line":"        except (exception.MigrationPreCheckError,"},{"line_number":6125,"context_line":"                exception.InvalidSharedStorage, exception.InvalidLocalStorage):"},{"line_number":6126,"context_line":"            with excutils.save_and_reraise_exception():"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_37e2d3d6","line":6123,"range":{"start_line":6123,"start_character":51,"end_line":6123,"end_character":78},"in_reply_to":"9fdfeff1_ed06cecd","updated":"2019-02-25 20:06:55.000000000","message":"Done","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a366c036e4e08f60dbea70c2d8a80d752744c505","unresolved":false,"context_lines":[{"line_number":6121,"context_line":"            dest_check_data \u003d self.driver.check_can_live_migrate_destination("},{"line_number":6122,"context_line":"                ctxt, instance, src_compute_info, dst_compute_info,"},{"line_number":6123,"context_line":"                block_migration, disk_over_commit, claim.claimed_numa_topology)"},{"line_number":6124,"context_line":"        except (exception.MigrationPreCheckError,"},{"line_number":6125,"context_line":"                exception.InvalidSharedStorage, exception.InvalidLocalStorage):"},{"line_number":6126,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":6127,"context_line":"                # Only clean up if we\u0027ve claimed"},{"line_number":6128,"context_line":"                if src_can_numa_lm:"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_d426f7ba","line":6125,"range":{"start_line":6124,"start_character":8,"end_line":6125,"end_character":79},"updated":"2019-02-24 23:05:41.000000000","message":"Why not just handle Exception and always reset the Migration fields?","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":6121,"context_line":"            dest_check_data \u003d self.driver.check_can_live_migrate_destination("},{"line_number":6122,"context_line":"                ctxt, instance, src_compute_info, dst_compute_info,"},{"line_number":6123,"context_line":"                block_migration, disk_over_commit, claim.claimed_numa_topology)"},{"line_number":6124,"context_line":"        except (exception.MigrationPreCheckError,"},{"line_number":6125,"context_line":"                exception.InvalidSharedStorage, exception.InvalidLocalStorage):"},{"line_number":6126,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":6127,"context_line":"                # Only clean up if we\u0027ve claimed"},{"line_number":6128,"context_line":"                if src_can_numa_lm:"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_178f8f23","line":6125,"range":{"start_line":6124,"start_character":8,"end_line":6125,"end_character":79},"in_reply_to":"9fdfeff1_d426f7ba","updated":"2019-02-25 20:06:55.000000000","message":"Actually as I said in my rant on L6116, you\u0027re right, I don\u0027t think we need the cleanup - but we do need to drop the migration_context, as Alex says on L6131.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a366c036e4e08f60dbea70c2d8a80d752744c505","unresolved":false,"context_lines":[{"line_number":6123,"context_line":"                block_migration, disk_over_commit, claim.claimed_numa_topology)"},{"line_number":6124,"context_line":"        except (exception.MigrationPreCheckError,"},{"line_number":6125,"context_line":"                exception.InvalidSharedStorage, exception.InvalidLocalStorage):"},{"line_number":6126,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":6127,"context_line":"                # Only clean up if we\u0027ve claimed"},{"line_number":6128,"context_line":"                if src_can_numa_lm:"},{"line_number":6129,"context_line":"                    migration.dest_node \u003d None"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_f429bb88","line":6126,"range":{"start_line":6126,"start_character":52,"end_line":6126,"end_character":54},"updated":"2019-02-24 23:05:41.000000000","message":"nit: pass logger\u003dLOG here","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":6123,"context_line":"                block_migration, disk_over_commit, claim.claimed_numa_topology)"},{"line_number":6124,"context_line":"        except (exception.MigrationPreCheckError,"},{"line_number":6125,"context_line":"                exception.InvalidSharedStorage, exception.InvalidLocalStorage):"},{"line_number":6126,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":6127,"context_line":"                # Only clean up if we\u0027ve claimed"},{"line_number":6128,"context_line":"                if src_can_numa_lm:"},{"line_number":6129,"context_line":"                    migration.dest_node \u003d None"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_17622f3f","line":6126,"range":{"start_line":6126,"start_character":52,"end_line":6126,"end_character":54},"in_reply_to":"9fdfeff1_f429bb88","updated":"2019-02-25 20:06:55.000000000","message":"Done","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a366c036e4e08f60dbea70c2d8a80d752744c505","unresolved":false,"context_lines":[{"line_number":6126,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":6127,"context_line":"                # Only clean up if we\u0027ve claimed"},{"line_number":6128,"context_line":"                if src_can_numa_lm:"},{"line_number":6129,"context_line":"                    migration.dest_node \u003d None"},{"line_number":6130,"context_line":"                    migration.dest_compute \u003d None"},{"line_number":6131,"context_line":"                    migration.save()"},{"line_number":6132,"context_line":"        LOG.debug(\u0027destination check data is %s\u0027, dest_check_data)"},{"line_number":6133,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_3416634b","line":6130,"range":{"start_line":6129,"start_character":20,"end_line":6130,"end_character":49},"updated":"2019-02-24 23:05:41.000000000","message":"Technically you also want to wipe out dest_host:\n\nhttps://github.com/openstack/nova/blob/f77791954d8a39652ea30ccf51968886471de612/nova/compute/resource_tracker.py#L392\n\nAlthough I think that\u0027s only used by nova-network.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":6126,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":6127,"context_line":"                # Only clean up if we\u0027ve claimed"},{"line_number":6128,"context_line":"                if src_can_numa_lm:"},{"line_number":6129,"context_line":"                    migration.dest_node \u003d None"},{"line_number":6130,"context_line":"                    migration.dest_compute \u003d None"},{"line_number":6131,"context_line":"                    migration.save()"},{"line_number":6132,"context_line":"        LOG.debug(\u0027destination check data is %s\u0027, dest_check_data)"},{"line_number":6133,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_977dbf1d","line":6130,"range":{"start_line":6129,"start_character":20,"end_line":6130,"end_character":49},"in_reply_to":"9fdfeff1_3416634b","updated":"2019-02-25 20:06:55.000000000","message":"See L6125.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5ddbb96bf7d71d86dceaf57121934934eea66e69","unresolved":false,"context_lines":[{"line_number":6128,"context_line":"                if src_can_numa_lm:"},{"line_number":6129,"context_line":"                    migration.dest_node \u003d None"},{"line_number":6130,"context_line":"                    migration.dest_compute \u003d None"},{"line_number":6131,"context_line":"                    migration.save()"},{"line_number":6132,"context_line":"        LOG.debug(\u0027destination check data is %s\u0027, dest_check_data)"},{"line_number":6133,"context_line":"        try:"},{"line_number":6134,"context_line":"            migrate_data \u003d self.compute_rpcapi.\\"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_0db7923c","line":6131,"updated":"2019-02-25 06:18:57.000000000","message":"so we should drop the claim and migration context at here?","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":6128,"context_line":"                if src_can_numa_lm:"},{"line_number":6129,"context_line":"                    migration.dest_node \u003d None"},{"line_number":6130,"context_line":"                    migration.dest_compute \u003d None"},{"line_number":6131,"context_line":"                    migration.save()"},{"line_number":6132,"context_line":"        LOG.debug(\u0027destination check data is %s\u0027, dest_check_data)"},{"line_number":6133,"context_line":"        try:"},{"line_number":6134,"context_line":"            migrate_data \u003d self.compute_rpcapi.\\"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_9727ff12","line":6131,"in_reply_to":"9fdfeff1_0db7923c","updated":"2019-02-25 20:06:55.000000000","message":"Done","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":6793,"context_line":""},{"line_number":6794,"context_line":"        # NOTE(timello): make sure we update available resources on source"},{"line_number":6795,"context_line":"        # host even before next periodic task."},{"line_number":6796,"context_line":"        instance.drop_migration_context()"},{"line_number":6797,"context_line":"        self.update_available_resource(ctxt)"},{"line_number":6798,"context_line":""},{"line_number":6799,"context_line":"        self._update_scheduler_instance_info(ctxt, instance)"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_b7aec32b","line":6796,"updated":"2019-02-25 20:06:55.000000000","message":"This is actually wrong - we need to apply_migration_context() to save the new NUMA topology. I\u0027ve moved this to post_live_migration_at_destination, since that\u0027s where we currently update the instance state.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a366c036e4e08f60dbea70c2d8a80d752744c505","unresolved":false,"context_lines":[{"line_number":7011,"context_line":"        # It\u0027ll perform its own evaluation of do_cleanup. However, if the"},{"line_number":7012,"context_line":"        # destination isn\u0027t aware of NUMA LM, we need to preserve the old way"},{"line_number":7013,"context_line":"        # of calling it by checking do_cleanup ourselves."},{"line_number":7014,"context_line":"        # NOTE(artom) Depending on the virt driver, we might not have the"},{"line_number":7015,"context_line":"        # migration in migrate_data. Need to pull it from the DB to get the"},{"line_number":7016,"context_line":"        # destination."},{"line_number":7017,"context_line":"        migration \u003d objects.MigrationList.get_in_progress_by_instance("},{"line_number":7018,"context_line":"            context, instance.uuid)[0]"},{"line_number":7019,"context_line":"        dest_can_numa_lm \u003d self._supports_numa_lm(context,"},{"line_number":7020,"context_line":"                                                  migration.dest_compute)"},{"line_number":7021,"context_line":"        if do_cleanup or dest_can_numa_lm:"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_f44e9b6c","line":7018,"range":{"start_line":7014,"start_character":8,"end_line":7018,"end_character":38},"updated":"2019-02-24 23:05:41.000000000","message":"Ew, what? Why can\u0027t we use the migration variable already in scope in this method if it\u0027s not None and only fallback to this if we need to, or better yet move this up so we\u0027re always sure to get a migration so that we can also revert allocations.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":7011,"context_line":"        # It\u0027ll perform its own evaluation of do_cleanup. However, if the"},{"line_number":7012,"context_line":"        # destination isn\u0027t aware of NUMA LM, we need to preserve the old way"},{"line_number":7013,"context_line":"        # of calling it by checking do_cleanup ourselves."},{"line_number":7014,"context_line":"        # NOTE(artom) Depending on the virt driver, we might not have the"},{"line_number":7015,"context_line":"        # migration in migrate_data. Need to pull it from the DB to get the"},{"line_number":7016,"context_line":"        # destination."},{"line_number":7017,"context_line":"        migration \u003d objects.MigrationList.get_in_progress_by_instance("},{"line_number":7018,"context_line":"            context, instance.uuid)[0]"},{"line_number":7019,"context_line":"        dest_can_numa_lm \u003d self._supports_numa_lm(context,"},{"line_number":7020,"context_line":"                                                  migration.dest_compute)"},{"line_number":7021,"context_line":"        if do_cleanup or dest_can_numa_lm:"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_92ae2de5","line":7018,"range":{"start_line":7014,"start_character":8,"end_line":7018,"end_character":38},"in_reply_to":"9fdfeff1_f44e9b6c","updated":"2019-02-25 20:06:55.000000000","message":"\u003e or better yet move this up so we\u0027re always sure to get a\n \u003e migration so that we can also revert allocations.\n\nDone.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a366c036e4e08f60dbea70c2d8a80d752744c505","unresolved":false,"context_lines":[{"line_number":7061,"context_line":"    def rollback_live_migration_at_destination(self, context, instance,"},{"line_number":7062,"context_line":"                                               destroy_disks,"},{"line_number":7063,"context_line":"                                               migrate_data):"},{"line_number":7064,"context_line":"        \"\"\"Drop the MoveClaim that was created for the live migration, and if"},{"line_number":7065,"context_line":"        necessary clean up the image directory that was created by"},{"line_number":7066,"context_line":"        pre_live_migration."},{"line_number":7067,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_9455cffc","line":7064,"range":{"start_line":7064,"start_character":30,"end_line":7064,"end_character":47},"updated":"2019-02-24 23:05:41.000000000","message":"I would say \"(if one was created)\" since it\u0027s not going to happen for most cases.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":7061,"context_line":"    def rollback_live_migration_at_destination(self, context, instance,"},{"line_number":7062,"context_line":"                                               destroy_disks,"},{"line_number":7063,"context_line":"                                               migrate_data):"},{"line_number":7064,"context_line":"        \"\"\"Drop the MoveClaim that was created for the live migration, and if"},{"line_number":7065,"context_line":"        necessary clean up the image directory that was created by"},{"line_number":7066,"context_line":"        pre_live_migration."},{"line_number":7067,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_f2f3f907","line":7064,"range":{"start_line":7064,"start_character":30,"end_line":7064,"end_character":47},"in_reply_to":"9fdfeff1_9455cffc","updated":"2019-02-25 20:06:55.000000000","message":"It\u0027ll happen for all cases where the entire deployment is Stein.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a366c036e4e08f60dbea70c2d8a80d752744c505","unresolved":false,"context_lines":[{"line_number":7080,"context_line":"            phase\u003dfields.NotificationPhase.START)"},{"line_number":7081,"context_line":"        instance.drop_migration_context()"},{"line_number":7082,"context_line":"        # NOTE(artom) instance.host is still the source at this point."},{"line_number":7083,"context_line":"        if self._supports_numa_lm(context, instance.host):"},{"line_number":7084,"context_line":"            self.rt.drop_move_claim("},{"line_number":7085,"context_line":"                context, instance, self._get_nodename(instance),"},{"line_number":7086,"context_line":"                instance.flavor, prefix\u003d\u0027_new\u0027)"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_743aabc4","line":7083,"range":{"start_line":7083,"start_character":8,"end_line":7083,"end_character":58},"updated":"2019-02-24 23:05:41.000000000","message":"Can\u0027t we just check migrate_data to figure this out? i.e.:\n\nif migrate_data and \u0027dst_numa_config\u0027 in migrate_data:\n   ...","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":7080,"context_line":"            phase\u003dfields.NotificationPhase.START)"},{"line_number":7081,"context_line":"        instance.drop_migration_context()"},{"line_number":7082,"context_line":"        # NOTE(artom) instance.host is still the source at this point."},{"line_number":7083,"context_line":"        if self._supports_numa_lm(context, instance.host):"},{"line_number":7084,"context_line":"            self.rt.drop_move_claim("},{"line_number":7085,"context_line":"                context, instance, self._get_nodename(instance),"},{"line_number":7086,"context_line":"                instance.flavor, prefix\u003d\u0027_new\u0027)"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_52bbe50d","line":7083,"range":{"start_line":7083,"start_character":8,"end_line":7083,"end_character":58},"in_reply_to":"9fdfeff1_743aabc4","updated":"2019-02-25 20:06:55.000000000","message":"No, because even if there\u0027s no instance numa topology, we\u0027ll still claim assuming the deployment is all \u003e\u003d Stein.\n\nI\u0027ll actually rename _supports_numa_live_migration to clarify.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a366c036e4e08f60dbea70c2d8a80d752744c505","unresolved":false,"context_lines":[{"line_number":7083,"context_line":"        if self._supports_numa_lm(context, instance.host):"},{"line_number":7084,"context_line":"            self.rt.drop_move_claim("},{"line_number":7085,"context_line":"                context, instance, self._get_nodename(instance),"},{"line_number":7086,"context_line":"                instance.flavor, prefix\u003d\u0027_new\u0027)"},{"line_number":7087,"context_line":"        # NOTE(artom) Previous behaviour was to call us only if do_cleanup"},{"line_number":7088,"context_line":"        # evaluated to true on the source. If the source understands NUMA LM,"},{"line_number":7089,"context_line":"        # it will call us regardless so that we can drop the claim and"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_d474b79e","line":7086,"range":{"start_line":7086,"start_character":33,"end_line":7086,"end_character":46},"updated":"2019-02-24 23:05:41.000000000","message":"Don\u0027t specify this, it\u0027s confusing as there is no new_flavor for live migration. Besides, this isn\u0027t used anyway if a flavor is passed in.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":7083,"context_line":"        if self._supports_numa_lm(context, instance.host):"},{"line_number":7084,"context_line":"            self.rt.drop_move_claim("},{"line_number":7085,"context_line":"                context, instance, self._get_nodename(instance),"},{"line_number":7086,"context_line":"                instance.flavor, prefix\u003d\u0027_new\u0027)"},{"line_number":7087,"context_line":"        # NOTE(artom) Previous behaviour was to call us only if do_cleanup"},{"line_number":7088,"context_line":"        # evaluated to true on the source. If the source understands NUMA LM,"},{"line_number":7089,"context_line":"        # it will call us regardless so that we can drop the claim and"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_d2235557","line":7086,"range":{"start_line":7086,"start_character":33,"end_line":7086,"end_character":46},"in_reply_to":"9fdfeff1_d474b79e","updated":"2019-02-25 20:06:55.000000000","message":"We still need to drop claimed resources for new_numa_topology.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a366c036e4e08f60dbea70c2d8a80d752744c505","unresolved":false,"context_lines":[{"line_number":7084,"context_line":"            self.rt.drop_move_claim("},{"line_number":7085,"context_line":"                context, instance, self._get_nodename(instance),"},{"line_number":7086,"context_line":"                instance.flavor, prefix\u003d\u0027_new\u0027)"},{"line_number":7087,"context_line":"        # NOTE(artom) Previous behaviour was to call us only if do_cleanup"},{"line_number":7088,"context_line":"        # evaluated to true on the source. If the source understands NUMA LM,"},{"line_number":7089,"context_line":"        # it will call us regardless so that we can drop the claim and"},{"line_number":7090,"context_line":"        # migration context. In such a case, we need to re-evaluate do_cleanup"},{"line_number":7091,"context_line":"        # ourselves."},{"line_number":7092,"context_line":"        do_cleanup, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":7093,"context_line":"                migrate_data)"},{"line_number":7094,"context_line":"        if do_cleanup:"},{"line_number":7095,"context_line":"            self._do_rollback_live_migration_at_destination(context, instance,"},{"line_number":7096,"context_line":"                                                            destroy_disks,"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_f4777b9e","line":7093,"range":{"start_line":7087,"start_character":8,"end_line":7093,"end_character":29},"updated":"2019-02-24 23:05:41.000000000","message":"eww - can\u0027t we just update the rpc method signature so the source can tell the dest what to do?","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":7084,"context_line":"            self.rt.drop_move_claim("},{"line_number":7085,"context_line":"                context, instance, self._get_nodename(instance),"},{"line_number":7086,"context_line":"                instance.flavor, prefix\u003d\u0027_new\u0027)"},{"line_number":7087,"context_line":"        # NOTE(artom) Previous behaviour was to call us only if do_cleanup"},{"line_number":7088,"context_line":"        # evaluated to true on the source. If the source understands NUMA LM,"},{"line_number":7089,"context_line":"        # it will call us regardless so that we can drop the claim and"},{"line_number":7090,"context_line":"        # migration context. In such a case, we need to re-evaluate do_cleanup"},{"line_number":7091,"context_line":"        # ourselves."},{"line_number":7092,"context_line":"        do_cleanup, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":7093,"context_line":"                migrate_data)"},{"line_number":7094,"context_line":"        if do_cleanup:"},{"line_number":7095,"context_line":"            self._do_rollback_live_migration_at_destination(context, instance,"},{"line_number":7096,"context_line":"                                                            destroy_disks,"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_52ec45f3","line":7093,"range":{"start_line":7087,"start_character":8,"end_line":7093,"end_character":29},"in_reply_to":"9fdfeff1_f4777b9e","updated":"2019-02-25 20:06:55.000000000","message":"Err, yeah, a new source can just add a \"do_cleanup\" param. Done.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3ad5d450be75e8d55fed7f137e6e31a419377bb9","unresolved":false,"context_lines":[{"line_number":6089,"context_line":"        :returns: A boolean indicating whether nova-compute on host performs"},{"line_number":6090,"context_line":"                  live migration claims."},{"line_number":6091,"context_line":"        \"\"\""},{"line_number":6092,"context_line":"        srv \u003d objects.Service.get_by_compute_host(context, host)"},{"line_number":6093,"context_line":"        return srv.version \u003e 38"},{"line_number":6094,"context_line":""},{"line_number":6095,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":31,"id":"9fdfeff1_8a133fb8","line":6092,"updated":"2019-02-26 17:19:03.000000000","message":"Note that this will become a bug in a cross-cell-live-migration future. It would be a lot better if we could get a positive signal from each side that they\u0027re planning to do that thing. Caching of the service_version value could also cause one side to make a different decision.","commit_id":"999de0a28024e13dcec3981a74b63e9a9346e0cc"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3ad5d450be75e8d55fed7f137e6e31a419377bb9","unresolved":false,"context_lines":[{"line_number":6960,"context_line":"            migration \u003d migrate_data.migration"},{"line_number":6961,"context_line":"        else:"},{"line_number":6962,"context_line":"            migration \u003d objects.MigrationList.get_in_progress_by_instance("},{"line_number":6963,"context_line":"                context, instance.uuid)[0]"},{"line_number":6964,"context_line":"        self._revert_allocation(context, instance, migration)"},{"line_number":6965,"context_line":""},{"line_number":6966,"context_line":"        instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":31,"id":"9fdfeff1_6a5cdb7c","line":6963,"updated":"2019-02-26 17:19:03.000000000","message":"This is potentially dangerous and lossy, as we\u0027re not guaranteed to have only one of these in progress if there have been failures. Why do you even need this? If the code is all new-path then you should be getting migration passed always no?","commit_id":"999de0a28024e13dcec3981a74b63e9a9346e0cc"},{"author":{"_account_id":19156,"name":"Leehom Li","email":"feli5_li@163.com","username":"leehom"},"change_message_id":"08475d49f5bb1dc411beeaf084c85448ec6901b6","unresolved":false,"context_lines":[{"line_number":6151,"context_line":"                               and migrate_data.instance_numa_topology)"},{"line_number":6152,"context_line":"        if numa_live_migration and migration:"},{"line_number":6153,"context_line":"            try:"},{"line_number":6154,"context_line":"                claim \u003d self.rt.live_migration_claim("},{"line_number":6155,"context_line":"                    ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6156,"context_line":"                    limits)"},{"line_number":6157,"context_line":"                LOG.debug(\u0027Created live migration claim %s\u0027, claim)"}],"source_content_type":"text/x-python","patch_set":37,"id":"9fb8cfa7_636a2781","line":6154,"updated":"2019-06-05 07:17:05.000000000","message":"Except for numa live migration, should we also add claim for common live migration?","commit_id":"0633b9f4df074f49875251469708180fb049a6a4"},{"author":{"_account_id":19124,"name":"Gerry Kopec","email":"gerry.kopec@windriver.com","username":"gkopec"},"change_message_id":"d8b49f4fdaf4d3083c52696a61a21180841c200c","unresolved":false,"context_lines":[{"line_number":6922,"context_line":"            except exception.ComputeHostNotFound:"},{"line_number":6923,"context_line":"                LOG.exception(\u0027Failed to get compute_info for %s\u0027, self.host)"},{"line_number":6924,"context_line":"            finally:"},{"line_number":6925,"context_line":"                instance.apply_migration_context()"},{"line_number":6926,"context_line":"                instance.host \u003d self.host"},{"line_number":6927,"context_line":"                instance.power_state \u003d current_power_state"},{"line_number":6928,"context_line":"                instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":37,"id":"5fc1f717_f4cafb4b","line":6925,"updated":"2019-03-13 21:53:04.000000000","message":"When testing this, was seeing issue that migration context was not applied after live migration was done.  It does apply here but is being reverted on the source side when it does a call to driver.cleanup() which does another instance.save() with the old/stale numa_topology.\n\nAdding an instance.refresh() after return from post_live_migration_at_destination() resolved the issue.","commit_id":"0633b9f4df074f49875251469708180fb049a6a4"},{"author":{"_account_id":19156,"name":"Leehom Li","email":"feli5_li@163.com","username":"leehom"},"change_message_id":"817826df8d444698ede048df489a57e2380c32ed","unresolved":false,"context_lines":[{"line_number":6922,"context_line":"            except exception.ComputeHostNotFound:"},{"line_number":6923,"context_line":"                LOG.exception(\u0027Failed to get compute_info for %s\u0027, self.host)"},{"line_number":6924,"context_line":"            finally:"},{"line_number":6925,"context_line":"                instance.apply_migration_context()"},{"line_number":6926,"context_line":"                instance.host \u003d self.host"},{"line_number":6927,"context_line":"                instance.power_state \u003d current_power_state"},{"line_number":6928,"context_line":"                instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":37,"id":"9fb8cfa7_5f02dd3e","line":6925,"in_reply_to":"5fc1f717_f4cafb4b","updated":"2019-06-12 02:54:56.000000000","message":"I also encountered this issue. Seems call instance.refresh() before call self.compute_rpcapi.live_migration is a good approach","commit_id":"0633b9f4df074f49875251469708180fb049a6a4"},{"author":{"_account_id":19124,"name":"Gerry Kopec","email":"gerry.kopec@windriver.com","username":"gkopec"},"change_message_id":"24b33975d1180723d8e7654358c3c5508e2da3ff","unresolved":false,"context_lines":[{"line_number":6922,"context_line":"            except exception.ComputeHostNotFound:"},{"line_number":6923,"context_line":"                LOG.exception(\u0027Failed to get compute_info for %s\u0027, self.host)"},{"line_number":6924,"context_line":"            finally:"},{"line_number":6925,"context_line":"                instance.apply_migration_context()"},{"line_number":6926,"context_line":"                instance.host \u003d self.host"},{"line_number":6927,"context_line":"                instance.power_state \u003d current_power_state"},{"line_number":6928,"context_line":"                instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":37,"id":"9fb8cfa7_82075eca","line":6925,"in_reply_to":"9fb8cfa7_1a4313b1","updated":"2019-06-15 00:30:56.000000000","message":"Would agree that passing changed instance back would work for sure.","commit_id":"0633b9f4df074f49875251469708180fb049a6a4"},{"author":{"_account_id":19156,"name":"Leehom Li","email":"feli5_li@163.com","username":"leehom"},"change_message_id":"052639ed1ed6cd1b3fa93d37c086f7a3be33e335","unresolved":false,"context_lines":[{"line_number":6922,"context_line":"            except exception.ComputeHostNotFound:"},{"line_number":6923,"context_line":"                LOG.exception(\u0027Failed to get compute_info for %s\u0027, self.host)"},{"line_number":6924,"context_line":"            finally:"},{"line_number":6925,"context_line":"                instance.apply_migration_context()"},{"line_number":6926,"context_line":"                instance.host \u003d self.host"},{"line_number":6927,"context_line":"                instance.power_state \u003d current_power_state"},{"line_number":6928,"context_line":"                instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":37,"id":"9fb8cfa7_1a4313b1","line":6925,"in_reply_to":"9fb8cfa7_5f02dd3e","updated":"2019-06-12 04:52:59.000000000","message":"Not work either, there is a race condition, the instance may be not really saved to DB, when call instance.refresh().\nBest way to do this is pas changed instance out.","commit_id":"0633b9f4df074f49875251469708180fb049a6a4"},{"author":{"_account_id":19124,"name":"Gerry Kopec","email":"gerry.kopec@windriver.com","username":"gkopec"},"change_message_id":"d8b49f4fdaf4d3083c52696a61a21180841c200c","unresolved":false,"context_lines":[{"line_number":6928,"context_line":"                instance.task_state \u003d None"},{"line_number":6929,"context_line":"                instance.node \u003d node_name"},{"line_number":6930,"context_line":"                instance.progress \u003d 0"},{"line_number":6931,"context_line":"                instance.save(expected_task_state\u003dtask_states.MIGRATING)"},{"line_number":6932,"context_line":""},{"line_number":6933,"context_line":"        # NOTE(tr3buchet): tear down networks on source host (nova-net)"},{"line_number":6934,"context_line":"        # NOTE(mriedem): For neutron, this will delete any inactive source"}],"source_content_type":"text/x-python","patch_set":37,"id":"5fc1f717_e3954d41","line":6931,"updated":"2019-03-13 21:53:04.000000000","message":"You could drop_migration_context at this point.","commit_id":"0633b9f4df074f49875251469708180fb049a6a4"},{"author":{"_account_id":19156,"name":"Leehom Li","email":"feli5_li@163.com","username":"leehom"},"change_message_id":"7cba4ccecfa374f679cccc6fcdffed266ba16f22","unresolved":false,"context_lines":[{"line_number":6928,"context_line":"                instance.task_state \u003d None"},{"line_number":6929,"context_line":"                instance.node \u003d node_name"},{"line_number":6930,"context_line":"                instance.progress \u003d 0"},{"line_number":6931,"context_line":"                instance.save(expected_task_state\u003dtask_states.MIGRATING)"},{"line_number":6932,"context_line":""},{"line_number":6933,"context_line":"        # NOTE(tr3buchet): tear down networks on source host (nova-net)"},{"line_number":6934,"context_line":"        # NOTE(mriedem): For neutron, this will delete any inactive source"}],"source_content_type":"text/x-python","patch_set":37,"id":"9fb8cfa7_f47201ad","line":6931,"in_reply_to":"5fc1f717_e3954d41","updated":"2019-06-10 09:49:38.000000000","message":"Not here. drop_move_claim should be called at source","commit_id":"0633b9f4df074f49875251469708180fb049a6a4"},{"author":{"_account_id":19156,"name":"Leehom Li","email":"feli5_li@163.com","username":"leehom"},"change_message_id":"2241c99f8f8a7a802d7aae1f398b40f097e29977","unresolved":false,"context_lines":[{"line_number":7094,"context_line":"            except exception.ComputeHostNotFound:"},{"line_number":7095,"context_line":"                LOG.exception(\u0027Failed to get compute_info for %s\u0027, self.host)"},{"line_number":7096,"context_line":"            finally:"},{"line_number":7097,"context_line":"                instance.apply_migration_context()"},{"line_number":7098,"context_line":"                instance.host \u003d self.host"},{"line_number":7099,"context_line":"                instance.power_state \u003d current_power_state"},{"line_number":7100,"context_line":"                instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":38,"id":"9fb8cfa7_7c531818","line":7097,"updated":"2019-06-13 01:03:56.000000000","message":"Must come out a solution to update instance before apply_migration_context. As updated instance (contain migration_context) is not passed back to Nova-conductor.\nSo when really doing live-migration, instance.migration_context is None. As a result instance.apply_migration_context() has no effect, and neither instance.drop_migration_context nor instance.revert_migration_context.neither","commit_id":"f3eaf17aef0c9fda016808197f680ff314e8d17a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"084194ffb6b8196f587a299d3c44f40c906ab0e3","unresolved":false,"context_lines":[{"line_number":7094,"context_line":"            except exception.ComputeHostNotFound:"},{"line_number":7095,"context_line":"                LOG.exception(\u0027Failed to get compute_info for %s\u0027, self.host)"},{"line_number":7096,"context_line":"            finally:"},{"line_number":7097,"context_line":"                instance.apply_migration_context()"},{"line_number":7098,"context_line":"                instance.host \u003d self.host"},{"line_number":7099,"context_line":"                instance.power_state \u003d current_power_state"},{"line_number":7100,"context_line":"                instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_ef65031f","line":7097,"in_reply_to":"9fb8cfa7_7c531818","updated":"2019-07-17 20:12:45.000000000","message":"What was happening was the destination was applying the migraiton context and saving, but then, as Gerry pointed out, the source was cleaning up and saving as well [1], thus overriding the new NUMA topology from the migration context. I fixed this by adding an instance.refresh() before calling driver.cleanup(),\n\n[1] https://review.opendev.org/#/c/634606/38/nova/virt/libvirt/driver.py@1211","commit_id":"f3eaf17aef0c9fda016808197f680ff314e8d17a"},{"author":{"_account_id":19156,"name":"Leehom Li","email":"feli5_li@163.com","username":"leehom"},"change_message_id":"2241c99f8f8a7a802d7aae1f398b40f097e29977","unresolved":false,"context_lines":[{"line_number":7297,"context_line":"            instance.drop_migration_context()"},{"line_number":7298,"context_line":"            self.rt.drop_move_claim("},{"line_number":7299,"context_line":"                context, instance, self._get_nodename(instance),"},{"line_number":7300,"context_line":"                instance.flavor, prefix\u003d\u0027_new\u0027)"},{"line_number":7301,"context_line":"        if do_cleanup:"},{"line_number":7302,"context_line":"            self._do_rollback_live_migration_at_destination(context, instance,"},{"line_number":7303,"context_line":"                                                            destroy_disks,"}],"source_content_type":"text/x-python","patch_set":38,"id":"9fb8cfa7_dc6c84cf","line":7300,"updated":"2019-06-13 01:03:56.000000000","message":"Seems should be \"new_\"?","commit_id":"f3eaf17aef0c9fda016808197f680ff314e8d17a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"084194ffb6b8196f587a299d3c44f40c906ab0e3","unresolved":false,"context_lines":[{"line_number":7297,"context_line":"            instance.drop_migration_context()"},{"line_number":7298,"context_line":"            self.rt.drop_move_claim("},{"line_number":7299,"context_line":"                context, instance, self._get_nodename(instance),"},{"line_number":7300,"context_line":"                instance.flavor, prefix\u003d\u0027_new\u0027)"},{"line_number":7301,"context_line":"        if do_cleanup:"},{"line_number":7302,"context_line":"            self._do_rollback_live_migration_at_destination(context, instance,"},{"line_number":7303,"context_line":"                                                            destroy_disks,"}],"source_content_type":"text/x-python","patch_set":38,"id":"7faddb67_2f91dbf1","line":7300,"in_reply_to":"9fb8cfa7_dc6c84cf","updated":"2019-07-17 20:12:45.000000000","message":"Done","commit_id":"f3eaf17aef0c9fda016808197f680ff314e8d17a"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"a3ab7a07e1a1aa4b70ce9aa9e42d19d85ac69b85","unresolved":false,"context_lines":[{"line_number":6430,"context_line":"            self._get_compute_info(ctxt, instance.host))"},{"line_number":6431,"context_line":"        dst_compute_info \u003d obj_base.obj_to_primitive("},{"line_number":6432,"context_line":"            self._get_compute_info(ctxt, CONF.host))"},{"line_number":6433,"context_line":"        dest_check_data \u003d self.driver.check_can_live_migrate_destination(ctxt,"},{"line_number":6434,"context_line":"            instance, src_compute_info, dst_compute_info,"},{"line_number":6435,"context_line":"            block_migration, disk_over_commit)"},{"line_number":6436,"context_line":"        LOG.debug(\u0027destination check data is %s\u0027, dest_check_data)"},{"line_number":6437,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":44,"id":"7faddb67_3d27bccc","line":6434,"range":{"start_line":6433,"start_character":8,"end_line":6434,"end_character":57},"updated":"2019-07-19 06:38:39.000000000","message":"Hi Artom, can we move the claim before this method? According to the vpmem implement discussion, we decided to put the destination vpmem into the migrate_data, so I need to return the dst vpmems in \u0027self.driver.check_can_live_migrate_destination\u0027, that means I should claim the vpmem before that.","commit_id":"835d4c3adb716dc137950520b556cc785b0356fc"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5477c345c4e244cd885bf9834c86eb558d460bae","unresolved":false,"context_lines":[{"line_number":6478,"context_line":"            except exception.ComputeResourcesUnavailable as e:"},{"line_number":6479,"context_line":"                raise exception.MigrationPreCheckError("},{"line_number":6480,"context_line":"                    reason\u003de.format_message())"},{"line_number":6481,"context_line":"            migrate_data.dst_numa_config \u003d self.driver.get_dst_numa_config("},{"line_number":6482,"context_line":"                claim.claimed_numa_topology, instance.flavor,"},{"line_number":6483,"context_line":"                instance.image_meta)"},{"line_number":6484,"context_line":"        return migrate_data"},{"line_number":6485,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"7faddb67_1d01a006","line":6482,"range":{"start_line":6481,"start_character":12,"end_line":6482,"end_character":61},"updated":"2019-07-19 06:42:34.000000000","message":"ah, I see, what we need to for vpmem and numa is the same thing.  But I don\u0027t think we need to add separate virt driver interface for vpmem and numa. Can we just use the \u0027self.driver.check_can_live_migrate_destination\u0027?","commit_id":"835d4c3adb716dc137950520b556cc785b0356fc"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"047b8dbf4a77e6ea0caf312528fe1e06453c7a4f","unresolved":false,"context_lines":[{"line_number":6478,"context_line":"            except exception.ComputeResourcesUnavailable as e:"},{"line_number":6479,"context_line":"                raise exception.MigrationPreCheckError("},{"line_number":6480,"context_line":"                    reason\u003de.format_message())"},{"line_number":6481,"context_line":"            migrate_data.dst_numa_config \u003d self.driver.get_dst_numa_config("},{"line_number":6482,"context_line":"                claim.claimed_numa_topology, instance.flavor,"},{"line_number":6483,"context_line":"                instance.image_meta)"},{"line_number":6484,"context_line":"        return migrate_data"},{"line_number":6485,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"7faddb67_ae4e1094","line":6482,"range":{"start_line":6481,"start_character":12,"end_line":6482,"end_character":61},"in_reply_to":"7faddb67_1d01a006","updated":"2019-07-19 12:02:47.000000000","message":"We\u0027re stuck with some dependencies here, so I don\u0027t think we can. Here\u0027s the current flow to explain why:\n\n1. driver.check_can_live_migrate_destination\n\n2. source_manager.check_can_live_migrate_source\n   is passed dest_check_data from step 1\n\n3. claim\n   depends on migrate_data.instance_numa_topology from\n   step 2. In the future we could break the dependency by\n   just checking instance.numa_topology, but for now we need\n   to account for old computes that don\u0027t support NUMA LM.\n\n4. driver.get_dst_numa_config\n   needs the claimed_numa_topology from the claim in step 3\n\nI understand your suggestion, and it\u0027s a good one, but looks like we\u0027re stuck with the current flow for now.\n\nLet me know if I missed anything :)","commit_id":"835d4c3adb716dc137950520b556cc785b0356fc"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e590e7b9ba28c132ddf11be77c7d00a0aafbafc5","unresolved":false,"context_lines":[{"line_number":6484,"context_line":"        :returns: migrate_data with dst_numa_config set if necessary"},{"line_number":6485,"context_line":"        \"\"\""},{"line_number":6486,"context_line":"        numa_live_migration \u003d (\u0027instance_numa_topology\u0027 in migrate_data and"},{"line_number":6487,"context_line":"                               migrate_data.instance_numa_topology)"},{"line_number":6488,"context_line":"        if numa_live_migration and migration:"},{"line_number":6489,"context_line":"            try:"},{"line_number":6490,"context_line":"                claim \u003d self.rt.live_migration_claim("}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_d5c1df4f","line":6487,"range":{"start_line":6487,"start_character":31,"end_line":6487,"end_character":66},"updated":"2019-08-16 18:31:47.000000000","message":"Again, I did not see where this would actually ever be set to None, but maybe I\u0027m confusing some of the new fields or something?","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":6484,"context_line":"        :returns: migrate_data with dst_numa_config set if necessary"},{"line_number":6485,"context_line":"        \"\"\""},{"line_number":6486,"context_line":"        numa_live_migration \u003d (\u0027instance_numa_topology\u0027 in migrate_data and"},{"line_number":6487,"context_line":"                               migrate_data.instance_numa_topology)"},{"line_number":6488,"context_line":"        if numa_live_migration and migration:"},{"line_number":6489,"context_line":"            try:"},{"line_number":6490,"context_line":"                claim \u003d self.rt.live_migration_claim("}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_b3a726bd","line":6487,"range":{"start_line":6487,"start_character":31,"end_line":6487,"end_character":66},"in_reply_to":"7faddb67_d5c1df4f","updated":"2019-08-23 21:26:51.000000000","message":"Done","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e590e7b9ba28c132ddf11be77c7d00a0aafbafc5","unresolved":false,"context_lines":[{"line_number":6485,"context_line":"        \"\"\""},{"line_number":6486,"context_line":"        numa_live_migration \u003d (\u0027instance_numa_topology\u0027 in migrate_data and"},{"line_number":6487,"context_line":"                               migrate_data.instance_numa_topology)"},{"line_number":6488,"context_line":"        if numa_live_migration and migration:"},{"line_number":6489,"context_line":"            try:"},{"line_number":6490,"context_line":"                claim \u003d self.rt.live_migration_claim("},{"line_number":6491,"context_line":"                    ctxt, instance, self._get_nodename(instance), migration,"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_75a02ba6","line":6488,"range":{"start_line":6488,"start_character":35,"end_line":6488,"end_character":44},"updated":"2019-08-16 18:31:47.000000000","message":"When will/can this ever be falsey?","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":6485,"context_line":"        \"\"\""},{"line_number":6486,"context_line":"        numa_live_migration \u003d (\u0027instance_numa_topology\u0027 in migrate_data and"},{"line_number":6487,"context_line":"                               migrate_data.instance_numa_topology)"},{"line_number":6488,"context_line":"        if numa_live_migration and migration:"},{"line_number":6489,"context_line":"            try:"},{"line_number":6490,"context_line":"                claim \u003d self.rt.live_migration_claim("},{"line_number":6491,"context_line":"                    ctxt, instance, self._get_nodename(instance), migration,"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_33c6d66a","line":6488,"range":{"start_line":6488,"start_character":35,"end_line":6488,"end_character":44},"in_reply_to":"7faddb67_75a02ba6","updated":"2019-08-23 21:26:51.000000000","message":"It can\u0027t, I was being overly safe.","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e590e7b9ba28c132ddf11be77c7d00a0aafbafc5","unresolved":false,"context_lines":[{"line_number":6490,"context_line":"                claim \u003d self.rt.live_migration_claim("},{"line_number":6491,"context_line":"                    ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6492,"context_line":"                    limits)"},{"line_number":6493,"context_line":"                LOG.debug(\u0027Created live migration claim %s\u0027, claim)"},{"line_number":6494,"context_line":"            except exception.ComputeResourcesUnavailable as e:"},{"line_number":6495,"context_line":"                raise exception.MigrationPreCheckError("},{"line_number":6496,"context_line":"                    reason\u003de.format_message())"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_35a633c2","line":6493,"updated":"2019-08-16 18:31:47.000000000","message":"instance\u003d","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":6490,"context_line":"                claim \u003d self.rt.live_migration_claim("},{"line_number":6491,"context_line":"                    ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6492,"context_line":"                    limits)"},{"line_number":6493,"context_line":"                LOG.debug(\u0027Created live migration claim %s\u0027, claim)"},{"line_number":6494,"context_line":"            except exception.ComputeResourcesUnavailable as e:"},{"line_number":6495,"context_line":"                raise exception.MigrationPreCheckError("},{"line_number":6496,"context_line":"                    reason\u003de.format_message())"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_339b3674","line":6493,"in_reply_to":"7faddb67_35a633c2","updated":"2019-08-23 21:26:51.000000000","message":"Done","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e590e7b9ba28c132ddf11be77c7d00a0aafbafc5","unresolved":false,"context_lines":[{"line_number":6494,"context_line":"            except exception.ComputeResourcesUnavailable as e:"},{"line_number":6495,"context_line":"                raise exception.MigrationPreCheckError("},{"line_number":6496,"context_line":"                    reason\u003de.format_message())"},{"line_number":6497,"context_line":"            migrate_data \u003d self.driver.post_claim_migrate_data("},{"line_number":6498,"context_line":"                ctxt, instance, migrate_data, claim)"},{"line_number":6499,"context_line":"        return migrate_data"},{"line_number":6500,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_f593bb5a","line":6497,"updated":"2019-08-16 18:31:47.000000000","message":"This method is named such that it looks like it will always be called post-claim. If I\u0027m one of the other drivers I may want to use that for something. However, you\u0027re only calling it at all if L6486 indicates there is NUMAness going on...","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":6494,"context_line":"            except exception.ComputeResourcesUnavailable as e:"},{"line_number":6495,"context_line":"                raise exception.MigrationPreCheckError("},{"line_number":6496,"context_line":"                    reason\u003de.format_message())"},{"line_number":6497,"context_line":"            migrate_data \u003d self.driver.post_claim_migrate_data("},{"line_number":6498,"context_line":"                ctxt, instance, migrate_data, claim)"},{"line_number":6499,"context_line":"        return migrate_data"},{"line_number":6500,"context_line":""}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_f3027e72","line":6497,"in_reply_to":"7faddb67_f593bb5a","updated":"2019-08-23 21:26:51.000000000","message":"Yeah, but I don\u0027t think there\u0027s a way around it. I was at first thinking \"let\u0027s always do the claim\", but we can\u0027t do that because if the source host isn\u0027t new enough, we\u0027d end up claiming resources we won\u0027t use because the XML won\u0027t get updated.\n\nSo I was thinking do the \u0027if numa_topology in migrate_data\u0027 check in Train, then drop it in U and start always doing the claim, and calling post_claim_migrate_data, whose name would start making more sense.\n\nWe could also just go back to driver.get_dst_numa_config, and if we ever need to generalize we can cross that bridge when we get there, but maybe that\u0027s needless driver API churn.","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e590e7b9ba28c132ddf11be77c7d00a0aafbafc5","unresolved":false,"context_lines":[{"line_number":7162,"context_line":""},{"line_number":7163,"context_line":"        if do_cleanup:"},{"line_number":7164,"context_line":"            # NOTE(artom) By this time the destination should have applied the"},{"line_number":7165,"context_line":"            # migration context and saved the instance. Some drivers will"},{"line_number":7166,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7167,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7168,"context_line":"            # object, refresh it."},{"line_number":7169,"context_line":"            instance.refresh()"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_958e072c","line":7166,"range":{"start_line":7165,"start_character":56,"end_line":7166,"end_character":67},"updated":"2019-08-16 18:31:47.000000000","message":"Just to be clear, if you mean the driver on the local node, then your instance is not out of date. If you mean the instance may have been changed on the other node and save()d, then, yes, this is a good idea. However, you want to make sure you\u0027re not refresh()ing in data/config that the other side has calculated for this and then un-claim a destination-sized amount of resources on the source node or something.","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":7162,"context_line":""},{"line_number":7163,"context_line":"        if do_cleanup:"},{"line_number":7164,"context_line":"            # NOTE(artom) By this time the destination should have applied the"},{"line_number":7165,"context_line":"            # migration context and saved the instance. Some drivers will"},{"line_number":7166,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7167,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7168,"context_line":"            # object, refresh it."},{"line_number":7169,"context_line":"            instance.refresh()"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_9321caff","line":7166,"range":{"start_line":7165,"start_character":56,"end_line":7166,"end_character":67},"in_reply_to":"7faddb67_958e072c","updated":"2019-08-23 21:26:51.000000000","message":"The dest applies the migration context on its instance object - settings fields to their \u0027new_\u0027-prefix\u0027ed values - and calls save().\n\nThe local source driver has not applied anything and has the previous fields in its instance object. It calls save() and overwrites the fields updated by apply_migration_context() with the old values.\n\nThis is what this is intended to prevent.","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e590e7b9ba28c132ddf11be77c7d00a0aafbafc5","unresolved":false,"context_lines":[{"line_number":7411,"context_line":"        # NOTE(artom) Before NUMA live migration and the resource claim it"},{"line_number":7412,"context_line":"        # does, we only called rollback_live_migration_at_destination if"},{"line_number":7413,"context_line":"        # do_cleanup was True. Now, if the destination did a claim, we need to"},{"line_number":7414,"context_line":"        # call rlmad() regardless to ensure it drops the claim and migration"},{"line_number":7415,"context_line":"        # context that was created. We pass it do_cleanup to tell it wether an"},{"line_number":7416,"context_line":"        # old-style cleanup is necessary. However, if the destination isn\u0027t"},{"line_number":7417,"context_line":"        # aware of NUMA live migration, we need to preserve the old way of"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_b5722349","line":7414,"range":{"start_line":7414,"start_character":15,"end_line":7414,"end_character":22},"updated":"2019-08-16 18:31:47.000000000","message":"Just say \"it\" here, otherwise someone might go grep\u0027ing for this method name.","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":7411,"context_line":"        # NOTE(artom) Before NUMA live migration and the resource claim it"},{"line_number":7412,"context_line":"        # does, we only called rollback_live_migration_at_destination if"},{"line_number":7413,"context_line":"        # do_cleanup was True. Now, if the destination did a claim, we need to"},{"line_number":7414,"context_line":"        # call rlmad() regardless to ensure it drops the claim and migration"},{"line_number":7415,"context_line":"        # context that was created. We pass it do_cleanup to tell it wether an"},{"line_number":7416,"context_line":"        # old-style cleanup is necessary. However, if the destination isn\u0027t"},{"line_number":7417,"context_line":"        # aware of NUMA live migration, we need to preserve the old way of"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_33e1f69c","line":7414,"range":{"start_line":7414,"start_character":15,"end_line":7414,"end_character":22},"in_reply_to":"7faddb67_b5722349","updated":"2019-08-23 21:26:51.000000000","message":"Done","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e590e7b9ba28c132ddf11be77c7d00a0aafbafc5","unresolved":false,"context_lines":[{"line_number":7412,"context_line":"        # does, we only called rollback_live_migration_at_destination if"},{"line_number":7413,"context_line":"        # do_cleanup was True. Now, if the destination did a claim, we need to"},{"line_number":7414,"context_line":"        # call rlmad() regardless to ensure it drops the claim and migration"},{"line_number":7415,"context_line":"        # context that was created. We pass it do_cleanup to tell it wether an"},{"line_number":7416,"context_line":"        # old-style cleanup is necessary. However, if the destination isn\u0027t"},{"line_number":7417,"context_line":"        # aware of NUMA live migration, we need to preserve the old way of"},{"line_number":7418,"context_line":"        # calling it by checking do_cleanup ourselves."}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_d56f9f5d","line":7415,"range":{"start_line":7415,"start_character":69,"end_line":7415,"end_character":75},"updated":"2019-08-16 18:31:47.000000000","message":"whether","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":7412,"context_line":"        # does, we only called rollback_live_migration_at_destination if"},{"line_number":7413,"context_line":"        # do_cleanup was True. Now, if the destination did a claim, we need to"},{"line_number":7414,"context_line":"        # call rlmad() regardless to ensure it drops the claim and migration"},{"line_number":7415,"context_line":"        # context that was created. We pass it do_cleanup to tell it wether an"},{"line_number":7416,"context_line":"        # old-style cleanup is necessary. However, if the destination isn\u0027t"},{"line_number":7417,"context_line":"        # aware of NUMA live migration, we need to preserve the old way of"},{"line_number":7418,"context_line":"        # calling it by checking do_cleanup ourselves."}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_f3ecbe93","line":7415,"range":{"start_line":7415,"start_character":69,"end_line":7415,"end_character":75},"in_reply_to":"7faddb67_d56f9f5d","updated":"2019-08-23 21:26:51.000000000","message":"Done","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e590e7b9ba28c132ddf11be77c7d00a0aafbafc5","unresolved":false,"context_lines":[{"line_number":7419,"context_line":"        numa_live_migration \u003d (\u0027dst_numa_config\u0027 in migrate_data and"},{"line_number":7420,"context_line":"                               migrate_data.dst_numa_config)"},{"line_number":7421,"context_line":"        if do_cleanup or numa_live_migration:"},{"line_number":7422,"context_line":"            self.compute_rpcapi.rollback_live_migration_at_destination("},{"line_number":7423,"context_line":"                    context, instance, dest, destroy_disks\u003ddestroy_disks,"},{"line_number":7424,"context_line":"                    migrate_data\u003dmigrate_data, do_cleanup\u003ddo_cleanup)"},{"line_number":7425,"context_line":"        elif utils.is_neutron():"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_95bcc7bb","line":7422,"updated":"2019-08-16 18:31:47.000000000","message":"I\u0027m not sure that blindly calling \"rollback\" for all numa-able live migrations is a good idea, when it was only a failure cleanup case in the past. Yes, I know that libvirt is the only one doing numa live migrations as of this patch, but I think this sets us up for confusion in the future. \n\nI think you\u0027re assuming that numa_live_migration\u003dFalse if the other side is old, and if it\u0027s new, it will honor the do_cleanup and just not call the driver, which seems a tad risky.","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":7419,"context_line":"        numa_live_migration \u003d (\u0027dst_numa_config\u0027 in migrate_data and"},{"line_number":7420,"context_line":"                               migrate_data.dst_numa_config)"},{"line_number":7421,"context_line":"        if do_cleanup or numa_live_migration:"},{"line_number":7422,"context_line":"            self.compute_rpcapi.rollback_live_migration_at_destination("},{"line_number":7423,"context_line":"                    context, instance, dest, destroy_disks\u003ddestroy_disks,"},{"line_number":7424,"context_line":"                    migrate_data\u003dmigrate_data, do_cleanup\u003ddo_cleanup)"},{"line_number":7425,"context_line":"        elif utils.is_neutron():"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_be804df9","line":7422,"in_reply_to":"7faddb67_95bcc7bb","updated":"2019-08-23 21:26:51.000000000","message":"I think we\u0027re good:\n\nOld destination (numa_live_migration can only be False, RPC has to be pinned, but I\u0027ve included all possibilities for completeness):\n\n  numa_live_migration | do_cleanup | RPC pinned | result\n\n    False                   True        Yes        rlmad() called with do_cleanup stripped\n                                                   out by rpcapi. This is fine as the old\n                                                   rlmad() doesn\u0027t know about do_cleanup\n                                                   anyways, so it just cleans up.\n    False                   True        No         NA\n    False                   False       Yes        rlmad() not called.\n                                                   Same as pre-NUMA-LM.\n    False                   False       No         NA\n    True                    True        Yes        NA\n    True                    True        No         NA\n    True                    False       Yes        NA\n    True                    False       No         NA\n\nNew destination:\n\n    False                   True        Yes        rlmad() called with do_cleanup stripped\n                                                   out by rpcapi, the True default kicks\n                                                   in and _do_rlmad() is called. This is\n                                                   equivalent to the old behaviour of\n                                                   calling rlmad() if do_cleanup is True.\n    False                   True        No         rlmad() called with do_cleanup\u003dTrue\n                                                   _do_rlmad() is called. This is\n                                                   equivalent to the old behaviour of\n                                                   calling rlmad() if do_cleanup is True.\n    False                   False       Yes        rlmad() not called.\n                                                   Same as pre-NUMA-LM.\n    False                   False       No         rlmad() not called.\n                                                   Same as pre-NUMA-LM.\n    True                    True        Yes        rlmad() called with do_cleanup stripped\n                                                   out by rpcapi, the True default kicks\n                                                   in and _do_rlmad() is called. This is\n                                                   equivalent to the old behaviour of\n                                                   calling rlmad() if do_cleanup is True.\n    True                    True        No         rlmad() called with do_cleanup\u003dTrue.\n                                                   _do_rlmad() is called, same as\n                                                   pre-NUMA-LM.\n    True                    False       Yes        rlmad() called with do_cleanup stripped\n                                                   out by rpcapi. The True default kicks\n                                                   in, and we do cleanup when we\n                                                   shouldn\u0027t. This is a problem.\n    True                    False       No         rlmad() called with do_cleanup\u003dFalse.\n                                                   _do_rlmad() is not called. Same as\n                                                   pre-NUMA-LM.\n\nBased on the second to last line, looks like we should just call _live_migration_cleanup_flags() from rlmad() to make sure we\u0027re not cleaning up when we shouldn\u0027t be. This can all be simplified in U.","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e590e7b9ba28c132ddf11be77c7d00a0aafbafc5","unresolved":false,"context_lines":[{"line_number":7479,"context_line":"            action\u003dfields.NotificationAction.LIVE_MIGRATION_ROLLBACK_DEST,"},{"line_number":7480,"context_line":"            phase\u003dfields.NotificationPhase.START)"},{"line_number":7481,"context_line":"        if \u0027dst_numa_config\u0027 in migrate_data and migrate_data.dst_numa_config:"},{"line_number":7482,"context_line":"            instance.drop_migration_context()"},{"line_number":7483,"context_line":"            self.rt.drop_move_claim("},{"line_number":7484,"context_line":"                context, instance, self._get_nodename(instance),"},{"line_number":7485,"context_line":"                instance.flavor, prefix\u003d\u0027new_\u0027)"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_d5bd5fb1","line":7482,"updated":"2019-08-16 18:31:47.000000000","message":"Erm, we\u0027ve already applied the context if we were successful. We only need to drop it if we\u0027ve failed, right? Maybe this is a no-op if we\u0027ve already applied, but shouldn\u0027t this go under \"if do_cleanup\" ?","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":7479,"context_line":"            action\u003dfields.NotificationAction.LIVE_MIGRATION_ROLLBACK_DEST,"},{"line_number":7480,"context_line":"            phase\u003dfields.NotificationPhase.START)"},{"line_number":7481,"context_line":"        if \u0027dst_numa_config\u0027 in migrate_data and migrate_data.dst_numa_config:"},{"line_number":7482,"context_line":"            instance.drop_migration_context()"},{"line_number":7483,"context_line":"            self.rt.drop_move_claim("},{"line_number":7484,"context_line":"                context, instance, self._get_nodename(instance),"},{"line_number":7485,"context_line":"                instance.flavor, prefix\u003d\u0027new_\u0027)"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_beb4cd83","line":7482,"in_reply_to":"7faddb67_d5bd5fb1","updated":"2019-08-23 21:26:51.000000000","message":"do_cleanup is its own thing determined by _live_migration_cleanup_flags(). If we\u0027re rolling back a NUMA LM, we always need to drop the migration context and the move claim.","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"33c558c9af0058974f5d2320f20c11f8c45ae660","unresolved":false,"context_lines":[{"line_number":6484,"context_line":"        :returns: migrate_data with dst_numa_config set if necessary"},{"line_number":6485,"context_line":"        \"\"\""},{"line_number":6486,"context_line":"        numa_live_migration \u003d (\u0027instance_numa_topology\u0027 in migrate_data and"},{"line_number":6487,"context_line":"                               migrate_data.instance_numa_topology)"},{"line_number":6488,"context_line":"        if numa_live_migration and migration:"},{"line_number":6489,"context_line":"            try:"},{"line_number":6490,"context_line":"                claim \u003d self.rt.live_migration_claim("}],"source_content_type":"text/x-python","patch_set":51,"id":"7faddb67_a0d90d29","line":6487,"updated":"2019-08-23 16:03:31.000000000","message":"Per other discussions, this will just change to \"instance_numa in migrate_data\". No need to check for none-ness I think.","commit_id":"091eb3d68b454730ee315b3ccc2c9316fcfab1ee"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":6484,"context_line":"        :returns: migrate_data with dst_numa_config set if necessary"},{"line_number":6485,"context_line":"        \"\"\""},{"line_number":6486,"context_line":"        numa_live_migration \u003d (\u0027instance_numa_topology\u0027 in migrate_data and"},{"line_number":6487,"context_line":"                               migrate_data.instance_numa_topology)"},{"line_number":6488,"context_line":"        if numa_live_migration and migration:"},{"line_number":6489,"context_line":"            try:"},{"line_number":6490,"context_line":"                claim \u003d self.rt.live_migration_claim("}],"source_content_type":"text/x-python","patch_set":51,"id":"7faddb67_13eb9a12","line":6487,"in_reply_to":"7faddb67_a0d90d29","updated":"2019-08-23 21:26:51.000000000","message":"Done","commit_id":"091eb3d68b454730ee315b3ccc2c9316fcfab1ee"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"33c558c9af0058974f5d2320f20c11f8c45ae660","unresolved":false,"context_lines":[{"line_number":7417,"context_line":"        # aware of NUMA live migration, we need to preserve the old way of"},{"line_number":7418,"context_line":"        # calling it by checking do_cleanup ourselves."},{"line_number":7419,"context_line":"        numa_live_migration \u003d (\u0027dst_numa_config\u0027 in migrate_data and"},{"line_number":7420,"context_line":"                               migrate_data.dst_numa_config)"},{"line_number":7421,"context_line":"        if do_cleanup or numa_live_migration:"},{"line_number":7422,"context_line":"            self.compute_rpcapi.rollback_live_migration_at_destination("},{"line_number":7423,"context_line":"                    context, instance, dest, destroy_disks\u003ddestroy_disks,"}],"source_content_type":"text/x-python","patch_set":51,"id":"7faddb67_60e315da","line":7420,"updated":"2019-08-23 16:03:31.000000000","message":"Same","commit_id":"091eb3d68b454730ee315b3ccc2c9316fcfab1ee"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":7417,"context_line":"        # aware of NUMA live migration, we need to preserve the old way of"},{"line_number":7418,"context_line":"        # calling it by checking do_cleanup ourselves."},{"line_number":7419,"context_line":"        numa_live_migration \u003d (\u0027dst_numa_config\u0027 in migrate_data and"},{"line_number":7420,"context_line":"                               migrate_data.dst_numa_config)"},{"line_number":7421,"context_line":"        if do_cleanup or numa_live_migration:"},{"line_number":7422,"context_line":"            self.compute_rpcapi.rollback_live_migration_at_destination("},{"line_number":7423,"context_line":"                    context, instance, dest, destroy_disks\u003ddestroy_disks,"}],"source_content_type":"text/x-python","patch_set":51,"id":"7faddb67_b3ef261c","line":7420,"in_reply_to":"7faddb67_60e315da","updated":"2019-08-23 21:26:51.000000000","message":"Done","commit_id":"091eb3d68b454730ee315b3ccc2c9316fcfab1ee"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"944a0690ec65b8600443660daf3a4189531438d4","unresolved":false,"context_lines":[{"line_number":6484,"context_line":"        :returns: migrate_data with dst_numa_info set if necessary"},{"line_number":6485,"context_line":"        \"\"\""},{"line_number":6486,"context_line":"        # TODO(artom) This check is necessary for old computes that cannot"},{"line_number":6487,"context_line":"        # perform NUMA-aware live migrations. Remove in U."},{"line_number":6488,"context_line":"        if \u0027numa_topology\u0027 in migrate_data:"},{"line_number":6489,"context_line":"            try:"},{"line_number":6490,"context_line":"                claim \u003d self.rt.live_migration_claim("}],"source_content_type":"text/x-python","patch_set":58,"id":"7faddb67_848157fe","line":6487,"range":{"start_line":6487,"start_character":46,"end_line":6487,"end_character":58},"updated":"2019-08-27 13:53:05.000000000","message":"Remove in RPC version 6.0. You can\u0027t remove this in U.","commit_id":"46c87fe369a6591eaaf67093e9e338b794f45458"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d21d7e3d72480efe5111b37373fa8ac09d6edabe","unresolved":false,"context_lines":[{"line_number":6484,"context_line":"        :returns: migrate_data with dst_numa_info set if necessary"},{"line_number":6485,"context_line":"        \"\"\""},{"line_number":6486,"context_line":"        # TODO(artom) This check is necessary for old computes that cannot"},{"line_number":6487,"context_line":"        # perform NUMA-aware live migrations. Remove in U."},{"line_number":6488,"context_line":"        if \u0027numa_topology\u0027 in migrate_data:"},{"line_number":6489,"context_line":"            try:"},{"line_number":6490,"context_line":"                claim \u003d self.rt.live_migration_claim("}],"source_content_type":"text/x-python","patch_set":58,"id":"7faddb67_e2c27886","line":6487,"range":{"start_line":6487,"start_character":46,"end_line":6487,"end_character":58},"in_reply_to":"7faddb67_848157fe","updated":"2019-08-27 16:56:49.000000000","message":"Done","commit_id":"46c87fe369a6591eaaf67093e9e338b794f45458"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"944a0690ec65b8600443660daf3a4189531438d4","unresolved":false,"context_lines":[{"line_number":7359,"context_line":"                      instance\u003dinstance)"},{"line_number":7360,"context_line":""},{"line_number":7361,"context_line":"        # TODO(artom) This check needs to exist in Train because old computes"},{"line_number":7362,"context_line":"        # cannot initiate a NUMA-aware live migration. Remove in U."},{"line_number":7363,"context_line":"        if \u0027dst_numa_info\u0027 in migrate_data:"},{"line_number":7364,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":7365,"context_line":"                                                               instance, dest)"}],"source_content_type":"text/x-python","patch_set":58,"id":"7faddb67_44927f5a","line":7362,"range":{"start_line":7362,"start_character":55,"end_line":7362,"end_character":66},"updated":"2019-08-27 13:53:05.000000000","message":"You should say that this will be the case for computes \u003c5.2, because if people have their computes pinned to 5.0, they won\u0027t send the field you need. Also, \"Remove in RPC version 6.0\".","commit_id":"46c87fe369a6591eaaf67093e9e338b794f45458"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d21d7e3d72480efe5111b37373fa8ac09d6edabe","unresolved":false,"context_lines":[{"line_number":7359,"context_line":"                      instance\u003dinstance)"},{"line_number":7360,"context_line":""},{"line_number":7361,"context_line":"        # TODO(artom) This check needs to exist in Train because old computes"},{"line_number":7362,"context_line":"        # cannot initiate a NUMA-aware live migration. Remove in U."},{"line_number":7363,"context_line":"        if \u0027dst_numa_info\u0027 in migrate_data:"},{"line_number":7364,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":7365,"context_line":"                                                               instance, dest)"}],"source_content_type":"text/x-python","patch_set":58,"id":"7faddb67_623448ad","line":7362,"range":{"start_line":7362,"start_character":55,"end_line":7362,"end_character":66},"in_reply_to":"7faddb67_44927f5a","updated":"2019-08-27 16:56:49.000000000","message":"Done","commit_id":"46c87fe369a6591eaaf67093e9e338b794f45458"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"55b9376b6d09e591ee73090d22357cae0090edf3","unresolved":false,"context_lines":[{"line_number":7389,"context_line":"        # 5.2 cannot perform a NUMA-aware live migration. Remove in RPC 6.0."},{"line_number":7390,"context_line":"        if \u0027dst_numa_info\u0027 in migrate_data:"},{"line_number":7391,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":7392,"context_line":"                                                               instance, dest)"},{"line_number":7393,"context_line":"        instance.task_state \u003d None"},{"line_number":7394,"context_line":"        instance.progress \u003d 0"},{"line_number":7395,"context_line":"        instance.drop_migration_context()"}],"source_content_type":"text/x-python","patch_set":62,"id":"7faddb67_27f4e55a","line":7392,"updated":"2019-08-30 14:32:48.000000000","message":"So, the destination will include dst_numa_info if it is new enough and the instance has a numa topology. However, that is unrelated to the current RPC version pin, which may be set by the operator or calculated by nova to be lower than 5.2 if there are *any* 5.1-having nodes in the deployment. If that happens, this will raise RPCVersionCapError.\n\nSo, (a) I think you need to handle that here regardless of how much you think you\u0027ve prepared to avoid it and (b) I think your should-we-do-the-new-thing logic probably needs some adjusting, right?","commit_id":"12156aaaece3b163ee69dd2b797379a1d9400544"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b857cdf983c048bb97d0cd3475102d5ada46616d","unresolved":false,"context_lines":[{"line_number":7389,"context_line":"        # 5.2 cannot perform a NUMA-aware live migration. Remove in RPC 6.0."},{"line_number":7390,"context_line":"        if \u0027dst_numa_info\u0027 in migrate_data:"},{"line_number":7391,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":7392,"context_line":"                                                               instance, dest)"},{"line_number":7393,"context_line":"        instance.task_state \u003d None"},{"line_number":7394,"context_line":"        instance.progress \u003d 0"},{"line_number":7395,"context_line":"        instance.drop_migration_context()"}],"source_content_type":"text/x-python","patch_set":62,"id":"7faddb67_eae1b1d0","line":7392,"in_reply_to":"7faddb67_27f4e55a","updated":"2019-08-30 18:19:53.000000000","message":"We talked about this on IRC, and what we hated the least was sending check_can_live_migrate_source() a sentinel indicating that RPC is new enough. If the source gets that sentinel, it\u0027ll include src_supports_numa_live_migration in migrate_data, and the whole chain kicks off. The commit message has been amended to explain it in more detail.","commit_id":"12156aaaece3b163ee69dd2b797379a1d9400544"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"269ea3134b2cdd73c8857d184d6ebe27d000e120","unresolved":false,"context_lines":[{"line_number":6552,"context_line":"                                                           block_device_info)"},{"line_number":6553,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in result and"},{"line_number":6554,"context_line":"                not numa_live_migration):"},{"line_number":6555,"context_line":"            result.pop(\u0027src_supports_numa_live_migration\u0027)"},{"line_number":6556,"context_line":"        LOG.debug(\u0027source check data is %s\u0027, result)"},{"line_number":6557,"context_line":"        return result"},{"line_number":6558,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"7faddb67_39672528","line":6555,"updated":"2019-08-30 22:53:32.000000000","message":"pop() is not an ovo method, this fails - the new func tests I added [1] sniffed this out.\n\n[1] https://review.opendev.org/#/c/672595/24","commit_id":"5b8065f548b1b095fa91a142251ce9d576f7c535"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"8b82e1b71210314fd1d0dfd194184ea9489e2189","unresolved":false,"context_lines":[{"line_number":6552,"context_line":"                                                           block_device_info)"},{"line_number":6553,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in result and"},{"line_number":6554,"context_line":"                not numa_live_migration):"},{"line_number":6555,"context_line":"            result.pop(\u0027src_supports_numa_live_migration\u0027)"},{"line_number":6556,"context_line":"        LOG.debug(\u0027source check data is %s\u0027, result)"},{"line_number":6557,"context_line":"        return result"},{"line_number":6558,"context_line":""}],"source_content_type":"text/x-python","patch_set":63,"id":"7faddb67_e4aa3dd0","line":6555,"in_reply_to":"7faddb67_39672528","updated":"2019-08-31 14:47:44.000000000","message":"Done","commit_id":"5b8065f548b1b095fa91a142251ce9d576f7c535"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7e50da5870cf514f40133c07b5248b2ab99f72bb","unresolved":false,"context_lines":[{"line_number":6483,"context_line":"            block_migration, disk_over_commit)"},{"line_number":6484,"context_line":"        LOG.debug(\u0027destination check data is %s\u0027, dest_check_data)"},{"line_number":6485,"context_line":"        try:"},{"line_number":6486,"context_line":"            numa_live_migration \u003d True if migration else False"},{"line_number":6487,"context_line":"            migrate_data \u003d self.compute_rpcapi.check_can_live_migrate_source("},{"line_number":6488,"context_line":"                ctxt, instance, dest_check_data, numa_live_migration)"},{"line_number":6489,"context_line":"            migrate_data \u003d self._live_migration_claim("}],"source_content_type":"text/x-python","patch_set":70,"id":"7faddb67_522097b0","line":6486,"range":{"start_line":6486,"start_character":12,"end_line":6486,"end_character":62},"updated":"2019-09-03 18:57:01.000000000","message":"Why is the migration object being present telling us that numa live migration is happening?","commit_id":"881f423a099e740daac2d3bb19394f87876d823a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7e50da5870cf514f40133c07b5248b2ab99f72bb","unresolved":false,"context_lines":[{"line_number":6544,"context_line":"        :param instance: dict of instance data"},{"line_number":6545,"context_line":"        :param dest_check_data: result of check_can_live_migrate_destination"},{"line_number":6546,"context_line":"        :param numa_live_migration: Boolean sentinel used to indicate that RPC"},{"line_number":6547,"context_line":"                                    is new engouh to support NUMA live"},{"line_number":6548,"context_line":"                                    migration."},{"line_number":6549,"context_line":"        :returns: a LiveMigrateData object"},{"line_number":6550,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":70,"id":"7faddb67_b218eb83","line":6547,"range":{"start_line":6547,"start_character":43,"end_line":6547,"end_character":49},"updated":"2019-09-03 18:57:01.000000000","message":"enough","commit_id":"881f423a099e740daac2d3bb19394f87876d823a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"95c0e718fcb2b27ffd508106d1b1f98efc91fdf2","unresolved":false,"context_lines":[{"line_number":7400,"context_line":""},{"line_number":7401,"context_line":"        do_cleanup, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":7402,"context_line":"                migrate_data)"},{"line_number":7403,"context_line":""},{"line_number":7404,"context_line":"        if do_cleanup:"},{"line_number":7405,"context_line":"            self.compute_rpcapi.rollback_live_migration_at_destination("},{"line_number":7406,"context_line":"                    context, instance, dest, destroy_disks\u003ddestroy_disks,"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_23ad8be9","side":"PARENT","line":7403,"updated":"2019-09-03 21:24:13.000000000","message":"unrelated","commit_id":"022e9b97cbba6f8cc28806ebfabbf5b9953cfdc0"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"51431a406b88d43efb87152c3abff60010a62e42","unresolved":false,"context_lines":[{"line_number":7400,"context_line":""},{"line_number":7401,"context_line":"        do_cleanup, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":7402,"context_line":"                migrate_data)"},{"line_number":7403,"context_line":""},{"line_number":7404,"context_line":"        if do_cleanup:"},{"line_number":7405,"context_line":"            self.compute_rpcapi.rollback_live_migration_at_destination("},{"line_number":7406,"context_line":"                    context, instance, dest, destroy_disks\u003ddestroy_disks,"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_b9a44eba","side":"PARENT","line":7403,"in_reply_to":"7faddb67_23ad8be9","updated":"2019-09-04 00:25:46.000000000","message":"Done","commit_id":"022e9b97cbba6f8cc28806ebfabbf5b9953cfdc0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a9398aff3dc934fd6dceda45387497bd15322b4c","unresolved":false,"context_lines":[{"line_number":6483,"context_line":"            block_migration, disk_over_commit)"},{"line_number":6484,"context_line":"        LOG.debug(\u0027destination check data is %s\u0027, dest_check_data)"},{"line_number":6485,"context_line":"        try:"},{"line_number":6486,"context_line":"            numa_live_migration \u003d True if migration else False"},{"line_number":6487,"context_line":"            migrate_data \u003d self.compute_rpcapi.check_can_live_migrate_source("},{"line_number":6488,"context_line":"                ctxt, instance, dest_check_data, numa_live_migration)"},{"line_number":6489,"context_line":"            migrate_data \u003d self._live_migration_claim("}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_a3fdfb08","line":6486,"updated":"2019-09-03 21:13:00.000000000","message":"Why is the migration object being present telling us that numa live migration is happening? Is this just a way of telling the source that the dest is new enough? Couldn\u0027t we avoid changing the RPC method interface by having the source check the compute RPC API version of the dest host? Or put something in dest_check_data?","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"51431a406b88d43efb87152c3abff60010a62e42","unresolved":false,"context_lines":[{"line_number":6483,"context_line":"            block_migration, disk_over_commit)"},{"line_number":6484,"context_line":"        LOG.debug(\u0027destination check data is %s\u0027, dest_check_data)"},{"line_number":6485,"context_line":"        try:"},{"line_number":6486,"context_line":"            numa_live_migration \u003d True if migration else False"},{"line_number":6487,"context_line":"            migrate_data \u003d self.compute_rpcapi.check_can_live_migrate_source("},{"line_number":6488,"context_line":"                ctxt, instance, dest_check_data, numa_live_migration)"},{"line_number":6489,"context_line":"            migrate_data \u003d self._live_migration_claim("}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_1ea1c895","line":6486,"in_reply_to":"7faddb67_a3fdfb08","updated":"2019-09-04 00:25:46.000000000","message":"It\u0027s from the conductor, added a TODO explaining what it is and when to remove it.","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a9398aff3dc934fd6dceda45387497bd15322b4c","unresolved":false,"context_lines":[{"line_number":6544,"context_line":"        :param instance: dict of instance data"},{"line_number":6545,"context_line":"        :param dest_check_data: result of check_can_live_migrate_destination"},{"line_number":6546,"context_line":"        :param numa_live_migration: Boolean sentinel used to indicate that RPC"},{"line_number":6547,"context_line":"                                    is new engouh to support NUMA live"},{"line_number":6548,"context_line":"                                    migration."},{"line_number":6549,"context_line":"        :returns: a LiveMigrateData object"},{"line_number":6550,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_08266ecc","line":6547,"range":{"start_line":6547,"start_character":43,"end_line":6547,"end_character":49},"updated":"2019-09-03 21:13:00.000000000","message":"enough","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"51431a406b88d43efb87152c3abff60010a62e42","unresolved":false,"context_lines":[{"line_number":6544,"context_line":"        :param instance: dict of instance data"},{"line_number":6545,"context_line":"        :param dest_check_data: result of check_can_live_migrate_destination"},{"line_number":6546,"context_line":"        :param numa_live_migration: Boolean sentinel used to indicate that RPC"},{"line_number":6547,"context_line":"                                    is new engouh to support NUMA live"},{"line_number":6548,"context_line":"                                    migration."},{"line_number":6549,"context_line":"        :returns: a LiveMigrateData object"},{"line_number":6550,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_dea6d0ac","line":6547,"range":{"start_line":6547,"start_character":43,"end_line":6547,"end_character":49},"in_reply_to":"7faddb67_08266ecc","updated":"2019-09-04 00:25:46.000000000","message":"Done","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a9398aff3dc934fd6dceda45387497bd15322b4c","unresolved":false,"context_lines":[{"line_number":6558,"context_line":"        result \u003d self.driver.check_can_live_migrate_source(ctxt, instance,"},{"line_number":6559,"context_line":"                                                           dest_check_data,"},{"line_number":6560,"context_line":"                                                           block_device_info)"},{"line_number":6561,"context_line":"        can_numa_live_migrate \u003d ("},{"line_number":6562,"context_line":"            numa_live_migration and"},{"line_number":6563,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6564,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in result and not"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_e828b298","line":6561,"updated":"2019-09-03 21:13:00.000000000","message":"Please document the code; these methods all get big and hairy and comments are necessary to keep things straight. Also, can\u0027t we have a TODO to drop supports_numa_live_migration in Ussuri?","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"51431a406b88d43efb87152c3abff60010a62e42","unresolved":false,"context_lines":[{"line_number":6558,"context_line":"        result \u003d self.driver.check_can_live_migrate_source(ctxt, instance,"},{"line_number":6559,"context_line":"                                                           dest_check_data,"},{"line_number":6560,"context_line":"                                                           block_device_info)"},{"line_number":6561,"context_line":"        can_numa_live_migrate \u003d ("},{"line_number":6562,"context_line":"            numa_live_migration and"},{"line_number":6563,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6564,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in result and not"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_5ee180ce","line":6561,"in_reply_to":"7faddb67_e828b298","updated":"2019-09-04 00:25:46.000000000","message":"Done","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a9398aff3dc934fd6dceda45387497bd15322b4c","unresolved":false,"context_lines":[{"line_number":6563,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6564,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in result and not"},{"line_number":6565,"context_line":"                can_numa_live_migrate):"},{"line_number":6566,"context_line":"            LOG.info(numa_live_migration)"},{"line_number":6567,"context_line":"            LOG.info(self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6568,"context_line":"            delattr(result, \u0027src_supports_numa_live_migration\u0027)"},{"line_number":6569,"context_line":"        LOG.debug(\u0027source check data is %s\u0027, result)"},{"line_number":6570,"context_line":"        return result"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_c834d6fd","line":6567,"range":{"start_line":6566,"start_character":12,"end_line":6567,"end_character":76},"updated":"2019-09-03 21:13:00.000000000","message":"Is this just debugging for yourself? It seems unhelpful otherwise.","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"51431a406b88d43efb87152c3abff60010a62e42","unresolved":false,"context_lines":[{"line_number":6563,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6564,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in result and not"},{"line_number":6565,"context_line":"                can_numa_live_migrate):"},{"line_number":6566,"context_line":"            LOG.info(numa_live_migration)"},{"line_number":6567,"context_line":"            LOG.info(self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6568,"context_line":"            delattr(result, \u0027src_supports_numa_live_migration\u0027)"},{"line_number":6569,"context_line":"        LOG.debug(\u0027source check data is %s\u0027, result)"},{"line_number":6570,"context_line":"        return result"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_fea38c99","line":6567,"range":{"start_line":6566,"start_character":12,"end_line":6567,"end_character":76},"in_reply_to":"7faddb67_c834d6fd","updated":"2019-09-04 00:25:46.000000000","message":"Sorry, sloppily forgot to remove it after figuring out why unit tests weren\u0027t doing the expected thing.","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"95c0e718fcb2b27ffd508106d1b1f98efc91fdf2","unresolved":false,"context_lines":[{"line_number":7406,"context_line":"                      instance\u003dinstance)"},{"line_number":7407,"context_line":""},{"line_number":7408,"context_line":"        # TODO(artom) This check needs to exist because computes running RPC \u003c"},{"line_number":7409,"context_line":"        # 5.2 cannot perform a NUMA-aware live migration. Remove in RPC 6.0."},{"line_number":7410,"context_line":"        if \u0027dst_numa_info\u0027 in migrate_data:"},{"line_number":7411,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":7412,"context_line":"                                                               instance, dest)"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_83a47f08","line":7409,"range":{"start_line":7409,"start_character":10,"end_line":7409,"end_character":13},"updated":"2019-09-03 21:24:13.000000000","message":"5.3?","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"51431a406b88d43efb87152c3abff60010a62e42","unresolved":false,"context_lines":[{"line_number":7406,"context_line":"                      instance\u003dinstance)"},{"line_number":7407,"context_line":""},{"line_number":7408,"context_line":"        # TODO(artom) This check needs to exist because computes running RPC \u003c"},{"line_number":7409,"context_line":"        # 5.2 cannot perform a NUMA-aware live migration. Remove in RPC 6.0."},{"line_number":7410,"context_line":"        if \u0027dst_numa_info\u0027 in migrate_data:"},{"line_number":7411,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":7412,"context_line":"                                                               instance, dest)"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_1e3d482b","line":7409,"range":{"start_line":7409,"start_character":10,"end_line":7409,"end_character":13},"in_reply_to":"7faddb67_83a47f08","updated":"2019-09-04 00:25:46.000000000","message":"Done","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"95c0e718fcb2b27ffd508106d1b1f98efc91fdf2","unresolved":false,"context_lines":[{"line_number":7503,"context_line":"    @wrap_instance_fault"},{"line_number":7504,"context_line":"    def drop_move_claim_at_destination(self, context, instance):"},{"line_number":7505,"context_line":"        self.rt.drop_move_claim("},{"line_number":7506,"context_line":"            context, instance, self._get_nodename(instance),"},{"line_number":7507,"context_line":"            instance.flavor, prefix\u003d\u0027new_\u0027)"},{"line_number":7508,"context_line":""},{"line_number":7509,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_4393e7a3","line":7506,"range":{"start_line":7506,"start_character":31,"end_line":7506,"end_character":59},"updated":"2019-09-03 21:24:13.000000000","message":"nit: couldn\u0027t we just pass the nodename on the rpc interface? It\u0027s the migration.dest_node value. Maybe that\u0027s confusing/gorpy for the caller to need to know that though?","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"51431a406b88d43efb87152c3abff60010a62e42","unresolved":false,"context_lines":[{"line_number":7503,"context_line":"    @wrap_instance_fault"},{"line_number":7504,"context_line":"    def drop_move_claim_at_destination(self, context, instance):"},{"line_number":7505,"context_line":"        self.rt.drop_move_claim("},{"line_number":7506,"context_line":"            context, instance, self._get_nodename(instance),"},{"line_number":7507,"context_line":"            instance.flavor, prefix\u003d\u0027new_\u0027)"},{"line_number":7508,"context_line":""},{"line_number":7509,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_3e236407","line":7506,"range":{"start_line":7506,"start_character":31,"end_line":7506,"end_character":59},"in_reply_to":"7faddb67_4393e7a3","updated":"2019-09-04 00:25:46.000000000","message":"The instance is all the destination needs to know to properly drop the claim, passing the dest would be weird.","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"95c0e718fcb2b27ffd508106d1b1f98efc91fdf2","unresolved":false,"context_lines":[{"line_number":7504,"context_line":"    def drop_move_claim_at_destination(self, context, instance):"},{"line_number":7505,"context_line":"        self.rt.drop_move_claim("},{"line_number":7506,"context_line":"            context, instance, self._get_nodename(instance),"},{"line_number":7507,"context_line":"            instance.flavor, prefix\u003d\u0027new_\u0027)"},{"line_number":7508,"context_line":""},{"line_number":7509,"context_line":"    @wrap_exception()"},{"line_number":7510,"context_line":"    @wrap_instance_event(prefix\u003d\u0027compute\u0027)"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_a382db50","line":7507,"range":{"start_line":7507,"start_character":29,"end_line":7507,"end_character":42},"updated":"2019-09-03 21:24:13.000000000","message":"remove this - it\u0027s the default and it\u0027s also confusing to see in a live migration context since the flavor isn\u0027t changing.","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"51431a406b88d43efb87152c3abff60010a62e42","unresolved":false,"context_lines":[{"line_number":7504,"context_line":"    def drop_move_claim_at_destination(self, context, instance):"},{"line_number":7505,"context_line":"        self.rt.drop_move_claim("},{"line_number":7506,"context_line":"            context, instance, self._get_nodename(instance),"},{"line_number":7507,"context_line":"            instance.flavor, prefix\u003d\u0027new_\u0027)"},{"line_number":7508,"context_line":""},{"line_number":7509,"context_line":"    @wrap_exception()"},{"line_number":7510,"context_line":"    @wrap_instance_event(prefix\u003d\u0027compute\u0027)"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_be7c34eb","line":7507,"range":{"start_line":7507,"start_character":29,"end_line":7507,"end_character":42},"in_reply_to":"7faddb67_a382db50","updated":"2019-09-04 00:25:46.000000000","message":"The flavor isn\u0027t, but the NUMA topology could have. But yeah, since it\u0027s the default I can drop this.","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"93cc9bc93da567d24945ecdc4d16734c70f1e823","unresolved":false,"context_lines":[{"line_number":6489,"context_line":"            numa_live_migration \u003d True if migration else False"},{"line_number":6490,"context_line":"            migrate_data \u003d self.compute_rpcapi.check_can_live_migrate_source("},{"line_number":6491,"context_line":"                ctxt, instance, dest_check_data, numa_live_migration)"},{"line_number":6492,"context_line":"            migrate_data \u003d self._live_migration_claim("},{"line_number":6493,"context_line":"                ctxt, instance, migrate_data, migration, limits)"},{"line_number":6494,"context_line":"            # Create migrate_data vifs"},{"line_number":6495,"context_line":"            migrate_data.vifs \u003d \\"}],"source_content_type":"text/x-python","patch_set":73,"id":"7faddb67_9e6daa30","line":6492,"updated":"2019-09-04 14:58:01.000000000","message":"This is kind of a nit, but it would probably be more clear (to me at least) if you made _live_migration_claim() actually do the claim, and check the flag here to see whether you should do it or not. If I\u0027m reading this code, it looks like you always claim, but in reality, _live_migration_claim() might be a no-op. Also, it would put the checking closer to the comment above about rpc versions.","commit_id":"9dce922cf0c0087e390360c23de37e1fe6ab20eb"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f26fdb06bc03288b373469d606ac3a6d7a6c24d7","unresolved":false,"context_lines":[{"line_number":6489,"context_line":"            numa_live_migration \u003d True if migration else False"},{"line_number":6490,"context_line":"            migrate_data \u003d self.compute_rpcapi.check_can_live_migrate_source("},{"line_number":6491,"context_line":"                ctxt, instance, dest_check_data, numa_live_migration)"},{"line_number":6492,"context_line":"            migrate_data \u003d self._live_migration_claim("},{"line_number":6493,"context_line":"                ctxt, instance, migrate_data, migration, limits)"},{"line_number":6494,"context_line":"            # Create migrate_data vifs"},{"line_number":6495,"context_line":"            migrate_data.vifs \u003d \\"}],"source_content_type":"text/x-python","patch_set":73,"id":"7faddb67_32e2a231","line":6492,"in_reply_to":"7faddb67_9e6daa30","updated":"2019-09-04 19:29:58.000000000","message":"Done","commit_id":"9dce922cf0c0087e390360c23de37e1fe6ab20eb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"93cc9bc93da567d24945ecdc4d16734c70f1e823","unresolved":false,"context_lines":[{"line_number":6570,"context_line":"        # All of this, including src_supports_numa_live_migration, can be"},{"line_number":6571,"context_line":"        # removed in RPC 6.0."},{"line_number":6572,"context_line":"        can_numa_live_migrate \u003d ("},{"line_number":6573,"context_line":"            numa_live_migration and"},{"line_number":6574,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6575,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in result and not"},{"line_number":6576,"context_line":"                can_numa_live_migrate):"}],"source_content_type":"text/x-python","patch_set":73,"id":"7faddb67_3e9596e4","line":6573,"range":{"start_line":6573,"start_character":12,"end_line":6573,"end_character":31},"updated":"2019-09-04 14:58:01.000000000","message":"Technically this should probably be:\n\n numa_live_migration is not None\n\nBecause you may be passed False here, which means the other compute _is_ new enough, but conductor is not. Just in case this logic gets used for something else later.","commit_id":"9dce922cf0c0087e390360c23de37e1fe6ab20eb"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f26fdb06bc03288b373469d606ac3a6d7a6c24d7","unresolved":false,"context_lines":[{"line_number":6570,"context_line":"        # All of this, including src_supports_numa_live_migration, can be"},{"line_number":6571,"context_line":"        # removed in RPC 6.0."},{"line_number":6572,"context_line":"        can_numa_live_migrate \u003d ("},{"line_number":6573,"context_line":"            numa_live_migration and"},{"line_number":6574,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6575,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in result and not"},{"line_number":6576,"context_line":"                can_numa_live_migrate):"}],"source_content_type":"text/x-python","patch_set":73,"id":"7faddb67_72733a81","line":6573,"range":{"start_line":6573,"start_character":12,"end_line":6573,"end_character":31},"in_reply_to":"7faddb67_3e9596e4","updated":"2019-09-04 19:29:58.000000000","message":"I\u0027m not sure I understand. If we got False we still don\u0027t want to do a NUMA live migration, because the conductor didn\u0027t pass migration and limits to the dest - though I suppose in those cases migration could be fetched from the database, and limits...?","commit_id":"9dce922cf0c0087e390360c23de37e1fe6ab20eb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d7333ef1192a5718aad7465595f9e2c9652d37ea","unresolved":false,"context_lines":[{"line_number":6570,"context_line":"        # All of this, including src_supports_numa_live_migration, can be"},{"line_number":6571,"context_line":"        # removed in RPC 6.0."},{"line_number":6572,"context_line":"        can_numa_live_migrate \u003d ("},{"line_number":6573,"context_line":"            numa_live_migration and"},{"line_number":6574,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6575,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in result and not"},{"line_number":6576,"context_line":"                can_numa_live_migrate):"}],"source_content_type":"text/x-python","patch_set":73,"id":"7faddb67_f2788af8","line":6573,"range":{"start_line":6573,"start_character":12,"end_line":6573,"end_character":31},"in_reply_to":"7faddb67_72733a81","updated":"2019-09-04 19:32:49.000000000","message":"It won\u0027t change the behavior, it\u0027s just a clarity thing. Anyway, it wasn\u0027t part of my -1 and trying to re-explain it here, it has less meaning for me than  it did this morning, so just ignore me :)","commit_id":"9dce922cf0c0087e390360c23de37e1fe6ab20eb"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"61c1c3ab2162107464b2e026bc05bdcbb1cf8be6","unresolved":false,"context_lines":[{"line_number":6489,"context_line":"            numa_live_migration \u003d True if migration else False"},{"line_number":6490,"context_line":"            migrate_data \u003d self.compute_rpcapi.check_can_live_migrate_source("},{"line_number":6491,"context_line":"                ctxt, instance, dest_check_data, numa_live_migration)"},{"line_number":6492,"context_line":"            if \u0027src_supports_numa_live_migration\u0027 in migrate_data:"},{"line_number":6493,"context_line":"                migrate_data \u003d self._live_migration_claim("},{"line_number":6494,"context_line":"                    ctxt, instance, migrate_data, migration, limits)"},{"line_number":6495,"context_line":"            # Create migrate_data vifs"}],"source_content_type":"text/x-python","patch_set":74,"id":"7faddb67_52db9ee8","line":6492,"updated":"2019-09-04 19:36:04.000000000","message":"I didn\u0027t catch this before, but.. don\u0027t you think we should actually check the value too? If we were to have to backport a fix for something and wanted to be able to set this flag to False, this logic would just plow ahead. I know that right now, the flag, if present, will be True, but it\u0027s a little counterintuitive to say \"NO I DO NOT\" and have the other side say \"well, he answered the question, so...\"","commit_id":"f91c0242860d4f2c0bca6686d15e45ee70641f51"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"4e81d9b379a844403795fc394b019fc2ab718077","unresolved":false,"context_lines":[{"line_number":6489,"context_line":"            numa_live_migration \u003d True if migration else False"},{"line_number":6490,"context_line":"            migrate_data \u003d self.compute_rpcapi.check_can_live_migrate_source("},{"line_number":6491,"context_line":"                ctxt, instance, dest_check_data, numa_live_migration)"},{"line_number":6492,"context_line":"            if \u0027src_supports_numa_live_migration\u0027 in migrate_data:"},{"line_number":6493,"context_line":"                migrate_data \u003d self._live_migration_claim("},{"line_number":6494,"context_line":"                    ctxt, instance, migrate_data, migration, limits)"},{"line_number":6495,"context_line":"            # Create migrate_data vifs"}],"source_content_type":"text/x-python","patch_set":74,"id":"7faddb67_f562b415","line":6492,"in_reply_to":"7faddb67_52db9ee8","updated":"2019-09-04 20:18:34.000000000","message":"Hah, yeah, fair point, I\u0027ll change it when I\u0027m back home.","commit_id":"f91c0242860d4f2c0bca6686d15e45ee70641f51"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"61c1c3ab2162107464b2e026bc05bdcbb1cf8be6","unresolved":false,"context_lines":[{"line_number":6491,"context_line":"                ctxt, instance, dest_check_data, numa_live_migration)"},{"line_number":6492,"context_line":"            if \u0027src_supports_numa_live_migration\u0027 in migrate_data:"},{"line_number":6493,"context_line":"                migrate_data \u003d self._live_migration_claim("},{"line_number":6494,"context_line":"                    ctxt, instance, migrate_data, migration, limits)"},{"line_number":6495,"context_line":"            # Create migrate_data vifs"},{"line_number":6496,"context_line":"            migrate_data.vifs \u003d \\"},{"line_number":6497,"context_line":"                migrate_data_obj.VIFMigrateData.create_skeleton_migrate_vifs("}],"source_content_type":"text/x-python","patch_set":74,"id":"7faddb67_f2ef2a84","line":6494,"updated":"2019-09-04 19:36:04.000000000","message":"This looks better, thanks.","commit_id":"f91c0242860d4f2c0bca6686d15e45ee70641f51"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":6486,"context_line":"            # TODO(artom) We got a migration from the conductor if it can send"},{"line_number":6487,"context_line":"            # RPC 5.3. The numa_live_migration sentinel can be removed in RPC"},{"line_number":6488,"context_line":"            # 6.0."},{"line_number":6489,"context_line":"            numa_live_migration \u003d True if migration else False"},{"line_number":6490,"context_line":"            migrate_data \u003d self.compute_rpcapi.check_can_live_migrate_source("},{"line_number":6491,"context_line":"                ctxt, instance, dest_check_data, numa_live_migration)"},{"line_number":6492,"context_line":"            if (\u0027src_supports_numa_live_migration\u0027 in migrate_data and"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_93e81f7b","line":6489,"updated":"2019-09-05 20:57:42.000000000","message":"Again, I would be consistent with src_suports_numa_live_migration and add a dst_suports_numa_live_migration to migrate_data - they mean the same thing, are the same rpc versioned interface, and would be consistent that way.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":6486,"context_line":"            # TODO(artom) We got a migration from the conductor if it can send"},{"line_number":6487,"context_line":"            # RPC 5.3. The numa_live_migration sentinel can be removed in RPC"},{"line_number":6488,"context_line":"            # 6.0."},{"line_number":6489,"context_line":"            numa_live_migration \u003d True if migration else False"},{"line_number":6490,"context_line":"            migrate_data \u003d self.compute_rpcapi.check_can_live_migrate_source("},{"line_number":6491,"context_line":"                ctxt, instance, dest_check_data, numa_live_migration)"},{"line_number":6492,"context_line":"            if (\u0027src_supports_numa_live_migration\u0027 in migrate_data and"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_93931f50","line":6489,"in_reply_to":"7faddb67_93e81f7b","updated":"2019-09-06 16:44:40.000000000","message":"Done","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":6488,"context_line":"            # 6.0."},{"line_number":6489,"context_line":"            numa_live_migration \u003d True if migration else False"},{"line_number":6490,"context_line":"            migrate_data \u003d self.compute_rpcapi.check_can_live_migrate_source("},{"line_number":6491,"context_line":"                ctxt, instance, dest_check_data, numa_live_migration)"},{"line_number":6492,"context_line":"            if (\u0027src_supports_numa_live_migration\u0027 in migrate_data and"},{"line_number":6493,"context_line":"                    migrate_data.src_supports_numa_live_migration):"},{"line_number":6494,"context_line":"                migrate_data \u003d self._live_migration_claim("}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_79ee8189","line":6491,"range":{"start_line":6491,"start_character":49,"end_line":6491,"end_character":68},"updated":"2019-09-06 16:44:40.000000000","message":"FWIW this was more broken than we thought: the destination driver never actually told us that it supports NUMA LM, so non-libvirt drivers would have broken here (although I think that would have been caught on the source later).","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":6489,"context_line":"            numa_live_migration \u003d True if migration else False"},{"line_number":6490,"context_line":"            migrate_data \u003d self.compute_rpcapi.check_can_live_migrate_source("},{"line_number":6491,"context_line":"                ctxt, instance, dest_check_data, numa_live_migration)"},{"line_number":6492,"context_line":"            if (\u0027src_supports_numa_live_migration\u0027 in migrate_data and"},{"line_number":6493,"context_line":"                    migrate_data.src_supports_numa_live_migration):"},{"line_number":6494,"context_line":"                migrate_data \u003d self._live_migration_claim("},{"line_number":6495,"context_line":"                    ctxt, instance, migrate_data, migration, limits)"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_ee1648f2","line":6492,"updated":"2019-09-05 20:57:42.000000000","message":"If this condition is false, it means the dest is pinned to not send 5.3 to the source, or the source is old or pinned to not send 5.3 to the dest (or the instance doesn\u0027t have numa_topology). Would it be helpful here to have an elif to this condition such that elif instance.numa_topology, we log something to the effect that the instance has numa topology but the source won\u0027t work with it so things are going to get real weird? Because the only way you get this far is if you unblock the workaround option in conductor first right? Meaning yup I\u0027ve upgraded and lifted RPC pins and I\u0027m happy to support live migrating these types of instances now, but something went wrong and we should probably log for it.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":6489,"context_line":"            numa_live_migration \u003d True if migration else False"},{"line_number":6490,"context_line":"            migrate_data \u003d self.compute_rpcapi.check_can_live_migrate_source("},{"line_number":6491,"context_line":"                ctxt, instance, dest_check_data, numa_live_migration)"},{"line_number":6492,"context_line":"            if (\u0027src_supports_numa_live_migration\u0027 in migrate_data and"},{"line_number":6493,"context_line":"                    migrate_data.src_supports_numa_live_migration):"},{"line_number":6494,"context_line":"                migrate_data \u003d self._live_migration_claim("},{"line_number":6495,"context_line":"                    ctxt, instance, migrate_data, migration, limits)"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_d93455e1","line":6492,"in_reply_to":"7faddb67_ee1648f2","updated":"2019-09-06 16:44:40.000000000","message":"We\u0027ll start doing this regardless of instance.numa_topology (see the my -1 on the previous patch) because we have to consider the case of a NUMA-less landing on a host with vcpu_pin_set and needing to update the \u003cvcpu\u003e element in the XML.\n\nThe workaround option in the conductor will become a noop as soon as the cell\u0027s min version is 40 aka RPC 5.3. I\u0027m actually asking in the deprecation patch whether that\u0027s enough, because conceivably even in that situation RPC pinning could still be a thing, though that seems unlikely.\n\nI can add a log saying \"dest was ready to start NUMA-LM, but source said no\"","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":6497,"context_line":"            migrate_data.vifs \u003d \\"},{"line_number":6498,"context_line":"                migrate_data_obj.VIFMigrateData.create_skeleton_migrate_vifs("},{"line_number":6499,"context_line":"                    instance.get_network_info())"},{"line_number":6500,"context_line":"            # Claim PCI devices for VIFs on destination (if needed)"},{"line_number":6501,"context_line":"            port_id_to_pci \u003d self._claim_pci_for_instance_vifs(ctxt, instance)"},{"line_number":6502,"context_line":"            # Update migrate VIFs with the newly claimed PCI devices"},{"line_number":6503,"context_line":"            self._update_migrate_vifs_profile_with_pci(migrate_data.vifs,"},{"line_number":6504,"context_line":"                                                       port_id_to_pci)"},{"line_number":6505,"context_line":"        finally:"},{"line_number":6506,"context_line":"            self.driver.cleanup_live_migration_destination_check(ctxt,"},{"line_number":6507,"context_line":"                    dest_check_data)"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_aed13059","line":6504,"range":{"start_line":6500,"start_character":12,"end_line":6504,"end_character":70},"updated":"2019-09-05 20:57:42.000000000","message":"Totally unrelated, but I\u0027m assuming this SR-IOV PCI device \u0027claim\u0027 can fail yeah? But I don\u0027t see where it would ever raise MigrationPreCheckError which means conductor won\u0027t reschedule to an alternate host:\n\nhttps://github.com/openstack/nova/blob/f7f5e1846c7b19aa05817df7f3c4345819db413f/nova/conductor/tasks/live_migrate.py#L483\n\nAnyway, that\u0027s Sean\u0027s problem.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5b3ec6d3076e0894c000d2f8b0318c5a24a25ef0","unresolved":false,"context_lines":[{"line_number":6497,"context_line":"            migrate_data.vifs \u003d \\"},{"line_number":6498,"context_line":"                migrate_data_obj.VIFMigrateData.create_skeleton_migrate_vifs("},{"line_number":6499,"context_line":"                    instance.get_network_info())"},{"line_number":6500,"context_line":"            # Claim PCI devices for VIFs on destination (if needed)"},{"line_number":6501,"context_line":"            port_id_to_pci \u003d self._claim_pci_for_instance_vifs(ctxt, instance)"},{"line_number":6502,"context_line":"            # Update migrate VIFs with the newly claimed PCI devices"},{"line_number":6503,"context_line":"            self._update_migrate_vifs_profile_with_pci(migrate_data.vifs,"},{"line_number":6504,"context_line":"                                                       port_id_to_pci)"},{"line_number":6505,"context_line":"        finally:"},{"line_number":6506,"context_line":"            self.driver.cleanup_live_migration_destination_check(ctxt,"},{"line_number":6507,"context_line":"                    dest_check_data)"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_0a84890b","line":6504,"range":{"start_line":6500,"start_character":12,"end_line":6504,"end_character":70},"in_reply_to":"5faad753_5646c27e","updated":"2019-09-10 18:41:47.000000000","message":"\u003e 2.another request (e.g boot instance or another migration) has\n \u003e consumed PCI resources on the node before the resources were\n \u003e reserved by the claim.\n \u003e \n \u003e for 2, i think the behaviour should be the same as a new instance\n \u003e build in this case.\n\nAnd what is that behavior? Do we reschedule? Because as written this code is not rescheduling to another host if that kind of claim fails during live migration, which is my point.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":28714,"name":"Adrian Chiris","email":"adrianc@nvidia.com","username":"adrianc"},"change_message_id":"41210ca40e655b3a90bfb39c7dce620fe4ac14a8","unresolved":false,"context_lines":[{"line_number":6497,"context_line":"            migrate_data.vifs \u003d \\"},{"line_number":6498,"context_line":"                migrate_data_obj.VIFMigrateData.create_skeleton_migrate_vifs("},{"line_number":6499,"context_line":"                    instance.get_network_info())"},{"line_number":6500,"context_line":"            # Claim PCI devices for VIFs on destination (if needed)"},{"line_number":6501,"context_line":"            port_id_to_pci \u003d self._claim_pci_for_instance_vifs(ctxt, instance)"},{"line_number":6502,"context_line":"            # Update migrate VIFs with the newly claimed PCI devices"},{"line_number":6503,"context_line":"            self._update_migrate_vifs_profile_with_pci(migrate_data.vifs,"},{"line_number":6504,"context_line":"                                                       port_id_to_pci)"},{"line_number":6505,"context_line":"        finally:"},{"line_number":6506,"context_line":"            self.driver.cleanup_live_migration_destination_check(ctxt,"},{"line_number":6507,"context_line":"                    dest_check_data)"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_5646c27e","line":6504,"range":{"start_line":6500,"start_character":12,"end_line":6504,"end_character":70},"in_reply_to":"7faddb67_aed13059","updated":"2019-09-10 07:41:15.000000000","message":"IIRC, The assumption is that the migration was scheduled on a node that has enough PCI resources.\n\nThe claiming may fail if:\n\n1. something wrong the the state of the PCI resources on the node, this is unexpected error and hence ok to fail without reschedule.\n\n2.another request (e.g boot instance or another migration) has consumed PCI resources on the node before the resources were reserved by the claim.\n\nfor 2, i think the behaviour should be the same as a new instance build in this case. (ofc the issue would be averted if PCI resource claim is moved to placement and done at conductor level)","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":6519,"context_line":"        :param limits: The SchedulerLimits object for this live migration"},{"line_number":6520,"context_line":"        :returns: migrate_data with dst_numa_info set if necessary"},{"line_number":6521,"context_line":"        \"\"\""},{"line_number":6522,"context_line":"        # TODO(artom) This check is necessary for old computes that cannot"},{"line_number":6523,"context_line":"        # perform NUMA-aware live migrations. Remove in RPC 6.0."},{"line_number":6524,"context_line":"        try:"},{"line_number":6525,"context_line":"            claim \u003d self.rt.live_migration_claim("}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_d34e9794","line":6522,"updated":"2019-09-05 20:57:42.000000000","message":"Is this misplaced? What check? Maybe you meant on L6492?","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":6519,"context_line":"        :param limits: The SchedulerLimits object for this live migration"},{"line_number":6520,"context_line":"        :returns: migrate_data with dst_numa_info set if necessary"},{"line_number":6521,"context_line":"        \"\"\""},{"line_number":6522,"context_line":"        # TODO(artom) This check is necessary for old computes that cannot"},{"line_number":6523,"context_line":"        # perform NUMA-aware live migrations. Remove in RPC 6.0."},{"line_number":6524,"context_line":"        try:"},{"line_number":6525,"context_line":"            claim \u003d self.rt.live_migration_claim("}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_39ab29d7","line":6522,"in_reply_to":"7faddb67_d34e9794","updated":"2019-09-06 16:44:40.000000000","message":"Yep, when Dan asked to move the conditional I forgot to move the TODO, done.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":6523,"context_line":"        # perform NUMA-aware live migrations. Remove in RPC 6.0."},{"line_number":6524,"context_line":"        try:"},{"line_number":6525,"context_line":"            claim \u003d self.rt.live_migration_claim("},{"line_number":6526,"context_line":"                ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6527,"context_line":"                limits)"},{"line_number":6528,"context_line":"            LOG.debug(\u0027Created live migration claim %s\u0027, claim,"},{"line_number":6529,"context_line":"                      instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_535aa74f","line":6526,"range":{"start_line":6526,"start_character":32,"end_line":6526,"end_character":60},"updated":"2019-09-05 20:57:42.000000000","message":"This can just be migration.dest_node. Save some time by not calling the driver to get the available nodes.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"c5abaff24957041462d57d1a1a2dfe3f661a70b0","unresolved":false,"context_lines":[{"line_number":6523,"context_line":"        # perform NUMA-aware live migrations. Remove in RPC 6.0."},{"line_number":6524,"context_line":"        try:"},{"line_number":6525,"context_line":"            claim \u003d self.rt.live_migration_claim("},{"line_number":6526,"context_line":"                ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6527,"context_line":"                limits)"},{"line_number":6528,"context_line":"            LOG.debug(\u0027Created live migration claim %s\u0027, claim,"},{"line_number":6529,"context_line":"                      instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_e9193188","line":6526,"in_reply_to":"","updated":"2019-09-07 19:06:54.000000000","message":"I got it wrong initially. I left a NOTE in the latest _live_migration_claim explaining that we could get there from _find_destination in the conductor live migrate task, au which point migration.dest_node is not set yet.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"34d632768f7f1994300de09e666c40abd43defbf","unresolved":false,"context_lines":[{"line_number":6523,"context_line":"        # perform NUMA-aware live migrations. Remove in RPC 6.0."},{"line_number":6524,"context_line":"        try:"},{"line_number":6525,"context_line":"            claim \u003d self.rt.live_migration_claim("},{"line_number":6526,"context_line":"                ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6527,"context_line":"                limits)"},{"line_number":6528,"context_line":"            LOG.debug(\u0027Created live migration claim %s\u0027, claim,"},{"line_number":6529,"context_line":"                      instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_7fb17ce1","line":6526,"range":{"start_line":6526,"start_character":32,"end_line":6526,"end_character":60},"in_reply_to":"5faad753_79820152","updated":"2019-09-06 22:25:34.000000000","message":"This uncovers some weirdness in how the conductor creates the migration object: dest_node is not always set [1], and causes the claim to be NopClaim [2]\n\n[1] https://github.com/openstack/nova/blob/master/nova/conductor/tasks/live_migrate.py#L97-L141\n[2] https://github.com/openstack/nova/blob/master/nova/compute/resource_tracker.py#L279","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"5389c40d4e8b8215d282512b5081d1e4248ac334","unresolved":false,"context_lines":[{"line_number":6523,"context_line":"        # perform NUMA-aware live migrations. Remove in RPC 6.0."},{"line_number":6524,"context_line":"        try:"},{"line_number":6525,"context_line":"            claim \u003d self.rt.live_migration_claim("},{"line_number":6526,"context_line":"                ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6527,"context_line":"                limits)"},{"line_number":6528,"context_line":"            LOG.debug(\u0027Created live migration claim %s\u0027, claim,"},{"line_number":6529,"context_line":"                      instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_e961313b","line":6526,"range":{"start_line":6526,"start_character":32,"end_line":6526,"end_character":60},"in_reply_to":"5faad753_7fb17ce1","updated":"2019-09-07 18:32:08.000000000","message":"migration.dest_node is always set in conductor here:\n\nhttps://github.com/openstack/nova/blob/master/nova/conductor/tasks/live_migrate.py#L141\n\nI don\u0027t see what [2] (RT.disabled) has to do with Migration.dest_node:\n\nhttps://github.com/openstack/nova/blob/master/nova/compute/resource_tracker.py#L478","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"0bfe7dcff0e440c1d09f008e0fcdacd62884f83e","unresolved":false,"context_lines":[{"line_number":6523,"context_line":"        # perform NUMA-aware live migrations. Remove in RPC 6.0."},{"line_number":6524,"context_line":"        try:"},{"line_number":6525,"context_line":"            claim \u003d self.rt.live_migration_claim("},{"line_number":6526,"context_line":"                ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6527,"context_line":"                limits)"},{"line_number":6528,"context_line":"            LOG.debug(\u0027Created live migration claim %s\u0027, claim,"},{"line_number":6529,"context_line":"                      instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_49040518","line":6526,"in_reply_to":"5faad753_e961313b","updated":"2019-09-07 19:16:38.000000000","message":"\u003e I don\u0027t see what [2] (RT.disabled) has to do with Migration.dest_node:\n \u003e \n \u003e https://github.com/openstack/nova/blob/master/nova/compute/resource_tracker.py#L478\n\nI\u0027m on my phone with no access to my laptop, so it\u0027s a pita to lookup code, but I wanted to at least reply to this. if you drill down, the nodename being None does end up triggering the NopClaim creation.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":6523,"context_line":"        # perform NUMA-aware live migrations. Remove in RPC 6.0."},{"line_number":6524,"context_line":"        try:"},{"line_number":6525,"context_line":"            claim \u003d self.rt.live_migration_claim("},{"line_number":6526,"context_line":"                ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6527,"context_line":"                limits)"},{"line_number":6528,"context_line":"            LOG.debug(\u0027Created live migration claim %s\u0027, claim,"},{"line_number":6529,"context_line":"                      instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_79820152","line":6526,"range":{"start_line":6526,"start_character":32,"end_line":6526,"end_character":60},"in_reply_to":"7faddb67_535aa74f","updated":"2019-09-06 16:44:40.000000000","message":"Done","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":6525,"context_line":"            claim \u003d self.rt.live_migration_claim("},{"line_number":6526,"context_line":"                ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6527,"context_line":"                limits)"},{"line_number":6528,"context_line":"            LOG.debug(\u0027Created live migration claim %s\u0027, claim,"},{"line_number":6529,"context_line":"                      instance\u003dinstance)"},{"line_number":6530,"context_line":"        except exception.ComputeResourcesUnavailable as e:"},{"line_number":6531,"context_line":"            raise exception.MigrationPreCheckError("}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_7336c304","line":6528,"range":{"start_line":6528,"start_character":57,"end_line":6528,"end_character":62},"updated":"2019-09-05 20:57:42.000000000","message":"This is not very helpful in the logs:\n\nhttps://zuul.opendev.org/t/openstack/build/d51f91efa937411a9179b930eff3ab08/log/controller/logs/screen-n-cpu.txt.gz#3249\n\nSep 04 15:38:56.482892 ubuntu-bionic-expanded-fortnebula-regionone-0010749569 nova-compute[26046]: DEBUG nova.compute.manager [None req-1ad73219-1f7f-4301-8c23-06374de43dbf tempest-LiveMigrationTest-715345029 tempest-LiveMigrationTest-715345029] [instance: a7d5bc6e-0f21-4398-897f-98a6121b3695] Created live migration claim \u003cnova.compute.claims.MoveClaim object at 0x7f70500ffcf8\u003e {{(pid\u003d26046) _live_migration_claim /opt/stack/nova/nova/compute/manager.py:6528}}","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":6525,"context_line":"            claim \u003d self.rt.live_migration_claim("},{"line_number":6526,"context_line":"                ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6527,"context_line":"                limits)"},{"line_number":6528,"context_line":"            LOG.debug(\u0027Created live migration claim %s\u0027, claim,"},{"line_number":6529,"context_line":"                      instance\u003dinstance)"},{"line_number":6530,"context_line":"        except exception.ComputeResourcesUnavailable as e:"},{"line_number":6531,"context_line":"            raise exception.MigrationPreCheckError("}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_99e81d17","line":6528,"range":{"start_line":6528,"start_character":57,"end_line":6528,"end_character":62},"in_reply_to":"7faddb67_7336c304","updated":"2019-09-06 16:44:40.000000000","message":"Done","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":6530,"context_line":"        except exception.ComputeResourcesUnavailable as e:"},{"line_number":6531,"context_line":"            raise exception.MigrationPreCheckError("},{"line_number":6532,"context_line":"                reason\u003de.format_message())"},{"line_number":6533,"context_line":"        migrate_data \u003d self.driver.post_claim_migrate_data("},{"line_number":6534,"context_line":"            ctxt, instance, migrate_data, claim)"},{"line_number":6535,"context_line":"        return migrate_data"},{"line_number":6536,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_eebac808","line":6533,"range":{"start_line":6533,"start_character":8,"end_line":6533,"end_character":20},"updated":"2019-09-05 20:57:42.000000000","message":"nit: could just return here","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":6530,"context_line":"        except exception.ComputeResourcesUnavailable as e:"},{"line_number":6531,"context_line":"            raise exception.MigrationPreCheckError("},{"line_number":6532,"context_line":"                reason\u003de.format_message())"},{"line_number":6533,"context_line":"        migrate_data \u003d self.driver.post_claim_migrate_data("},{"line_number":6534,"context_line":"            ctxt, instance, migrate_data, claim)"},{"line_number":6535,"context_line":"        return migrate_data"},{"line_number":6536,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_b9edd926","line":6533,"range":{"start_line":6533,"start_character":8,"end_line":6533,"end_character":20},"in_reply_to":"7faddb67_eebac808","updated":"2019-09-06 16:44:40.000000000","message":"Done","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":6547,"context_line":"        :param ctxt: security context"},{"line_number":6548,"context_line":"        :param instance: dict of instance data"},{"line_number":6549,"context_line":"        :param dest_check_data: result of check_can_live_migrate_destination"},{"line_number":6550,"context_line":"        :param numa_live_migration: Boolean sentinel used to indicate that RPC"},{"line_number":6551,"context_line":"                                    is new enough to support NUMA live"},{"line_number":6552,"context_line":"                                    migration."},{"line_number":6553,"context_line":"        :returns: a LiveMigrateData object"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_ae5ff0e2","line":6550,"range":{"start_line":6550,"start_character":75,"end_line":6550,"end_character":78},"updated":"2019-09-05 20:57:42.000000000","message":"this is a bit ambiguous - you really mean that the dest is new enough, right?","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":6547,"context_line":"        :param ctxt: security context"},{"line_number":6548,"context_line":"        :param instance: dict of instance data"},{"line_number":6549,"context_line":"        :param dest_check_data: result of check_can_live_migrate_destination"},{"line_number":6550,"context_line":"        :param numa_live_migration: Boolean sentinel used to indicate that RPC"},{"line_number":6551,"context_line":"                                    is new enough to support NUMA live"},{"line_number":6552,"context_line":"                                    migration."},{"line_number":6553,"context_line":"        :returns: a LiveMigrateData object"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_59cb85a4","line":6550,"range":{"start_line":6550,"start_character":75,"end_line":6550,"end_character":78},"in_reply_to":"7faddb67_ae5ff0e2","updated":"2019-09-06 16:44:40.000000000","message":"Yeah. It\u0027s moot though, this code is gone.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":6567,"context_line":"        # indicating that both the conductor and the destination can send RPC"},{"line_number":6568,"context_line":"        # 5.3."},{"line_number":6569,"context_line":"        # 2. Ourselves, the source, can send RPC 5.3. There\u0027s no"},{"line_number":6570,"context_line":"        # sentinel/paramter for this, so we just ask our rpcapi directly."},{"line_number":6571,"context_line":"        # All of this, including src_supports_numa_live_migration, can be"},{"line_number":6572,"context_line":"        # removed in RPC 6.0."},{"line_number":6573,"context_line":"        can_numa_live_migrate \u003d ("}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_ced58c1c","line":6570,"range":{"start_line":6570,"start_character":19,"end_line":6570,"end_character":27},"updated":"2019-09-05 20:57:42.000000000","message":"parameter","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":6575,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6576,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in result and not"},{"line_number":6577,"context_line":"                can_numa_live_migrate):"},{"line_number":6578,"context_line":"            delattr(result, \u0027src_supports_numa_live_migration\u0027)"},{"line_number":6579,"context_line":"        LOG.debug(\u0027source check data is %s\u0027, result)"},{"line_number":6580,"context_line":"        return result"},{"line_number":6581,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_2ecf807f","line":6578,"updated":"2019-09-05 20:57:42.000000000","message":"OK this is why the commit message logic is a bit confusing, since it\u0027s based on how the code flow works, which is the driver sets the flag, then we check some stuff and potentially remove the flag. I get it, but the commit message is still confusing.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2eee21307809780aec4c750be12aa027fa348a75","unresolved":false,"context_lines":[{"line_number":6562,"context_line":"        result \u003d self.driver.check_can_live_migrate_source(ctxt, instance,"},{"line_number":6563,"context_line":"                                                           dest_check_data,"},{"line_number":6564,"context_line":"                                                           block_device_info)"},{"line_number":6565,"context_line":"        # TODO(artom) A NUMA live migration can be performed if:"},{"line_number":6566,"context_line":"        # 1. We got the numa_live_migration flag from the destination,"},{"line_number":6567,"context_line":"        # indicating that both the conductor and the destination can send RPC"},{"line_number":6568,"context_line":"        # 5.3."},{"line_number":6569,"context_line":"        # 2. Ourselves, the source, can send RPC 5.3. There\u0027s no"},{"line_number":6570,"context_line":"        # sentinel/paramter for this, so we just ask our rpcapi directly."},{"line_number":6571,"context_line":"        # All of this, including src_supports_numa_live_migration, can be"},{"line_number":6572,"context_line":"        # removed in RPC 6.0."},{"line_number":6573,"context_line":"        can_numa_live_migrate \u003d ("},{"line_number":6574,"context_line":"            numa_live_migration and"},{"line_number":6575,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6576,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in result and not"},{"line_number":6577,"context_line":"                can_numa_live_migrate):"},{"line_number":6578,"context_line":"            delattr(result, \u0027src_supports_numa_live_migration\u0027)"},{"line_number":6579,"context_line":"        LOG.debug(\u0027source check data is %s\u0027, result)"},{"line_number":6580,"context_line":"        return result"},{"line_number":6581,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_e27cf6b6","line":6578,"range":{"start_line":6565,"start_character":8,"end_line":6578,"end_character":63},"updated":"2019-09-06 18:45:19.000000000","message":"This was getting a bit convoluted to unit test, so I split it out into its own helper method. Same for the equivalent logic in check_can_live_migrate_destination (which was getting *really* convoluted to unit test).","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":6575,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6576,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in result and not"},{"line_number":6577,"context_line":"                can_numa_live_migrate):"},{"line_number":6578,"context_line":"            delattr(result, \u0027src_supports_numa_live_migration\u0027)"},{"line_number":6579,"context_line":"        LOG.debug(\u0027source check data is %s\u0027, result)"},{"line_number":6580,"context_line":"        return result"},{"line_number":6581,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_d91a1516","line":6578,"in_reply_to":"7faddb67_2ecf807f","updated":"2019-09-06 16:44:40.000000000","message":"Right, I didn\u0027t want the driver to worry about RPC and objects. It just always sets it, and then compute manager will remove it if there are higher layer blockers.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":7215,"context_line":"                migrate_data)"},{"line_number":7216,"context_line":""},{"line_number":7217,"context_line":"        if do_cleanup:"},{"line_number":7218,"context_line":"            # NOTE(artom) By this time the destination should have applied the"},{"line_number":7219,"context_line":"            # migration context and saved the instance. Some drivers will"},{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_ae8e1024","line":7218,"range":{"start_line":7218,"start_character":26,"end_line":7218,"end_character":38},"updated":"2019-09-05 20:57:42.000000000","message":"You mean post_live_migration_at_destination right? Just confirming.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":7215,"context_line":"                migrate_data)"},{"line_number":7216,"context_line":""},{"line_number":7217,"context_line":"        if do_cleanup:"},{"line_number":7218,"context_line":"            # NOTE(artom) By this time the destination should have applied the"},{"line_number":7219,"context_line":"            # migration context and saved the instance. Some drivers will"},{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_b9c07952","line":7218,"range":{"start_line":7218,"start_character":26,"end_line":7218,"end_character":38},"in_reply_to":"7faddb67_ae8e1024","updated":"2019-09-06 16:44:40.000000000","message":"Yep, made the node more precise. Also changed \u0027should\u0027 to \u0027will\u0027, because post_live_migration_at_destination is a call and not a cast, so it\u0027ll be done by the time we get to this bit.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":7218,"context_line":"            # NOTE(artom) By this time the destination should have applied the"},{"line_number":7219,"context_line":"            # migration context and saved the instance. Some drivers will"},{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7222,"context_line":"            # object, refresh it."},{"line_number":7223,"context_line":"            instance.refresh()"},{"line_number":7224,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_8e979439","line":7221,"range":{"start_line":7221,"start_character":56,"end_line":7221,"end_character":61},"updated":"2019-09-05 20:57:42.000000000","message":"this makes it sound like the driver has an instance object, but I think you mean the instance object in scope, right?","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":7218,"context_line":"            # NOTE(artom) By this time the destination should have applied the"},{"line_number":7219,"context_line":"            # migration context and saved the instance. Some drivers will"},{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7222,"context_line":"            # object, refresh it."},{"line_number":7223,"context_line":"            instance.refresh()"},{"line_number":7224,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_99b7bdd9","line":7221,"range":{"start_line":7221,"start_character":56,"end_line":7221,"end_character":61},"in_reply_to":"7faddb67_8e979439","updated":"2019-09-06 16:44:40.000000000","message":"Right.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7222,"context_line":"            # object, refresh it."},{"line_number":7223,"context_line":"            instance.refresh()"},{"line_number":7224,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":7225,"context_line":"                      instance\u003dinstance)"},{"line_number":7226,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_4e9d1c55","line":7223,"updated":"2019-09-05 20:57:42.000000000","message":"This seems unrelated to your change - wouldn\u0027t this be a latent issue that could be fixed separately? Or is there something about driver.cleanup with numa now that we have to account for with this change?","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"238061b4c44a12f5061aa8e6f139c23f98c31fab","unresolved":false,"context_lines":[{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7222,"context_line":"            # object, refresh it."},{"line_number":7223,"context_line":"            instance.refresh()"},{"line_number":7224,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":7225,"context_line":"                      instance\u003dinstance)"},{"line_number":7226,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_168a931a","line":7223,"in_reply_to":"","updated":"2019-09-09 20:37:00.000000000","message":"This all started at the end of Stein when Windriver reported the new NUMA topology not being saved. Gerry from Windriver thought it was weird because apply_migration_context was being called, so he surmised the source was interfering. His fix (https://github.com/starlingx-staging/stx-nova/pull/23/commits/96324ab04cb87fc6fe7ca2b3f085492cf6dd9906) was this refresh thing. At the time I reproduced the issue and confirmed his fix. But of course now I\u0027m doubting myself. I\u0027m going to try removing this refresh and play around.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3664d1da986119b8555bf4ba617858cbedb9767c","unresolved":false,"context_lines":[{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7222,"context_line":"            # object, refresh it."},{"line_number":7223,"context_line":"            instance.refresh()"},{"line_number":7224,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":7225,"context_line":"                      instance\u003dinstance)"},{"line_number":7226,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_346547b6","line":7223,"in_reply_to":"5faad753_168a931a","updated":"2019-09-09 21:36:53.000000000","message":"Does the source copy of the instance have dirty fields related to the migration context?","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7222,"context_line":"            # object, refresh it."},{"line_number":7223,"context_line":"            instance.refresh()"},{"line_number":7224,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":7225,"context_line":"                      instance\u003dinstance)"},{"line_number":7226,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_60353dda","line":7223,"in_reply_to":"5faad753_19cbcd53","updated":"2019-09-09 18:08:49.000000000","message":"OK it still seems that this could be an issue before this change because post_live_migration_at_destination does make changes to the instance and save them to the DB:\n\nhttps://github.com/openstack/nova/blob/b244a02730e349a69b809348bfa9ad7c899c4204/nova/compute/manager.py#L7292","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a7f264145199a49f9bbf9bbf5e915a598ed6b012","unresolved":false,"context_lines":[{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7222,"context_line":"            # object, refresh it."},{"line_number":7223,"context_line":"            instance.refresh()"},{"line_number":7224,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":7225,"context_line":"                      instance\u003dinstance)"},{"line_number":7226,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_6d2bed2f","line":7223,"in_reply_to":"5faad753_346547b6","updated":"2019-09-10 03:00:32.000000000","message":"So, functional tests pass without this. I\u0027ll try on real hardware tomorrow, or ask Sean to do it.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"ccf745a6e07ed7893e61176950c03da4ffa135e0","unresolved":false,"context_lines":[{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7222,"context_line":"            # object, refresh it."},{"line_number":7223,"context_line":"            instance.refresh()"},{"line_number":7224,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":7225,"context_line":"                      instance\u003dinstance)"},{"line_number":7226,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_80fab93f","line":7223,"in_reply_to":"5faad753_60353dda","updated":"2019-09-09 19:34:06.000000000","message":"I need to come back to this, but at first glance you\u0027re right, when the libvirt driver is calling instance.save() here [1], you\u0027d think we\u0027d be clobbering everything the dest has saved. I need to look at the save() code rabbit-hole deeper.\n\n[1] https://github.com/openstack/nova/blob/b244a02730e349a69b809348bfa9ad7c899c4204/nova/virt/libvirt/driver.py#L1203","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1e72f14775c65711c93131f6c1ecfa6e1fd60d61","unresolved":false,"context_lines":[{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7222,"context_line":"            # object, refresh it."},{"line_number":7223,"context_line":"            instance.refresh()"},{"line_number":7224,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":7225,"context_line":"                      instance\u003dinstance)"},{"line_number":7226,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_ec6356db","line":7223,"in_reply_to":"5faad753_6d2bed2f","updated":"2019-09-10 12:46:50.000000000","message":"checking with the latest version the instance numa toplogy is not being save to the db on migration so we need to add this back.\n\nthe functional test are not testing this behavior properly. \ni have not looked at them specificaly but i would guess they are asserting that the object is updated in memory but not actully calling into the db to check.\n\nthe functional test should be using a realy sqlite nova db insance if we have use the correct fixtures so we shoudl be able to test this in the functional tests if they are writtend to directly query the instance extra table in the db to assert that it has been updated.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"74e2b04d5709268240280282d205ca2d589b2d46","unresolved":false,"context_lines":[{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7222,"context_line":"            # object, refresh it."},{"line_number":7223,"context_line":"            instance.refresh()"},{"line_number":7224,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":7225,"context_line":"                      instance\u003dinstance)"},{"line_number":7226,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_9621a350","line":7223,"in_reply_to":"5faad753_80fab93f","updated":"2019-09-09 20:08:07.000000000","message":"Just looking quickly, I\u0027m not sure I follow why we\u0027re concerned about clobberage. The instance.save() will only touch dirty fields -- meaning, only things that have been changed on the object will be saved. The save() itself will refresh the instance from the database state.\n\nI\u0027m not sure what the actual concern here is that brought the initial need for instance.save(), but it wouldn\u0027t surprise me if it\u0027s necessary. Perhaps Artom didn\u0027t actually experience some issue but was being overly proactive? If not, then I\u0027d want to know what caused this to be added in the first place.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"28991400e3f64cc792e95898defb153cd8c5933e","unresolved":false,"context_lines":[{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7222,"context_line":"            # object, refresh it."},{"line_number":7223,"context_line":"            instance.refresh()"},{"line_number":7224,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":7225,"context_line":"                      instance\u003dinstance)"},{"line_number":7226,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_de971b90","line":7223,"in_reply_to":"5faad753_ec6356db","updated":"2019-09-10 15:34:42.000000000","message":"The reason functional tests weren\u0027t hitting this is because the conditional on L7217 was false. If that\u0027s true and we remove instance.refresh(), they correctly fail on the new NUMA topology assertion.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":7220,"context_line":"            # save() the instance in their cleanup() implementation. In order"},{"line_number":7221,"context_line":"            # to prevent drivers clobbering fields with their outdated instance"},{"line_number":7222,"context_line":"            # object, refresh it."},{"line_number":7223,"context_line":"            instance.refresh()"},{"line_number":7224,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":7225,"context_line":"                      instance\u003dinstance)"},{"line_number":7226,"context_line":"            self.driver.cleanup(ctxt, instance, unplug_nw_info,"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_19cbcd53","line":7223,"in_reply_to":"7faddb67_4e9d1c55","updated":"2019-09-06 16:44:40.000000000","message":"It\u0027s new because we apply the migration context on the destination to save the new instance NUMA topology. So if on the source (here) the driver calls instance.save(), it\u0027ll clobber what the destination wrote to instance.numa_topology from the migration_context with the old instance.numa_topology that\u0027s in our instance object.\n\nI tried rephrasing the NOTE to be clearer.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":7343,"context_line":"                # NOTE(artom) Apply followed by drop looks weird, but apply"},{"line_number":7344,"context_line":"                # just saves the new fields while drop actually removes the"},{"line_number":7345,"context_line":"                # migration context from the instance."},{"line_number":7346,"context_line":"                instance.apply_migration_context()"},{"line_number":7347,"context_line":"                instance.drop_migration_context()"},{"line_number":7348,"context_line":"                instance.host \u003d self.host"},{"line_number":7349,"context_line":"                instance.power_state \u003d current_power_state"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_4e78bc29","line":7346,"updated":"2019-09-05 20:57:42.000000000","message":"Since we\u0027re in a finally block, this is always going to be called. Do we want to apply the migration context even if we\u0027re dealing with a failure from self.driver.post_live_migration_at_destination?","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"ccf745a6e07ed7893e61176950c03da4ffa135e0","unresolved":false,"context_lines":[{"line_number":7343,"context_line":"                # NOTE(artom) Apply followed by drop looks weird, but apply"},{"line_number":7344,"context_line":"                # just saves the new fields while drop actually removes the"},{"line_number":7345,"context_line":"                # migration context from the instance."},{"line_number":7346,"context_line":"                instance.apply_migration_context()"},{"line_number":7347,"context_line":"                instance.drop_migration_context()"},{"line_number":7348,"context_line":"                instance.host \u003d self.host"},{"line_number":7349,"context_line":"                instance.power_state \u003d current_power_state"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_20bc25db","line":7346,"in_reply_to":"5faad753_40528115","updated":"2019-09-09 19:34:06.000000000","message":"Done","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":7343,"context_line":"                # NOTE(artom) Apply followed by drop looks weird, but apply"},{"line_number":7344,"context_line":"                # just saves the new fields while drop actually removes the"},{"line_number":7345,"context_line":"                # migration context from the instance."},{"line_number":7346,"context_line":"                instance.apply_migration_context()"},{"line_number":7347,"context_line":"                instance.drop_migration_context()"},{"line_number":7348,"context_line":"                instance.host \u003d self.host"},{"line_number":7349,"context_line":"                instance.power_state \u003d current_power_state"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_40528115","line":7346,"in_reply_to":"5faad753_99057d7d","updated":"2019-09-09 18:08:49.000000000","message":"That\u0027s probably a good comment to leave in the code then for when someone wonders about this while debugging live migration failures in the future.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":7343,"context_line":"                # NOTE(artom) Apply followed by drop looks weird, but apply"},{"line_number":7344,"context_line":"                # just saves the new fields while drop actually removes the"},{"line_number":7345,"context_line":"                # migration context from the instance."},{"line_number":7346,"context_line":"                instance.apply_migration_context()"},{"line_number":7347,"context_line":"                instance.drop_migration_context()"},{"line_number":7348,"context_line":"                instance.host \u003d self.host"},{"line_number":7349,"context_line":"                instance.power_state \u003d current_power_state"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_99057d7d","line":7346,"in_reply_to":"7faddb67_4e78bc29","updated":"2019-09-06 16:44:40.000000000","message":"Good question - I had to check, but yep. For libvirt post_live_migration_at_destination just reattaches VIFs, so it\u0027s irrelevant if that failed. The instance has a new NUMA topology, it\u0027s XML has changed, we\u0027ve claimed resources for it, etc. We need to record those changes.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":7418,"context_line":"        # TODO(artom) drop_move_claim_at_destination() is new in RPC 5.3, only"},{"line_number":7419,"context_line":"        # call it if we performed a NUMA-aware live migration (which implies us"},{"line_number":7420,"context_line":"        # being able to send RPC 5.3). This check can be removed in RPC 6.0."},{"line_number":7421,"context_line":"        if \u0027dst_numa_info\u0027 in migrate_data:"},{"line_number":7422,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":7423,"context_line":"                                                               instance, dest)"},{"line_number":7424,"context_line":"        instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_cedfcc09","line":7421,"updated":"2019-09-05 20:57:42.000000000","message":"This is libvirt implementation details leaking into the compute manager code, right? The default implementation for post_claim_migrate_data is to return migrate_data untouched, and only the libvirt driver sets dst_numa_info, but we do the claim on the dest regardless of whether or not the driver sets this field, right? So don\u0027t we need to do something else to tell when we should drop the claim? Would that be a combination of checking for src_supports_numa_live_migration in migrate_data and being True like in check_can_live_migrate_destination (isn\u0027t it actually the exact same logic and could be moved into a helper method, like _should_do_live_migrate_claim(migrate_data)?).","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":7418,"context_line":"        # TODO(artom) drop_move_claim_at_destination() is new in RPC 5.3, only"},{"line_number":7419,"context_line":"        # call it if we performed a NUMA-aware live migration (which implies us"},{"line_number":7420,"context_line":"        # being able to send RPC 5.3). This check can be removed in RPC 6.0."},{"line_number":7421,"context_line":"        if \u0027dst_numa_info\u0027 in migrate_data:"},{"line_number":7422,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":7423,"context_line":"                                                               instance, dest)"},{"line_number":7424,"context_line":"        instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_0514939f","line":7421,"in_reply_to":"5faad753_40a041f5","updated":"2019-09-10 02:18:03.000000000","message":"Done","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":7418,"context_line":"        # TODO(artom) drop_move_claim_at_destination() is new in RPC 5.3, only"},{"line_number":7419,"context_line":"        # call it if we performed a NUMA-aware live migration (which implies us"},{"line_number":7420,"context_line":"        # being able to send RPC 5.3). This check can be removed in RPC 6.0."},{"line_number":7421,"context_line":"        if \u0027dst_numa_info\u0027 in migrate_data:"},{"line_number":7422,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":7423,"context_line":"                                                               instance, dest)"},{"line_number":7424,"context_line":"        instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_40a041f5","line":7421,"in_reply_to":"5faad753_d958d557","updated":"2019-09-09 18:08:49.000000000","message":"That\u0027s probably a good comment to leave since you\u0027re only doing an \"in\" check rather than also checking the value is True.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":7418,"context_line":"        # TODO(artom) drop_move_claim_at_destination() is new in RPC 5.3, only"},{"line_number":7419,"context_line":"        # call it if we performed a NUMA-aware live migration (which implies us"},{"line_number":7420,"context_line":"        # being able to send RPC 5.3). This check can be removed in RPC 6.0."},{"line_number":7421,"context_line":"        if \u0027dst_numa_info\u0027 in migrate_data:"},{"line_number":7422,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":7423,"context_line":"                                                               instance, dest)"},{"line_number":7424,"context_line":"        instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_d958d557","line":7421,"in_reply_to":"7faddb67_cedfcc09","updated":"2019-09-06 16:44:40.000000000","message":"We can reuse the src_supports_numa_live_migration flag, because that will be set iff:\n\n- dst_supports_numa_live_migration made its way to the source (meaning both dest and source are new and conductor can speak RPC 5.3)\n- src_supports_numa_live_migration was set by the source driver and passed the send-RPC-5.3 check","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":7513,"context_line":""},{"line_number":7514,"context_line":"    @wrap_exception()"},{"line_number":7515,"context_line":"    @wrap_instance_fault"},{"line_number":7516,"context_line":"    def drop_move_claim_at_destination(self, context, instance):"},{"line_number":7517,"context_line":"        self.rt.drop_move_claim("},{"line_number":7518,"context_line":"            context, instance, self._get_nodename(instance),"},{"line_number":7519,"context_line":"            instance.flavor)"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_2e3ea028","line":7516,"updated":"2019-09-05 20:57:42.000000000","message":"Docs would sure be nice, e.g. at least mention this is for dropping a move claim for a live migration at the dest host when rolling back from a failed live migration on the source host.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":7513,"context_line":""},{"line_number":7514,"context_line":"    @wrap_exception()"},{"line_number":7515,"context_line":"    @wrap_instance_fault"},{"line_number":7516,"context_line":"    def drop_move_claim_at_destination(self, context, instance):"},{"line_number":7517,"context_line":"        self.rt.drop_move_claim("},{"line_number":7518,"context_line":"            context, instance, self._get_nodename(instance),"},{"line_number":7519,"context_line":"            instance.flavor)"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_7c0d0f36","line":7516,"in_reply_to":"7faddb67_2e3ea028","updated":"2019-09-06 16:44:40.000000000","message":"Done","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":7516,"context_line":"    def drop_move_claim_at_destination(self, context, instance):"},{"line_number":7517,"context_line":"        self.rt.drop_move_claim("},{"line_number":7518,"context_line":"            context, instance, self._get_nodename(instance),"},{"line_number":7519,"context_line":"            instance.flavor)"},{"line_number":7520,"context_line":""},{"line_number":7521,"context_line":"    @wrap_exception()"},{"line_number":7522,"context_line":"    @wrap_instance_event(prefix\u003d\u0027compute\u0027)"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_2e278014","line":7519,"range":{"start_line":7519,"start_character":12,"end_line":7519,"end_character":27},"updated":"2019-09-05 20:57:42.000000000","message":"nit: use named kwargs here: instance_type\u003dinstance.flavor","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":7516,"context_line":"    def drop_move_claim_at_destination(self, context, instance):"},{"line_number":7517,"context_line":"        self.rt.drop_move_claim("},{"line_number":7518,"context_line":"            context, instance, self._get_nodename(instance),"},{"line_number":7519,"context_line":"            instance.flavor)"},{"line_number":7520,"context_line":""},{"line_number":7521,"context_line":"    @wrap_exception()"},{"line_number":7522,"context_line":"    @wrap_instance_event(prefix\u003d\u0027compute\u0027)"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_3c0f972f","line":7519,"range":{"start_line":7519,"start_character":12,"end_line":7519,"end_character":27},"in_reply_to":"7faddb67_2e278014","updated":"2019-09-06 16:44:40.000000000","message":"Done","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":6491,"context_line":"        dest_check_data \u003d self.driver.check_can_live_migrate_destination(ctxt,"},{"line_number":6492,"context_line":"            instance, src_compute_info, dst_compute_info,"},{"line_number":6493,"context_line":"            block_migration, disk_over_commit)"},{"line_number":6494,"context_line":"        dest_check_data \u003d self._dest_can_numa_live_migrate(dest_check_data,"},{"line_number":6495,"context_line":"                                                           migration)"},{"line_number":6496,"context_line":"        LOG.debug(\u0027destination check data is %s\u0027, dest_check_data)"},{"line_number":6497,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_6c21b9fb","line":6494,"updated":"2019-09-09 18:08:49.000000000","message":"OK by the time we call this the libvirt driver will have set the flag:\n\nhttps://review.opendev.org/#/c/634606/80/nova/virt/libvirt/driver.py@7320","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":6502,"context_line":"                migrate_data \u003d self._live_migration_claim("},{"line_number":6503,"context_line":"                    ctxt, instance, migrate_data, migration, limits)"},{"line_number":6504,"context_line":"            else:"},{"line_number":6505,"context_line":"                LOG.info(\u0027Destination was ready for NUMA live migration, \u0027"},{"line_number":6506,"context_line":"                         \u0027but source is either too old, or is set to an \u0027"},{"line_number":6507,"context_line":"                         \u0027older upgrade level.\u0027, instance\u003dinstance)"},{"line_number":6508,"context_line":"            # Create migrate_data vifs"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_2c62e13f","line":6505,"updated":"2019-09-09 18:08:49.000000000","message":"Umm, this isn\u0027t true for any non-libvirt driver, right?\n\nDon\u0027t you need to check for dst_supports_numa_live_migration in dest_check_data before logging this?","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"ccf745a6e07ed7893e61176950c03da4ffa135e0","unresolved":false,"context_lines":[{"line_number":6502,"context_line":"                migrate_data \u003d self._live_migration_claim("},{"line_number":6503,"context_line":"                    ctxt, instance, migrate_data, migration, limits)"},{"line_number":6504,"context_line":"            else:"},{"line_number":6505,"context_line":"                LOG.info(\u0027Destination was ready for NUMA live migration, \u0027"},{"line_number":6506,"context_line":"                         \u0027but source is either too old, or is set to an \u0027"},{"line_number":6507,"context_line":"                         \u0027older upgrade level.\u0027, instance\u003dinstance)"},{"line_number":6508,"context_line":"            # Create migrate_data vifs"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_20be6565","line":6505,"in_reply_to":"5faad753_2c62e13f","updated":"2019-09-09 19:34:06.000000000","message":"Doh, right. Done.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":6532,"context_line":"        :returns: migrate_data with dst_numa_info set if necessary"},{"line_number":6533,"context_line":"        \"\"\""},{"line_number":6534,"context_line":"        try:"},{"line_number":6535,"context_line":"            # NOTE(artom) We might have gotten here from _find_destination() in"},{"line_number":6536,"context_line":"            # the conductor live migrate task. At that point,"},{"line_number":6537,"context_line":"            # migration.dest_node is not set yet (nor should it be, we\u0027re still"},{"line_number":6538,"context_line":"            # looking for a destination, after all). Therefore, we cannot use"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_6cabf91c","line":6535,"updated":"2019-09-09 18:08:49.000000000","message":"OK so in that case we set Migration.dest_node here:\n\nhttps://github.com/openstack/nova/blob/b244a02730e349a69b809348bfa9ad7c899c4204/nova/conductor/tasks/live_migrate.py#L141\n\nand _find_destination calls this:\n\nhttps://github.com/openstack/nova/blob/b244a02730e349a69b809348bfa9ad7c899c4204/nova/conductor/tasks/live_migrate.py#L482\n\nwhich calls check_can_live_migrate_destination:\n\nhttps://github.com/openstack/nova/blob/b244a02730e349a69b809348bfa9ad7c899c4204/nova/conductor/tasks/live_migrate.py#L321\n\nwhich gets us here, OK.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":6538,"context_line":"            # looking for a destination, after all). Therefore, we cannot use"},{"line_number":6539,"context_line":"            # migration.dest_node here and must use self._get_nodename()."},{"line_number":6540,"context_line":"            claim \u003d self.rt.live_migration_claim("},{"line_number":6541,"context_line":"                ctxt, instance, self._get_nodename(ctxt, instance), migration,"},{"line_number":6542,"context_line":"                limits)"},{"line_number":6543,"context_line":"            LOG.debug(\u0027Created live migration claim.\u0027, instance\u003dinstance)"},{"line_number":6544,"context_line":"        except exception.ComputeResourcesUnavailable as e:"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_2c9501e5","line":6541,"range":{"start_line":6541,"start_character":51,"end_line":6541,"end_character":55},"updated":"2019-09-09 18:08:49.000000000","message":"_get_nodename doesn\u0027t take a context parameter, how is this passing? I guess it thinks this is an instance and the instance is the refresh kwarg? I guess libvirt CI jobs aren\u0027t failing because the libvirt driver\u0027s get_available_nodes method doesn\u0027t check the refresh kwarg and _get_nodename only uses the instance arg for logging. This still needs to be fixed but if all else is OK I guess this could be done in a follow up.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"ccf745a6e07ed7893e61176950c03da4ffa135e0","unresolved":false,"context_lines":[{"line_number":6538,"context_line":"            # looking for a destination, after all). Therefore, we cannot use"},{"line_number":6539,"context_line":"            # migration.dest_node here and must use self._get_nodename()."},{"line_number":6540,"context_line":"            claim \u003d self.rt.live_migration_claim("},{"line_number":6541,"context_line":"                ctxt, instance, self._get_nodename(ctxt, instance), migration,"},{"line_number":6542,"context_line":"                limits)"},{"line_number":6543,"context_line":"            LOG.debug(\u0027Created live migration claim.\u0027, instance\u003dinstance)"},{"line_number":6544,"context_line":"        except exception.ComputeResourcesUnavailable as e:"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_e0136d65","line":6541,"range":{"start_line":6541,"start_character":51,"end_line":6541,"end_character":55},"in_reply_to":"5faad753_2c9501e5","updated":"2019-09-09 19:34:06.000000000","message":"Hah, right, instance was just used for logging, so passing a context in its place didn\u0027t explode anything. And the instance ends up going to the refresh kwarg as True-y. Fixed.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82d0b6c04fe8d2731c27dd1b421e66822a506894","unresolved":false,"context_lines":[{"line_number":6538,"context_line":"            # looking for a destination, after all). Therefore, we cannot use"},{"line_number":6539,"context_line":"            # migration.dest_node here and must use self._get_nodename()."},{"line_number":6540,"context_line":"            claim \u003d self.rt.live_migration_claim("},{"line_number":6541,"context_line":"                ctxt, instance, self._get_nodename(ctxt, instance), migration,"},{"line_number":6542,"context_line":"                limits)"},{"line_number":6543,"context_line":"            LOG.debug(\u0027Created live migration claim.\u0027, instance\u003dinstance)"},{"line_number":6544,"context_line":"        except exception.ComputeResourcesUnavailable as e:"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_6f3206f4","line":6541,"range":{"start_line":6541,"start_character":51,"end_line":6541,"end_character":55},"in_reply_to":"5faad753_e0136d65","updated":"2019-09-09 22:48:50.000000000","message":"so this need to be fixed in the next version.\ndo we need to set refresh\u003dtrue. i assume not the cached value should be correct in the libvirt case. \n\nlooking at the comment on that function do we need to check if its ironic. i think not becasue we will have declared that the host does not support numa live migration if it is ironic so when we get here we should already know its not ironic but i just said i would ask.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":6551,"context_line":"                                      source_check_data):"},{"line_number":6552,"context_line":"        # TODO(artom) A NUMA live migration can be performed if:"},{"line_number":6553,"context_line":"        # 1. We got the dst_supports_numa_live_migration sentinel in"},{"line_number":6554,"context_line":"        # dest_check_data, indicating that the conductor can send RPC 5.3 and"},{"line_number":6555,"context_line":"        # that the destination can receive it."},{"line_number":6556,"context_line":"        # 2. Ourselves, the source, can send RPC 5.3. There\u0027s no"},{"line_number":6557,"context_line":"        # sentinel/paramter for this, so we just ask our rpcapi directly."},{"line_number":6558,"context_line":"        # All of this can be removed in RPC 6.0/objects 2.0."}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_6c59b958","line":6555,"range":{"start_line":6554,"start_character":27,"end_line":6555,"end_character":46},"updated":"2019-09-09 18:08:49.000000000","message":"and that the virt driver on the dest compute supports NUMA live migration, right?","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"ccf745a6e07ed7893e61176950c03da4ffa135e0","unresolved":false,"context_lines":[{"line_number":6551,"context_line":"                                      source_check_data):"},{"line_number":6552,"context_line":"        # TODO(artom) A NUMA live migration can be performed if:"},{"line_number":6553,"context_line":"        # 1. We got the dst_supports_numa_live_migration sentinel in"},{"line_number":6554,"context_line":"        # dest_check_data, indicating that the conductor can send RPC 5.3 and"},{"line_number":6555,"context_line":"        # that the destination can receive it."},{"line_number":6556,"context_line":"        # 2. Ourselves, the source, can send RPC 5.3. There\u0027s no"},{"line_number":6557,"context_line":"        # sentinel/paramter for this, so we just ask our rpcapi directly."},{"line_number":6558,"context_line":"        # All of this can be removed in RPC 6.0/objects 2.0."}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_8004f918","line":6555,"range":{"start_line":6554,"start_character":27,"end_line":6555,"end_character":46},"in_reply_to":"5faad753_6c59b958","updated":"2019-09-09 19:34:06.000000000","message":"Yep, added.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":6554,"context_line":"        # dest_check_data, indicating that the conductor can send RPC 5.3 and"},{"line_number":6555,"context_line":"        # that the destination can receive it."},{"line_number":6556,"context_line":"        # 2. Ourselves, the source, can send RPC 5.3. There\u0027s no"},{"line_number":6557,"context_line":"        # sentinel/paramter for this, so we just ask our rpcapi directly."},{"line_number":6558,"context_line":"        # All of this can be removed in RPC 6.0/objects 2.0."},{"line_number":6559,"context_line":"        can_numa_live_migrate \u003d ("},{"line_number":6560,"context_line":"            \u0027dst_supports_numa_live_migration\u0027 in dest_check_data and"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_2c31810c","line":6557,"range":{"start_line":6557,"start_character":19,"end_line":6557,"end_character":27},"updated":"2019-09-09 18:08:49.000000000","message":"parameter","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"ccf745a6e07ed7893e61176950c03da4ffa135e0","unresolved":false,"context_lines":[{"line_number":6554,"context_line":"        # dest_check_data, indicating that the conductor can send RPC 5.3 and"},{"line_number":6555,"context_line":"        # that the destination can receive it."},{"line_number":6556,"context_line":"        # 2. Ourselves, the source, can send RPC 5.3. There\u0027s no"},{"line_number":6557,"context_line":"        # sentinel/paramter for this, so we just ask our rpcapi directly."},{"line_number":6558,"context_line":"        # All of this can be removed in RPC 6.0/objects 2.0."},{"line_number":6559,"context_line":"        can_numa_live_migrate \u003d ("},{"line_number":6560,"context_line":"            \u0027dst_supports_numa_live_migration\u0027 in dest_check_data and"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_23ff4f02","line":6557,"range":{"start_line":6557,"start_character":19,"end_line":6557,"end_character":27},"in_reply_to":"5faad753_2c31810c","updated":"2019-09-09 19:34:06.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":6557,"context_line":"        # sentinel/paramter for this, so we just ask our rpcapi directly."},{"line_number":6558,"context_line":"        # All of this can be removed in RPC 6.0/objects 2.0."},{"line_number":6559,"context_line":"        can_numa_live_migrate \u003d ("},{"line_number":6560,"context_line":"            \u0027dst_supports_numa_live_migration\u0027 in dest_check_data and"},{"line_number":6561,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6562,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in source_check_data and"},{"line_number":6563,"context_line":"                not can_numa_live_migrate):"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_cc21cdb6","line":6560,"range":{"start_line":6560,"start_character":12,"end_line":6560,"end_character":65},"updated":"2019-09-09 18:08:49.000000000","message":"Doing an \u0027in\u0027 check isn\u0027t really enough, is it? What if some driver set it to False just to be complete with setting all of the attributes?","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"ccf745a6e07ed7893e61176950c03da4ffa135e0","unresolved":false,"context_lines":[{"line_number":6557,"context_line":"        # sentinel/paramter for this, so we just ask our rpcapi directly."},{"line_number":6558,"context_line":"        # All of this can be removed in RPC 6.0/objects 2.0."},{"line_number":6559,"context_line":"        can_numa_live_migrate \u003d ("},{"line_number":6560,"context_line":"            \u0027dst_supports_numa_live_migration\u0027 in dest_check_data and"},{"line_number":6561,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6562,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in source_check_data and"},{"line_number":6563,"context_line":"                not can_numa_live_migrate):"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_631c676a","line":6560,"range":{"start_line":6560,"start_character":12,"end_line":6560,"end_character":65},"in_reply_to":"5faad753_cc21cdb6","updated":"2019-09-09 19:34:06.000000000","message":"Heh, Dan said the same thing about the src_ equivalent. Fixed.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":6561,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6562,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in source_check_data and"},{"line_number":6563,"context_line":"                not can_numa_live_migrate):"},{"line_number":6564,"context_line":"            delattr(source_check_data, \u0027src_supports_numa_live_migration\u0027)"},{"line_number":6565,"context_line":"        return source_check_data"},{"line_number":6566,"context_line":""},{"line_number":6567,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_0c192584","line":6564,"updated":"2019-09-09 18:08:49.000000000","message":"This is obviously tightly coupled to what\u0027s calling this method, so maybe just leave a little comment about why we need to remove this if it\u0027s in source_check_data (because driver.check_can_live_migrate_source can set it and is called before this method).","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"ccf745a6e07ed7893e61176950c03da4ffa135e0","unresolved":false,"context_lines":[{"line_number":6561,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6562,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in source_check_data and"},{"line_number":6563,"context_line":"                not can_numa_live_migrate):"},{"line_number":6564,"context_line":"            delattr(source_check_data, \u0027src_supports_numa_live_migration\u0027)"},{"line_number":6565,"context_line":"        return source_check_data"},{"line_number":6566,"context_line":""},{"line_number":6567,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_e3561707","line":6564,"in_reply_to":"5faad753_0c192584","updated":"2019-09-09 19:34:06.000000000","message":"You\u0027re right, but I\u0027d actually rather uncouple them somewhat and have this return a boolean instead of fiddling with the object directly. I\u0027ll do the same for the dest check.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":6561,"context_line":"            self.compute_rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":6562,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in source_check_data and"},{"line_number":6563,"context_line":"                not can_numa_live_migrate):"},{"line_number":6564,"context_line":"            delattr(source_check_data, \u0027src_supports_numa_live_migration\u0027)"},{"line_number":6565,"context_line":"        return source_check_data"},{"line_number":6566,"context_line":""},{"line_number":6567,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_65bc6705","line":6564,"in_reply_to":"5faad753_e3561707","updated":"2019-09-10 02:18:03.000000000","message":"So, I tried that - it made the check_can_live_migrate_at_destination unit test so complex it wasn\u0027t worth it. I\u0027d rather add the note about the coupling.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":7360,"context_line":"                # NOTE(artom) Apply followed by drop looks weird, but apply"},{"line_number":7361,"context_line":"                # just saves the new fields while drop actually removes the"},{"line_number":7362,"context_line":"                # migration context from the instance."},{"line_number":7363,"context_line":"                instance.apply_migration_context()"},{"line_number":7364,"context_line":"                instance.drop_migration_context()"},{"line_number":7365,"context_line":"                instance.host \u003d self.host"},{"line_number":7366,"context_line":"                instance.power_state \u003d current_power_state"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_a0401537","line":7363,"range":{"start_line":7363,"start_character":25,"end_line":7363,"end_character":48},"updated":"2019-09-09 18:08:49.000000000","message":"It would probably be good to leave a comment about why we do this even if we hit some error:\n\nhttps://review.opendev.org/#/c/634606/75..80/nova/compute/manager.py@a7346","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"ccf745a6e07ed7893e61176950c03da4ffa135e0","unresolved":false,"context_lines":[{"line_number":7360,"context_line":"                # NOTE(artom) Apply followed by drop looks weird, but apply"},{"line_number":7361,"context_line":"                # just saves the new fields while drop actually removes the"},{"line_number":7362,"context_line":"                # migration context from the instance."},{"line_number":7363,"context_line":"                instance.apply_migration_context()"},{"line_number":7364,"context_line":"                instance.drop_migration_context()"},{"line_number":7365,"context_line":"                instance.host \u003d self.host"},{"line_number":7366,"context_line":"                instance.power_state \u003d current_power_state"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_40c12154","line":7363,"range":{"start_line":7363,"start_character":25,"end_line":7363,"end_character":48},"in_reply_to":"5faad753_a0401537","updated":"2019-09-09 19:34:06.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":7435,"context_line":"        # TODO(artom) drop_move_claim_at_destination() is new in RPC 5.3, only"},{"line_number":7436,"context_line":"        # call it if we performed a NUMA-aware live migration (which implies us"},{"line_number":7437,"context_line":"        # being able to send RPC 5.3). This check can be removed in RPC 6.0."},{"line_number":7438,"context_line":"        if \u0027src_supports_numa_live_migration\u0027 in migrate_data:"},{"line_number":7439,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":7440,"context_line":"                                                               instance, dest)"},{"line_number":7441,"context_line":"        instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_c0abd1d3","line":7438,"updated":"2019-09-09 18:08:49.000000000","message":"It would probably be good to explain why an \"in\" check here is sufficient rather than also checking the value is True:\n\nhttps://review.opendev.org/#/c/634606/75..80/nova/compute/manager.py@a7421\n\nOr just also check that the value is True (though redundant it would look more correct).","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"ccf745a6e07ed7893e61176950c03da4ffa135e0","unresolved":false,"context_lines":[{"line_number":7435,"context_line":"        # TODO(artom) drop_move_claim_at_destination() is new in RPC 5.3, only"},{"line_number":7436,"context_line":"        # call it if we performed a NUMA-aware live migration (which implies us"},{"line_number":7437,"context_line":"        # being able to send RPC 5.3). This check can be removed in RPC 6.0."},{"line_number":7438,"context_line":"        if \u0027src_supports_numa_live_migration\u0027 in migrate_data:"},{"line_number":7439,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":7440,"context_line":"                                                               instance, dest)"},{"line_number":7441,"context_line":"        instance.task_state \u003d None"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_03ec93c5","line":7438,"in_reply_to":"5faad753_c0abd1d3","updated":"2019-09-09 19:34:06.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6086fc2ae7abb5480beb922dacd914db7c19f38b","unresolved":false,"context_lines":[{"line_number":7365,"context_line":"                # NOTE(artom) Apply followed by drop looks weird, but apply"},{"line_number":7366,"context_line":"                # just saves the new fields while drop actually removes the"},{"line_number":7367,"context_line":"                # migration context from the instance."},{"line_number":7368,"context_line":"                instance.apply_migration_context()"},{"line_number":7369,"context_line":"                instance.drop_migration_context()"},{"line_number":7370,"context_line":"                instance.host \u003d self.host"},{"line_number":7371,"context_line":"                instance.power_state \u003d current_power_state"}],"source_content_type":"text/x-python","patch_set":82,"id":"5faad753_0ce27230","line":7368,"updated":"2019-09-10 12:50:00.000000000","message":"as noted we need to re add the instance.refersh or otherwise\nensure the instance numa toplogy is update as currently we are not saving the new instance numa toployg blob which will cause an error when the instnace is hard rebooted.","commit_id":"79d3f07e308eb59285201ddaafdce834cdaaa8cd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"338604a87351c5e3bd4906a5f7391c98efbf84c4","unresolved":false,"context_lines":[{"line_number":6502,"context_line":"                    migrate_data.src_supports_numa_live_migration):"},{"line_number":6503,"context_line":"                migrate_data \u003d self._live_migration_claim("},{"line_number":6504,"context_line":"                    ctxt, instance, migrate_data, migration, limits)"},{"line_number":6505,"context_line":"            elif \u0027dst_supports_numa_live_migration\u0027 in dest_check_data:"},{"line_number":6506,"context_line":"                LOG.info(\u0027Destination was ready for NUMA live migration, \u0027"},{"line_number":6507,"context_line":"                         \u0027but source is either too old, or is set to an \u0027"},{"line_number":6508,"context_line":"                         \u0027older upgrade level.\u0027, instance\u003dinstance)"},{"line_number":6509,"context_line":"            # Create migrate_data vifs"},{"line_number":6510,"context_line":"            migrate_data.vifs \u003d \\"},{"line_number":6511,"context_line":"                migrate_data_obj.VIFMigrateData.create_skeleton_migrate_vifs("}],"source_content_type":"text/x-python","patch_set":84,"id":"5faad753_10a269af","line":6508,"range":{"start_line":6505,"start_character":12,"end_line":6508,"end_character":67},"updated":"2019-09-11 14:19:51.000000000","message":"We don\u0027t have a unit test for this wrinkle - let\u0027s add one in a follow up unless you are going to respin.","commit_id":"bb29abff94456ebf7484e94fb685c027a75884bf"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"e31975f452d87f852d228610aed74257a156bee1","unresolved":false,"context_lines":[{"line_number":6502,"context_line":"                    migrate_data.src_supports_numa_live_migration):"},{"line_number":6503,"context_line":"                migrate_data \u003d self._live_migration_claim("},{"line_number":6504,"context_line":"                    ctxt, instance, migrate_data, migration, limits)"},{"line_number":6505,"context_line":"            elif \u0027dst_supports_numa_live_migration\u0027 in dest_check_data:"},{"line_number":6506,"context_line":"                LOG.info(\u0027Destination was ready for NUMA live migration, \u0027"},{"line_number":6507,"context_line":"                         \u0027but source is either too old, or is set to an \u0027"},{"line_number":6508,"context_line":"                         \u0027older upgrade level.\u0027, instance\u003dinstance)"},{"line_number":6509,"context_line":"            # Create migrate_data vifs"},{"line_number":6510,"context_line":"            migrate_data.vifs \u003d \\"},{"line_number":6511,"context_line":"                migrate_data_obj.VIFMigrateData.create_skeleton_migrate_vifs("}],"source_content_type":"text/x-python","patch_set":84,"id":"5faad753_a4fa3372","line":6508,"range":{"start_line":6505,"start_character":12,"end_line":6508,"end_character":67},"in_reply_to":"5faad753_10a269af","updated":"2019-09-11 16:53:45.000000000","message":"Done","commit_id":"bb29abff94456ebf7484e94fb685c027a75884bf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"338604a87351c5e3bd4906a5f7391c98efbf84c4","unresolved":false,"context_lines":[{"line_number":6541,"context_line":"            claim \u003d self.rt.live_migration_claim("},{"line_number":6542,"context_line":"                ctxt, instance, self._get_nodename(instance), migration,"},{"line_number":6543,"context_line":"                limits)"},{"line_number":6544,"context_line":"            LOG.debug(\u0027Created live migration claim.\u0027, instance\u003dinstance)"},{"line_number":6545,"context_line":"        except exception.ComputeResourcesUnavailable as e:"},{"line_number":6546,"context_line":"            raise exception.MigrationPreCheckError("},{"line_number":6547,"context_line":"                reason\u003de.format_message())"}],"source_content_type":"text/x-python","patch_set":84,"id":"5faad753_f0878d0e","line":6544,"updated":"2019-09-11 14:19:51.000000000","message":"ack from a recent passing CI job run:\n\nhttps://zuul.opendev.org/t/openstack/build/2ad3676591e440b6a76d30e966833a49/log/compute/logs/screen-n-cpu.txt.gz#3664\n\nSep 10 23:29:37.487848 ubuntu-bionic-expanded-fortnebula-regionone-0011115920 nova-compute[14195]: DEBUG nova.compute.manager [None req-973cfe50-6f37-4a8d-9bae-1f1066de08e4 tempest-LiveMigrationTest-371225596 tempest-LiveMigrationTest-371225596] [instance: a9a70b04-0914-48fc-9686-049e5bc2fc2a] Created live migration claim. {{(pid\u003d14195) _live_migration_claim /opt/stack/nova/nova/compute/manager.py:6549}}","commit_id":"bb29abff94456ebf7484e94fb685c027a75884bf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"338604a87351c5e3bd4906a5f7391c98efbf84c4","unresolved":false,"context_lines":[{"line_number":7558,"context_line":"        destination to drop the MoveClaim object that was created for the live"},{"line_number":7559,"context_line":"        migration on the destination."},{"line_number":7560,"context_line":"        \"\"\""},{"line_number":7561,"context_line":"        self.rt.drop_move_claim("},{"line_number":7562,"context_line":"            context, instance, self._get_nodename(instance),"},{"line_number":7563,"context_line":"            instance_type\u003dinstance.flavor)"},{"line_number":7564,"context_line":""}],"source_content_type":"text/x-python","patch_set":84,"id":"5faad753_d099316e","line":7561,"updated":"2019-09-11 14:19:51.000000000","message":"nit: it would probably be good to log something at debug here since we aren\u0027t doing much logging with the new code flows but this could be useful to tracing / debugging in case something goes wrong. You can add it in a follow up if you want.","commit_id":"bb29abff94456ebf7484e94fb685c027a75884bf"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"e31975f452d87f852d228610aed74257a156bee1","unresolved":false,"context_lines":[{"line_number":7558,"context_line":"        destination to drop the MoveClaim object that was created for the live"},{"line_number":7559,"context_line":"        migration on the destination."},{"line_number":7560,"context_line":"        \"\"\""},{"line_number":7561,"context_line":"        self.rt.drop_move_claim("},{"line_number":7562,"context_line":"            context, instance, self._get_nodename(instance),"},{"line_number":7563,"context_line":"            instance_type\u003dinstance.flavor)"},{"line_number":7564,"context_line":""}],"source_content_type":"text/x-python","patch_set":84,"id":"5faad753_3fedee24","line":7561,"in_reply_to":"5faad753_13a273af","updated":"2019-09-11 16:53:45.000000000","message":"Done","commit_id":"bb29abff94456ebf7484e94fb685c027a75884bf"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"e31975f452d87f852d228610aed74257a156bee1","unresolved":false,"context_lines":[{"line_number":7558,"context_line":"        destination to drop the MoveClaim object that was created for the live"},{"line_number":7559,"context_line":"        migration on the destination."},{"line_number":7560,"context_line":"        \"\"\""},{"line_number":7561,"context_line":"        self.rt.drop_move_claim("},{"line_number":7562,"context_line":"            context, instance, self._get_nodename(instance),"},{"line_number":7563,"context_line":"            instance_type\u003dinstance.flavor)"},{"line_number":7564,"context_line":""}],"source_content_type":"text/x-python","patch_set":84,"id":"5faad753_c4096f31","line":7561,"in_reply_to":"5faad753_7044fdb7","updated":"2019-09-11 16:53:45.000000000","message":"Done","commit_id":"bb29abff94456ebf7484e94fb685c027a75884bf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3104f275bb3e4bf14d4a718374222cb062c569ce","unresolved":false,"context_lines":[{"line_number":7558,"context_line":"        destination to drop the MoveClaim object that was created for the live"},{"line_number":7559,"context_line":"        migration on the destination."},{"line_number":7560,"context_line":"        \"\"\""},{"line_number":7561,"context_line":"        self.rt.drop_move_claim("},{"line_number":7562,"context_line":"            context, instance, self._get_nodename(instance),"},{"line_number":7563,"context_line":"            instance_type\u003dinstance.flavor)"},{"line_number":7564,"context_line":""}],"source_content_type":"text/x-python","patch_set":84,"id":"5faad753_13a273af","line":7561,"in_reply_to":"5faad753_7044fdb7","updated":"2019-09-11 14:59:16.000000000","message":"Yes agreed, and also probably worth logging that we\u0027re doing it from the source (L7462 above) just to make it easier to correlate that both sides are participating. If you\u0027re debugging a bunch of moves and there are lots of drops in one log, being able to line them up with when/which source is calling I think it would be helpful.","commit_id":"bb29abff94456ebf7484e94fb685c027a75884bf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"304f49dbb9a7ba7395f7eec2b8a1e25cb0df35fc","unresolved":false,"context_lines":[{"line_number":7558,"context_line":"        destination to drop the MoveClaim object that was created for the live"},{"line_number":7559,"context_line":"        migration on the destination."},{"line_number":7560,"context_line":"        \"\"\""},{"line_number":7561,"context_line":"        self.rt.drop_move_claim("},{"line_number":7562,"context_line":"            context, instance, self._get_nodename(instance),"},{"line_number":7563,"context_line":"            instance_type\u003dinstance.flavor)"},{"line_number":7564,"context_line":""}],"source_content_type":"text/x-python","patch_set":84,"id":"5faad753_7044fdb7","line":7561,"in_reply_to":"5faad753_d099316e","updated":"2019-09-11 14:21:54.000000000","message":"I would do something like this:\n\nnodename \u003d self._get_nodename(instance)\nLOG.debug(\"Dropping live migration resource claim on \"\n          \"destination node \u0027%s\u0027\", nodename,\n          instance\u003dinstance)","commit_id":"bb29abff94456ebf7484e94fb685c027a75884bf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"170c421642c61c37c9e382d4ef4b84b82342183b","unresolved":false,"context_lines":[{"line_number":7459,"context_line":"        # This check can be removed in RPC 6.0."},{"line_number":7460,"context_line":"        if (\u0027src_supports_numa_live_migration\u0027 in migrate_data and"},{"line_number":7461,"context_line":"                migrate_data.src_supports_numa_live_migration):"},{"line_number":7462,"context_line":"            LOG.debug(\u0027Calling destination to drop move claim.\u0027,"},{"line_number":7463,"context_line":"                      instance\u003dinstance)"},{"line_number":7464,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":7465,"context_line":"                                                               instance, dest)"}],"source_content_type":"text/x-python","patch_set":85,"id":"5faad753_bff55e85","line":7462,"range":{"start_line":7462,"start_character":31,"end_line":7462,"end_character":42},"updated":"2019-09-11 17:05:28.000000000","message":"nit: would have been nice to include the actual dest variable for the hostname in this message.","commit_id":"50eede9a012a1c63cfefe7f3e8f0d75774d3d551"}],"nova/compute/resource_tracker.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8512844cbc35bea0937ad7015927afec4bf45b49","unresolved":false,"context_lines":[{"line_number":255,"context_line":"    def live_migration_claim(self, context, instance, migration):"},{"line_number":256,"context_line":"        # Flavor and image cannot change during a live migration."},{"line_number":257,"context_line":"        instance_type \u003d instance.flavor"},{"line_number":258,"context_line":"        image_meta \u003d objects.ImageMeta.from_instance(instance)"},{"line_number":259,"context_line":"        # Live migration is not supported for Ironic nodes."},{"line_number":260,"context_line":"        nodename \u003d None"},{"line_number":261,"context_line":"        return self._move_claim(context, instance, instance_type, nodename,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_3287ce12","line":258,"range":{"start_line":258,"start_character":22,"end_line":258,"end_character":62},"updated":"2019-02-04 13:20:43.000000000","message":"just do instance.image_meta\n\nhttps://github.com/openstack/nova/blob/ac1fafb84c94ed9f8e610c7c3e152e38aef844ed/nova/objects/instance.py#L239","commit_id":"7349f8190117d7bc408bde009caf287c222e4ba4"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"aab3c67872329fa2ff74de3eb67589a1b19cd2de","unresolved":false,"context_lines":[{"line_number":255,"context_line":"    def live_migration_claim(self, context, instance, migration):"},{"line_number":256,"context_line":"        # Flavor and image cannot change during a live migration."},{"line_number":257,"context_line":"        instance_type \u003d instance.flavor"},{"line_number":258,"context_line":"        image_meta \u003d objects.ImageMeta.from_instance(instance)"},{"line_number":259,"context_line":"        # Live migration is not supported for Ironic nodes."},{"line_number":260,"context_line":"        nodename \u003d None"},{"line_number":261,"context_line":"        return self._move_claim(context, instance, instance_type, nodename,"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_8e2e8ef8","line":258,"range":{"start_line":258,"start_character":22,"end_line":258,"end_character":62},"in_reply_to":"9fdfeff1_3287ce12","updated":"2019-02-04 20:14:08.000000000","message":"Done","commit_id":"7349f8190117d7bc408bde009caf287c222e4ba4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"00517b5f4e2aaaf45f2c6e853594c9dc74634f29","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        and CPUs"},{"line_number":283,"context_line":"        :param migration: A migration object if one was already created"},{"line_number":284,"context_line":"                          elsewhere for this operation (otherwise None)"},{"line_number":285,"context_line":"        :param pagesize: if the instance has hugepages, its actual page size."},{"line_number":286,"context_line":"                         If the hw:mem_page_size flavor extra spec is `large`,"},{"line_number":287,"context_line":"                         the instance could move from a host with 1G pages to a"},{"line_number":288,"context_line":"                         host with 2M pages, for example. When an instance is"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_b2962894","line":285,"range":{"start_line":285,"start_character":56,"end_line":285,"end_character":76},"updated":"2019-02-06 21:05:37.000000000","message":"this read a little weird.\nmaybe \n\"if the instance has hugepages, pass its actual page size.\"\nor \n\"if the instance has hugepages, use its actual page size.\"","commit_id":"e1af322246077ff6f825e52bd4db6d6e36dcc89a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2dd102cde21f5de1b1203a15eb8017a8f92b9d79","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        and CPUs"},{"line_number":283,"context_line":"        :param migration: A migration object if one was already created"},{"line_number":284,"context_line":"                          elsewhere for this operation (otherwise None)"},{"line_number":285,"context_line":"        :param pagesize: if the instance has hugepages, its actual page size."},{"line_number":286,"context_line":"                         If the hw:mem_page_size flavor extra spec is `large`,"},{"line_number":287,"context_line":"                         the instance could move from a host with 1G pages to a"},{"line_number":288,"context_line":"                         host with 2M pages, for example. When an instance is"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_9adbf67b","line":285,"range":{"start_line":285,"start_character":56,"end_line":285,"end_character":76},"in_reply_to":"9fdfeff1_b2962894","updated":"2019-02-07 00:56:46.000000000","message":"Yeah, it was meant to be declarative, like the previous :params: I\u0027ll rephrase.","commit_id":"e1af322246077ff6f825e52bd4db6d6e36dcc89a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"00517b5f4e2aaaf45f2c6e853594c9dc74634f29","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        :param migration: A migration object if one was already created"},{"line_number":284,"context_line":"                          elsewhere for this operation (otherwise None)"},{"line_number":285,"context_line":"        :param pagesize: if the instance has hugepages, its actual page size."},{"line_number":286,"context_line":"                         If the hw:mem_page_size flavor extra spec is `large`,"},{"line_number":287,"context_line":"                         the instance could move from a host with 1G pages to a"},{"line_number":288,"context_line":"                         host with 2M pages, for example. When an instance is"},{"line_number":289,"context_line":"                         running, changing its pagesize is only supported on"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_52ed7c23","line":286,"range":{"start_line":286,"start_character":70,"end_line":286,"end_character":77},"updated":"2019-02-06 21:05:37.000000000","message":"`large` or `any`,","commit_id":"e1af322246077ff6f825e52bd4db6d6e36dcc89a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2dd102cde21f5de1b1203a15eb8017a8f92b9d79","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        :param migration: A migration object if one was already created"},{"line_number":284,"context_line":"                          elsewhere for this operation (otherwise None)"},{"line_number":285,"context_line":"        :param pagesize: if the instance has hugepages, its actual page size."},{"line_number":286,"context_line":"                         If the hw:mem_page_size flavor extra spec is `large`,"},{"line_number":287,"context_line":"                         the instance could move from a host with 1G pages to a"},{"line_number":288,"context_line":"                         host with 2M pages, for example. When an instance is"},{"line_number":289,"context_line":"                         running, changing its pagesize is only supported on"}],"source_content_type":"text/x-python","patch_set":9,"id":"9fdfeff1_daf17e03","line":286,"range":{"start_line":286,"start_character":70,"end_line":286,"end_character":77},"in_reply_to":"9fdfeff1_52ed7c23","updated":"2019-02-07 00:56:46.000000000","message":"Done","commit_id":"e1af322246077ff6f825e52bd4db6d6e36dcc89a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e590e7b9ba28c132ddf11be77c7d00a0aafbafc5","unresolved":false,"context_lines":[{"line_number":1214,"context_line":"                LOG.debug(\u0027Migration instance not found: %s\u0027, e)"},{"line_number":1215,"context_line":"                continue"},{"line_number":1216,"context_line":""},{"line_number":1217,"context_line":"            # Only consider instances that are in a resize state or are live"},{"line_number":1218,"context_line":"            # migrating."},{"line_number":1219,"context_line":"            if (not _instance_in_resize_state(instances[uuid]) and not"},{"line_number":1220,"context_line":"                    _instance_is_live_migrating(instances[uuid])):"},{"line_number":1221,"context_line":"                LOG.debug(\u0027Not considering %s as instance is neither \u0027"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_55e72fe4","line":1218,"range":{"start_line":1217,"start_character":12,"end_line":1218,"end_character":24},"updated":"2019-08-16 18:31:47.000000000","message":"I don\u0027t think this logic lines up with your code....right? \"or\" here and \"and not\" in the code.","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":1214,"context_line":"                LOG.debug(\u0027Migration instance not found: %s\u0027, e)"},{"line_number":1215,"context_line":"                continue"},{"line_number":1216,"context_line":""},{"line_number":1217,"context_line":"            # Only consider instances that are in a resize state or are live"},{"line_number":1218,"context_line":"            # migrating."},{"line_number":1219,"context_line":"            if (not _instance_in_resize_state(instances[uuid]) and not"},{"line_number":1220,"context_line":"                    _instance_is_live_migrating(instances[uuid])):"},{"line_number":1221,"context_line":"                LOG.debug(\u0027Not considering %s as instance is neither \u0027"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_9eab111d","line":1218,"range":{"start_line":1217,"start_character":12,"end_line":1218,"end_character":24},"in_reply_to":"7faddb67_55e72fe4","updated":"2019-08-23 21:26:51.000000000","message":"The inverse of \"consider if x or y\" is \"don\u0027t consider if neither x nor x\", I\u0027ll edit the comment","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"33c558c9af0058974f5d2320f20c11f8c45ae660","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        migration.dest_compute \u003d self.host"},{"line_number":388,"context_line":"        migration.dest_node \u003d nodename"},{"line_number":389,"context_line":"        migration.dest_host \u003d self.driver.get_host_ip_addr()"},{"line_number":390,"context_line":"        # NOTE(artom) Live-migrations don\u0027t have the pre-migrating state."},{"line_number":391,"context_line":"        if migration.migration_type !\u003d \u0027live-migration\u0027:"},{"line_number":392,"context_line":"            migration.status \u003d \u0027pre-migrating\u0027"},{"line_number":393,"context_line":"        migration.save()"}],"source_content_type":"text/x-python","patch_set":51,"id":"7faddb67_40ca9946","line":390,"updated":"2019-08-23 16:03:31.000000000","message":"This goes back with the patch where you added the actual code below.","commit_id":"091eb3d68b454730ee315b3ccc2c9316fcfab1ee"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":387,"context_line":"        migration.dest_compute \u003d self.host"},{"line_number":388,"context_line":"        migration.dest_node \u003d nodename"},{"line_number":389,"context_line":"        migration.dest_host \u003d self.driver.get_host_ip_addr()"},{"line_number":390,"context_line":"        # NOTE(artom) Live-migrations don\u0027t have the pre-migrating state."},{"line_number":391,"context_line":"        if migration.migration_type !\u003d \u0027live-migration\u0027:"},{"line_number":392,"context_line":"            migration.status \u003d \u0027pre-migrating\u0027"},{"line_number":393,"context_line":"        migration.save()"}],"source_content_type":"text/x-python","patch_set":51,"id":"7faddb67_93bf8afb","line":390,"in_reply_to":"7faddb67_40ca9946","updated":"2019-08-23 21:26:51.000000000","message":"Done","commit_id":"091eb3d68b454730ee315b3ccc2c9316fcfab1ee"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"33c558c9af0058974f5d2320f20c11f8c45ae660","unresolved":false,"context_lines":[{"line_number":1223,"context_line":"            if (not _instance_in_resize_state(instances[uuid]) and not"},{"line_number":1224,"context_line":"                    _instance_is_live_migrating(instances[uuid])):"},{"line_number":1225,"context_line":"                LOG.debug(\u0027Not considering %s as instance is neither \u0027"},{"line_number":1226,"context_line":"                          \u0027resizing not live-migrating.\u0027, migration,"},{"line_number":1227,"context_line":"                          instance_uuid\u003duuid)"},{"line_number":1228,"context_line":"                continue"},{"line_number":1229,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"7faddb67_c0076981","line":1226,"range":{"start_line":1226,"start_character":36,"end_line":1226,"end_character":39},"updated":"2019-08-23 16:03:31.000000000","message":"nor?","commit_id":"091eb3d68b454730ee315b3ccc2c9316fcfab1ee"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":1223,"context_line":"            if (not _instance_in_resize_state(instances[uuid]) and not"},{"line_number":1224,"context_line":"                    _instance_is_live_migrating(instances[uuid])):"},{"line_number":1225,"context_line":"                LOG.debug(\u0027Not considering %s as instance is neither \u0027"},{"line_number":1226,"context_line":"                          \u0027resizing not live-migrating.\u0027, migration,"},{"line_number":1227,"context_line":"                          instance_uuid\u003duuid)"},{"line_number":1228,"context_line":"                continue"},{"line_number":1229,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"7faddb67_53b91213","line":1226,"range":{"start_line":1226,"start_character":36,"end_line":1226,"end_character":39},"in_reply_to":"7faddb67_c0076981","updated":"2019-08-23 21:26:51.000000000","message":"Done","commit_id":"091eb3d68b454730ee315b3ccc2c9316fcfab1ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":1240,"context_line":""},{"line_number":1241,"context_line":"            # skip migration if instance isn\u0027t in a resize state:"},{"line_number":1242,"context_line":"            if not _instance_in_resize_state(instances[uuid]):"},{"line_number":1243,"context_line":"                LOG.warning(\"Instance not resizing, skipping migration.\","},{"line_number":1244,"context_line":"                            instance_uuid\u003duuid)"},{"line_number":1245,"context_line":"                continue"},{"line_number":1246,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_8eb6b488","side":"PARENT","line":1243,"updated":"2019-09-05 20:57:42.000000000","message":"Kind of wish we could land https://review.opendev.org/#/c/560467/ first so we could quit with the annoying warning logs during live migration runs.","commit_id":"022e9b97cbba6f8cc28806ebfabbf5b9953cfdc0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":1240,"context_line":"            if (not _instance_in_resize_state(instances[uuid]) and not"},{"line_number":1241,"context_line":"                    _instance_is_live_migrating(instances[uuid])):"},{"line_number":1242,"context_line":"                LOG.debug(\u0027Not considering %s as instance is neither \u0027"},{"line_number":1243,"context_line":"                          \u0027resizing nor live-migrating.\u0027, migration,"},{"line_number":1244,"context_line":"                          instance_uuid\u003duuid)"},{"line_number":1245,"context_line":"                continue"},{"line_number":1246,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_aeeff084","line":1243,"range":{"start_line":1243,"start_character":58,"end_line":1243,"end_character":67},"updated":"2019-09-05 20:57:42.000000000","message":"Did you mean to log this whole object?\n\nhttps://zuul.opendev.org/t/openstack/build/d51f91efa937411a9179b930eff3ab08/log/controller/logs/screen-n-cpu.txt.gz#3419\n\nSep 04 15:39:10.888383 ubuntu-bionic-expanded-fortnebula-regionone-0010749569 nova-compute[26046]: DEBUG nova.compute.resource_tracker [None req-7cd3428e-dbbc-4726-97d4-42c876195330 None None] [instance: 350b9bec-e7fe-4d44-87bb-e2b05e47e6b4] Not considering Migration(created_at\u003d2019-09-04T15:38:54Z,cross_cell_move\u003dFalse,deleted\u003dFalse,deleted_at\u003dNone,dest_compute\u003d\u0027ubuntu-bionic-expanded-fortnebula-regionone-0010749580\u0027,dest_host\u003d\u0027192.168.48.148\u0027,dest_node\u003d\u0027ubuntu-bionic-expanded-fortnebula-regionone-0010749580\u0027,disk_processed\u003d0,disk_remaining\u003d0,disk_total\u003d0,hidden\u003dFalse,id\u003d5,instance_uuid\u003d\u0027350b9bec-e7fe-4d44-87bb-e2b05e47e6b4\u0027,memory_processed\u003d0,memory_remaining\u003d0,memory_total\u003d0,migration_type\u003d\u0027live-migration\u0027,new_instance_type_id\u003d11,old_instance_type_id\u003d11,source_compute\u003d\u0027ubuntu-bionic-expanded-fortnebula-regionone-0010749569\u0027,source_node\u003d\u0027ubuntu-bionic-expanded-fortnebula-regionone-0010749569\u0027,status\u003d\u0027running\u0027,updated_at\u003d2019-09-04T15:39:03Z,uuid\u003d716c4d80-3b9c-4be8-b395-ad43afea3e5c) as instance is neither resizing nor live-migrating. {{(pid\u003d26046) _update_usage_from_migrations /opt/stack/nova/nova/compute/resource_tracker.py:1244}}","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":1240,"context_line":"            if (not _instance_in_resize_state(instances[uuid]) and not"},{"line_number":1241,"context_line":"                    _instance_is_live_migrating(instances[uuid])):"},{"line_number":1242,"context_line":"                LOG.debug(\u0027Not considering %s as instance is neither \u0027"},{"line_number":1243,"context_line":"                          \u0027resizing nor live-migrating.\u0027, migration,"},{"line_number":1244,"context_line":"                          instance_uuid\u003duuid)"},{"line_number":1245,"context_line":"                continue"},{"line_number":1246,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_fc181f76","line":1243,"range":{"start_line":1243,"start_character":58,"end_line":1243,"end_character":67},"in_reply_to":"7faddb67_aeeff084","updated":"2019-09-06 16:44:40.000000000","message":"Yeah, can be removed.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"338604a87351c5e3bd4906a5f7391c98efbf84c4","unresolved":false,"context_lines":[{"line_number":1239,"context_line":"            # live-migrating."},{"line_number":1240,"context_line":"            if (not _instance_in_resize_state(instances[uuid]) and not"},{"line_number":1241,"context_line":"                    _instance_is_live_migrating(instances[uuid])):"},{"line_number":1242,"context_line":"                LOG.debug(\u0027Skipping migration as instance is neither \u0027"},{"line_number":1243,"context_line":"                          \u0027resizing nor live-migrating.\u0027, instance_uuid\u003duuid)"},{"line_number":1244,"context_line":"                continue"},{"line_number":1245,"context_line":""}],"source_content_type":"text/x-python","patch_set":84,"id":"5faad753_30e1a5d1","line":1242,"updated":"2019-09-11 14:19:51.000000000","message":"ack from CI job run:\n\nhttps://zuul.opendev.org/t/openstack/build/2ad3676591e440b6a76d30e966833a49/log/compute/logs/screen-n-cpu.txt.gz#3907\n\nSep 10 23:30:04.408563 ubuntu-bionic-expanded-fortnebula-regionone-0011115920 nova-compute[14195]: DEBUG nova.compute.resource_tracker [None req-cef2a719-52a9-4850-b10d-2a00991637b2 None None] [instance: 8a5ad4f0-8ba3-475c-8a73-2253ea315cbf] Skipping migration as instance is neither resizing nor live-migrating. {{(pid\u003d14195) _update_usage_from_migrations /opt/stack/nova/nova/compute/resource_tracker.py:1243}}","commit_id":"bb29abff94456ebf7484e94fb685c027a75884bf"}],"nova/compute/rpcapi.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a9398aff3dc934fd6dceda45387497bd15322b4c","unresolved":false,"context_lines":[{"line_number":549,"context_line":"        cctxt.cast(ctxt, \u0027change_instance_metadata\u0027,"},{"line_number":550,"context_line":"                   instance\u003dinstance, diff\u003ddiff)"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    def supports_numa_live_migration(self, ctxt):"},{"line_number":553,"context_line":"        client \u003d self.router.client(ctxt)"},{"line_number":554,"context_line":"        return client.can_send_version(\u00275.3\u0027)"},{"line_number":555,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_a34bbb5c","line":552,"updated":"2019-09-03 21:13:00.000000000","message":"nit: would probably be better to define this next to drop_move_claim_at_destination since that\u0027s how it\u0027s used right?","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"51431a406b88d43efb87152c3abff60010a62e42","unresolved":false,"context_lines":[{"line_number":549,"context_line":"        cctxt.cast(ctxt, \u0027change_instance_metadata\u0027,"},{"line_number":550,"context_line":"                   instance\u003dinstance, diff\u003ddiff)"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    def supports_numa_live_migration(self, ctxt):"},{"line_number":553,"context_line":"        client \u003d self.router.client(ctxt)"},{"line_number":554,"context_line":"        return client.can_send_version(\u00275.3\u0027)"},{"line_number":555,"context_line":""}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_9e605837","line":552,"in_reply_to":"7faddb67_a34bbb5c","updated":"2019-09-04 00:25:46.000000000","message":"Sure.","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":370,"context_line":"        * 5.3 - Add migration and limits parameters to"},{"line_number":371,"context_line":"                check_can_live_migrate_destination(), new"},{"line_number":372,"context_line":"                drop_move_claim_at_destination() method, and"},{"line_number":373,"context_line":"                numa_live_migration parameter to"},{"line_number":374,"context_line":"                check_can_live_migrate_source()"},{"line_number":375,"context_line":"    \u0027\u0027\u0027"},{"line_number":376,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_4eac3c34","line":373,"range":{"start_line":373,"start_character":16,"end_line":373,"end_character":35},"updated":"2019-09-05 20:57:42.000000000","message":"\"add numa_live_migration parameter too...\"","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":370,"context_line":"        * 5.3 - Add migration and limits parameters to"},{"line_number":371,"context_line":"                check_can_live_migrate_destination(), new"},{"line_number":372,"context_line":"                drop_move_claim_at_destination() method, and"},{"line_number":373,"context_line":"                numa_live_migration parameter to"},{"line_number":374,"context_line":"                check_can_live_migrate_source()"},{"line_number":375,"context_line":"    \u0027\u0027\u0027"},{"line_number":376,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_9c4c8b77","line":373,"range":{"start_line":373,"start_character":16,"end_line":373,"end_character":35},"in_reply_to":"7faddb67_4eac3c34","updated":"2019-09-06 16:44:40.000000000","message":"Moot, code is gone.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":982,"context_line":"                   instance\u003dinstance, destroy_disks\u003ddestroy_disks,"},{"line_number":983,"context_line":"                   migrate_data\u003dmigrate_data)"},{"line_number":984,"context_line":""},{"line_number":985,"context_line":"    def supports_numa_live_migration(self, ctxt):"},{"line_number":986,"context_line":"        client \u003d self.router.client(ctxt)"},{"line_number":987,"context_line":"        return client.can_send_version(\u00275.3\u0027)"},{"line_number":988,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_8e6b14ee","line":985,"updated":"2019-09-05 20:57:42.000000000","message":"nit: docstring would be nice","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":982,"context_line":"                   instance\u003dinstance, destroy_disks\u003ddestroy_disks,"},{"line_number":983,"context_line":"                   migrate_data\u003dmigrate_data)"},{"line_number":984,"context_line":""},{"line_number":985,"context_line":"    def supports_numa_live_migration(self, ctxt):"},{"line_number":986,"context_line":"        client \u003d self.router.client(ctxt)"},{"line_number":987,"context_line":"        return client.can_send_version(\u00275.3\u0027)"},{"line_number":988,"context_line":""}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_3c3d57bb","line":985,"in_reply_to":"7faddb67_8e6b14ee","updated":"2019-09-06 16:44:40.000000000","message":"Done","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"}],"nova/conductor/tasks/live_migrate.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"216082d088974c9673bbc43ce7a7fc63f8e3e63e","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        self.migration.source_node \u003d self.instance.node"},{"line_number":120,"context_line":"        self.migration.dest_node \u003d dest_node"},{"line_number":121,"context_line":"        self.migration.dest_compute \u003d self.destination"},{"line_number":122,"context_line":"        self.migration.save()"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # TODO(johngarbutt) need to move complexity out of compute manager"},{"line_number":125,"context_line":"        # TODO(johngarbutt) disk_over_commit?"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_92747a00","side":"PARENT","line":122,"range":{"start_line":122,"start_character":7,"end_line":122,"end_character":29},"updated":"2019-02-04 13:38:40.000000000","message":"do we still need to call save? aftert setting the source node. on line 82 in the new versiosn.","commit_id":"e589dfa663186755d2ceb62ed6e5bf770197c5e3"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"aab3c67872329fa2ff74de3eb67589a1b19cd2de","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        self.migration.source_node \u003d self.instance.node"},{"line_number":120,"context_line":"        self.migration.dest_node \u003d dest_node"},{"line_number":121,"context_line":"        self.migration.dest_compute \u003d self.destination"},{"line_number":122,"context_line":"        self.migration.save()"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # TODO(johngarbutt) need to move complexity out of compute manager"},{"line_number":125,"context_line":"        # TODO(johngarbutt) disk_over_commit?"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fdfeff1_6e77aa0a","side":"PARENT","line":122,"range":{"start_line":122,"start_character":7,"end_line":122,"end_character":29},"in_reply_to":"9fdfeff1_92747a00","updated":"2019-02-04 20:14:08.000000000","message":"I think we\u0027re good? Because we call _claim_existing_migration() at [1] and then inside that we migration.save() [2]\n\n[1] https://github.com/openstack/nova/blob/ac1fafb84c94ed9f8e610c7c3e152e38aef844ed/nova/compute/resource_tracker.py#L278\n[2] https://github.com/openstack/nova/blob/ac1fafb84c94ed9f8e610c7c3e152e38aef844ed/nova/compute/resource_tracker.py#L393","commit_id":"e589dfa663186755d2ceb62ed6e5bf770197c5e3"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"aed53b2f7b9ada500894b1b1c63c05510f225699","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            # node name off it to set in the Migration object below."},{"line_number":119,"context_line":"            dest_node \u003d dest_node.hypervisor_hostname"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self.migration.source_node \u003d self.instance.node"},{"line_number":122,"context_line":"        self.migration.dest_node \u003d dest_node"},{"line_number":123,"context_line":"        self.migration.dest_compute \u003d self.destination"},{"line_number":124,"context_line":"        self.migration.save()"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        # TODO(johngarbutt) need to move complexity out of compute manager"},{"line_number":127,"context_line":"        # TODO(johngarbutt) disk_over_commit?"}],"source_content_type":"text/x-python","patch_set":23,"id":"9fdfeff1_f97d90b2","side":"PARENT","line":124,"range":{"start_line":121,"start_character":0,"end_line":124,"end_character":29},"updated":"2019-02-19 17:22:59.000000000","message":"How are we able to remove this? Was it useless or is it being done elsewhere now? I can\u0027t spot the latter","commit_id":"193bfbe26156368c2b101781bd742eb9d2ba826f"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d2874f4cbe04be5960598f547d87ff3b06d283aa","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            # node name off it to set in the Migration object below."},{"line_number":119,"context_line":"            dest_node \u003d dest_node.hypervisor_hostname"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self.migration.source_node \u003d self.instance.node"},{"line_number":122,"context_line":"        self.migration.dest_node \u003d dest_node"},{"line_number":123,"context_line":"        self.migration.dest_compute \u003d self.destination"},{"line_number":124,"context_line":"        self.migration.save()"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        # TODO(johngarbutt) need to move complexity out of compute manager"},{"line_number":127,"context_line":"        # TODO(johngarbutt) disk_over_commit?"}],"source_content_type":"text/x-python","patch_set":23,"id":"9fdfeff1_551b0f1b","side":"PARENT","line":124,"range":{"start_line":121,"start_character":0,"end_line":124,"end_character":29},"in_reply_to":"9fdfeff1_f97d90b2","updated":"2019-02-21 16:39:10.000000000","message":"So it goes live_migration_claim() -\u003e _move_claim() -\u003e _claim_existing_migration() and inside it does:\n\n  migration.dest_compute \u003d self.host\n  migration.dest_node \u003d nodename                                                                   \n  migration.dest_host \u003d self.driver.get_host_ip_addr()\n  if migration.migration_type !\u003d \u0027live-migration\u0027:\n    migration.status \u003d \u0027pre-migrating\u0027\n  migration.save()\n\nI\u0027ll add a comment.","commit_id":"193bfbe26156368c2b101781bd742eb9d2ba826f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"858e3060b8018fe30028b411ebddfed187684e11","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            dest_node \u003d dest_node.hypervisor_hostname"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self.migration.source_node \u003d self.instance.node"},{"line_number":122,"context_line":"        self.migration.dest_node \u003d dest_node"},{"line_number":123,"context_line":"        self.migration.dest_compute \u003d self.destination"},{"line_number":124,"context_line":"        self.migration.save()"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        # TODO(johngarbutt) need to move complexity out of compute manager"},{"line_number":127,"context_line":"        # TODO(johngarbutt) disk_over_commit?"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_14623fd9","side":"PARENT","line":124,"range":{"start_line":122,"start_character":8,"end_line":124,"end_character":29},"updated":"2019-02-24 23:12:16.000000000","message":"You would still need this for any non-libvirt, non-numa live migrations.","commit_id":"e5fb8cd768685a468400d6db85825a5128a02204"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            dest_node \u003d dest_node.hypervisor_hostname"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        self.migration.source_node \u003d self.instance.node"},{"line_number":122,"context_line":"        self.migration.dest_node \u003d dest_node"},{"line_number":123,"context_line":"        self.migration.dest_compute \u003d self.destination"},{"line_number":124,"context_line":"        self.migration.save()"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        # TODO(johngarbutt) need to move complexity out of compute manager"},{"line_number":127,"context_line":"        # TODO(johngarbutt) disk_over_commit?"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_72438940","side":"PARENT","line":124,"range":{"start_line":122,"start_character":8,"end_line":124,"end_character":29},"in_reply_to":"9fdfeff1_14623fd9","updated":"2019-02-25 20:06:55.000000000","message":"Assuming we\u0027re claiming for all live migrations, then no. But the only reason for moving this was to save an extra DB query, so it could be OK to leave as is.","commit_id":"e5fb8cd768685a468400d6db85825a5128a02204"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"858e3060b8018fe30028b411ebddfed187684e11","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                                                      self.instance,"},{"line_number":80,"context_line":"                                                      self.migration))"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        # NOTE(artom) Set the source now. The destination nodename and host"},{"line_number":83,"context_line":"        # will be set when we call check_can_live_migrate_destination(): it\u0027ll"},{"line_number":84,"context_line":"        # create a MoveClaim, which will call _claim_existing_migration() in"},{"line_number":85,"context_line":"        # the resource tracker, which will set the destination nodename and"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_74638bde","line":82,"updated":"2019-02-24 23:12:16.000000000","message":"First, why does this need to change here? And second, this is only true for a narrow set of live migrations (numa + libvirt).","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                                                      self.instance,"},{"line_number":80,"context_line":"                                                      self.migration))"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        # NOTE(artom) Set the source now. The destination nodename and host"},{"line_number":83,"context_line":"        # will be set when we call check_can_live_migrate_destination(): it\u0027ll"},{"line_number":84,"context_line":"        # create a MoveClaim, which will call _claim_existing_migration() in"},{"line_number":85,"context_line":"        # the resource tracker, which will set the destination nodename and"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_d204b516","line":82,"in_reply_to":"9fdfeff1_74638bde","updated":"2019-02-25 20:06:55.000000000","message":"\u003e First, why does this need to change here?\n\nUhh, good question. I was sure we needed migration.source in the claims somewhere, but now I can\u0027t find it :( Maybe I just wanted to save a \"useless\" DB save? Ie, if we claimed, the claim will have called migration.save(), and then we\u0027d call it again needlessly on L120.\n\n \u003e And second, this is only\n \u003e true for a narrow set of live migrations (numa + libvirt).\n\nAs I said in https://review.openstack.org/#/c/634606/29/nova/compute/manager.py@6116, all live migrations are going to have claims, to me it makes no sense to treat NUMA vs non-NUMA differently from that perspective.\n\nBut yeah, I don\u0027t remember what my logic here was. I don\u0027t see any issues in keeping this as it was (except the extra DB call I mentioned above).","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eec3cecc16d554a453f8ab61a64a2be1a49613a8","unresolved":false,"context_lines":[{"line_number":174,"context_line":"               \u0027live migration. See bug #1289064 for more information.\u0027"},{"line_number":175,"context_line":"               )"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        if CONF.workarounds.enable_numa_live_migration:"},{"line_number":178,"context_line":"            LOG.warning(msg, instance\u003dself.instance)"},{"line_number":179,"context_line":"        else:"},{"line_number":180,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":36,"id":"9fdfeff1_4a00ce01","line":177,"updated":"2019-02-28 02:21:46.000000000","message":"So uh, isn\u0027t this bogus now if the source/dest computes are actually new enough to support numa live migration and have passed the other checks? This is what I was trying to talk about in the now-abandoned revert patch in this series. If one of the computes was old and this was True then you can go with the warning and proceed as before, but if this is False and both computes (source and dest) are new enough to support numa live migration we shouldn\u0027t be raising the exception.\n\nThe problem is by the time this method is called you don\u0027t even know if the source/dest are new enough to support it - which is why you need a compute service version check in conductor, at least until Train.","commit_id":"bbb92df744016c023b3456aa6c2324726abc1bdd"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"28d4b5933026454bc4f6375161f15c2b9a52697d","unresolved":false,"context_lines":[{"line_number":174,"context_line":"               \u0027live migration. See bug #1289064 for more information.\u0027"},{"line_number":175,"context_line":"               )"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        if CONF.workarounds.enable_numa_live_migration:"},{"line_number":178,"context_line":"            LOG.warning(msg, instance\u003dself.instance)"},{"line_number":179,"context_line":"        else:"},{"line_number":180,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":36,"id":"9fdfeff1_5e7e4719","line":177,"in_reply_to":"9fdfeff1_4a00ce01","updated":"2019-02-28 11:27:04.000000000","message":"\u003e So uh, isn\u0027t this bogus now if the source/dest computes are\n \u003e actually new enough to support numa live migration and have passed\n \u003e the other checks? This is what I was trying to talk about in the\n \u003e now-abandoned revert patch in this series. If one of the computes\n \u003e was old and this was True then you can go with the warning and\n \u003e proceed as before, but if this is False and both computes (source\n \u003e and dest) are new enough to support numa live migration we\n \u003e shouldn\u0027t be raising the exception.\n\nJust the computes being new enough isn\u0027t enough, because if the deployment is RPC-pinned it can\u0027t work either (check_can_live_migrate_destination won\u0027t get the new migration and limits arguments).\n\nI\u0027ll add a patch on top (to keep patch size manageable) that bumps service version and modifies Stephen\u0027s workaround to only apply to \u003c full Stein deployments.","commit_id":"bbb92df744016c023b3456aa6c2324726abc1bdd"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"8afb11f90a88fefc500de975286dce8e704afee9","unresolved":false,"context_lines":[{"line_number":174,"context_line":"               \u0027live migration. See bug #1289064 for more information.\u0027"},{"line_number":175,"context_line":"               )"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        if CONF.workarounds.enable_numa_live_migration:"},{"line_number":178,"context_line":"            LOG.warning(msg, instance\u003dself.instance)"},{"line_number":179,"context_line":"        else:"},{"line_number":180,"context_line":"            raise exception.MigrationPreCheckError(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":36,"id":"9fdfeff1_7589e96c","line":177,"in_reply_to":"9fdfeff1_5e7e4719","updated":"2019-02-28 12:32:34.000000000","message":"Done","commit_id":"bbb92df744016c023b3456aa6c2324726abc1bdd"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"33c558c9af0058974f5d2320f20c11f8c45ae660","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            self.migrate_data \u003d self.compute_rpcapi.\\"},{"line_number":322,"context_line":"                check_can_live_migrate_destination(self.context, self.instance,"},{"line_number":323,"context_line":"                    destination, self.block_migration, self.disk_over_commit,"},{"line_number":324,"context_line":"                    self.migration, self.limits)"},{"line_number":325,"context_line":"        except messaging.MessagingTimeout:"},{"line_number":326,"context_line":"            msg \u003d _(\"Timeout while checking if we can live migrate to host: \""},{"line_number":327,"context_line":"                    \"%s\") % destination"}],"source_content_type":"text/x-python","patch_set":51,"id":"7faddb67_001b41ca","line":324,"updated":"2019-08-23 16:03:31.000000000","message":"This really needs to go with the rpc patch. The rest of the changes in this file could stand alone, but there\u0027s not much point.","commit_id":"091eb3d68b454730ee315b3ccc2c9316fcfab1ee"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":321,"context_line":"            self.migrate_data \u003d self.compute_rpcapi.\\"},{"line_number":322,"context_line":"                check_can_live_migrate_destination(self.context, self.instance,"},{"line_number":323,"context_line":"                    destination, self.block_migration, self.disk_over_commit,"},{"line_number":324,"context_line":"                    self.migration, self.limits)"},{"line_number":325,"context_line":"        except messaging.MessagingTimeout:"},{"line_number":326,"context_line":"            msg \u003d _(\"Timeout while checking if we can live migrate to host: \""},{"line_number":327,"context_line":"                    \"%s\") % destination"}],"source_content_type":"text/x-python","patch_set":51,"id":"7faddb67_13395aa2","line":324,"in_reply_to":"7faddb67_001b41ca","updated":"2019-08-23 21:26:51.000000000","message":"Squashed.","commit_id":"091eb3d68b454730ee315b3ccc2c9316fcfab1ee"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"95c0e718fcb2b27ffd508106d1b1f98efc91fdf2","unresolved":false,"context_lines":[{"line_number":491,"context_line":"                # those before moving on."},{"line_number":492,"context_line":"                self._remove_host_allocations(host, selection.nodename)"},{"line_number":493,"context_line":"                host \u003d None"},{"line_number":494,"context_line":"        return (selection.service_host, selection.nodename,"},{"line_number":495,"context_line":"                selection.limits if \u0027limits\u0027 in selection else None)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def _remove_host_allocations(self, host, node):"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_23c4ab91","line":494,"updated":"2019-09-03 21:24:13.000000000","message":"nit: this method should probably just return the Selection object since we\u0027re returning half of it in tuple form now - but that\u0027s fine for a later refactor/cleanup.","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"51431a406b88d43efb87152c3abff60010a62e42","unresolved":false,"context_lines":[{"line_number":491,"context_line":"                # those before moving on."},{"line_number":492,"context_line":"                self._remove_host_allocations(host, selection.nodename)"},{"line_number":493,"context_line":"                host \u003d None"},{"line_number":494,"context_line":"        return (selection.service_host, selection.nodename,"},{"line_number":495,"context_line":"                selection.limits if \u0027limits\u0027 in selection else None)"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def _remove_host_allocations(self, host, node):"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_998dd22b","line":494,"in_reply_to":"7faddb67_23c4ab91","updated":"2019-09-04 00:25:46.000000000","message":"Ack, noted in a TODO.","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":494,"context_line":"        # TODO(artom) We should probably just return the whole selection object"},{"line_number":495,"context_line":"        # at this point."},{"line_number":496,"context_line":"        return (selection.service_host, selection.nodename,"},{"line_number":497,"context_line":"                selection.limits if \u0027limits\u0027 in selection else None)"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    def _remove_host_allocations(self, host, node):"},{"line_number":500,"context_line":"        \"\"\"Removes instance allocations against the given host from Placement"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_d030caeb","line":497,"range":{"start_line":497,"start_character":33,"end_line":497,"end_character":57},"updated":"2019-09-05 20:57:42.000000000","message":"Is this ever not in the Selection object? We hit it unconditionally for evacuate:\n\nhttps://github.com/openstack/nova/blob/f7f5e1846c7b19aa05817df7f3c4345819db413f/nova/conductor/manager.py#L1066","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":494,"context_line":"        # TODO(artom) We should probably just return the whole selection object"},{"line_number":495,"context_line":"        # at this point."},{"line_number":496,"context_line":"        return (selection.service_host, selection.nodename,"},{"line_number":497,"context_line":"                selection.limits if \u0027limits\u0027 in selection else None)"},{"line_number":498,"context_line":""},{"line_number":499,"context_line":"    def _remove_host_allocations(self, host, node):"},{"line_number":500,"context_line":"        \"\"\"Removes instance allocations against the given host from Placement"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_1cdc1b73","line":497,"range":{"start_line":497,"start_character":33,"end_line":497,"end_character":57},"in_reply_to":"7faddb67_d030caeb","updated":"2019-09-06 16:44:40.000000000","message":"You\u0027re right, I traced this down to https://github.com/openstack/nova/blob/f7f5e1846c7b19aa05817df7f3c4345819db413f/nova/objects/request_spec.py#L991 and it\u0027s never None.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"}],"nova/objects/service.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0792ad100c05873dd1457c6196d0981f0fd9fa6d","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# NOTE(danms): This is the global service version counter"},{"line_number":34,"context_line":"SERVICE_VERSION \u003d 39"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# NOTE(danms): This is our SERVICE_VERSION history. The idea is that any"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_4d727a7e","line":34,"updated":"2019-02-25 06:22:23.000000000","message":"you already bump the version https://review.openstack.org/#/c/634605/20/nova/objects/service.py","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5ddbb96bf7d71d86dceaf57121934934eea66e69","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# NOTE(danms): This is the global service version counter"},{"line_number":34,"context_line":"SERVICE_VERSION \u003d 39"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# NOTE(danms): This is our SERVICE_VERSION history. The idea is that any"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_6dd65e56","line":34,"updated":"2019-02-25 06:18:57.000000000","message":"you already bump the version in the beginning https://review.openstack.org/#/c/634605/20/nova/objects/service.py","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"a792829115039db01eda6a40d3d838020bc394ab","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# NOTE(danms): This is the global service version counter"},{"line_number":34,"context_line":"SERVICE_VERSION \u003d 39"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# NOTE(danms): This is our SERVICE_VERSION history. The idea is that any"}],"source_content_type":"text/x-python","patch_set":29,"id":"9fdfeff1_b224910e","line":34,"in_reply_to":"9fdfeff1_4d727a7e","updated":"2019-02-25 20:06:55.000000000","message":"Right, but we have to bump the service version again, because the bump and code that checks for that bump have to be in the same patch. If we\u0027re checking the previous patch\u0027s bump, we could conceivably have a compute that has the previous patch but not this one, so while it can accept the new RPC parameters, it\u0027s not doing anything with them.","commit_id":"ff728365635be8447bb124a9842934080a8f789a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    {\u0027compute_rpc\u0027: \u00275.2\u0027},"},{"line_number":159,"context_line":"    # Version 40: Add migration and limits parameters to"},{"line_number":160,"context_line":"    # check_can_live_migrate_destination(), new"},{"line_number":161,"context_line":"    # drop_move_claim_at_destination() method, and numa_live_migration"},{"line_number":162,"context_line":"    # parameter to check_can_live_migrate_source()"},{"line_number":163,"context_line":"    {\u0027compute_rpc\u0027: \u00275.3\u0027},"},{"line_number":164,"context_line":")"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_3064bee4","line":161,"range":{"start_line":161,"start_character":51,"end_line":161,"end_character":70},"updated":"2019-09-05 20:57:42.000000000","message":"\"add numa_live_migration...\"","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":158,"context_line":"    {\u0027compute_rpc\u0027: \u00275.2\u0027},"},{"line_number":159,"context_line":"    # Version 40: Add migration and limits parameters to"},{"line_number":160,"context_line":"    # check_can_live_migrate_destination(), new"},{"line_number":161,"context_line":"    # drop_move_claim_at_destination() method, and numa_live_migration"},{"line_number":162,"context_line":"    # parameter to check_can_live_migrate_source()"},{"line_number":163,"context_line":"    {\u0027compute_rpc\u0027: \u00275.3\u0027},"},{"line_number":164,"context_line":")"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_3cd9d782","line":161,"range":{"start_line":161,"start_character":51,"end_line":161,"end_character":70},"in_reply_to":"7faddb67_3064bee4","updated":"2019-09-06 16:44:40.000000000","message":"Moot, code is gone.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"}],"nova/tests/functional/integrated_helpers.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3ad5d450be75e8d55fed7f137e6e31a419377bb9","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        nova.tests.unit.image.fake.stub_out_image_service(self)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        if self.USE_CAST_AS_CALL:"},{"line_number":96,"context_line":"            self.useFixture(cast_as_call.CastAsCall(self))"},{"line_number":97,"context_line":"        placement \u003d self.useFixture(func_fixtures.PlacementFixture())"},{"line_number":98,"context_line":"        self.placement_api \u003d placement.api"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9fdfeff1_2a525368","line":96,"updated":"2019-02-26 17:19:03.000000000","message":"This should be a separate patch, IMHO.","commit_id":"999de0a28024e13dcec3981a74b63e9a9346e0cc"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"5bcc458685f505adb1d72f4edeb06ea26c30a7dc","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        nova.tests.unit.image.fake.stub_out_image_service(self)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"        if self.USE_CAST_AS_CALL:"},{"line_number":96,"context_line":"            self.useFixture(cast_as_call.CastAsCall(self))"},{"line_number":97,"context_line":"        placement \u003d self.useFixture(func_fixtures.PlacementFixture())"},{"line_number":98,"context_line":"        self.placement_api \u003d placement.api"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"9fdfeff1_271da961","line":96,"in_reply_to":"9fdfeff1_2a525368","updated":"2019-02-26 20:20:00.000000000","message":"Done","commit_id":"999de0a28024e13dcec3981a74b63e9a9346e0cc"}],"nova/tests/unit/compute/test_compute.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":6815,"context_line":"            ret \u003d self.compute.rollback_live_migration_at_destination(c,"},{"line_number":6816,"context_line":"                                                        instance\u003dinstance,"},{"line_number":6817,"context_line":"                                                        destroy_disks\u003dTrue,"},{"line_number":6818,"context_line":"                                                        migrate_data\u003d[])"},{"line_number":6819,"context_line":"        self.assertIsNone(ret)"},{"line_number":6820,"context_line":"        self.assertEqual(len(fake_notifier.NOTIFICATIONS), 2)"},{"line_number":6821,"context_line":"        msg \u003d fake_notifier.NOTIFICATIONS[0]"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_a0a25599","line":6818,"range":{"start_line":6818,"start_character":69,"end_line":6818,"end_character":71},"updated":"2019-09-09 18:31:38.000000000","message":"Why would this change to an empty list? Is this busted because you\u0027re checking if an attribute is in there? I get it, but pass a real object then, not something this would never be (a list).","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":6815,"context_line":"            ret \u003d self.compute.rollback_live_migration_at_destination(c,"},{"line_number":6816,"context_line":"                                                        instance\u003dinstance,"},{"line_number":6817,"context_line":"                                                        destroy_disks\u003dTrue,"},{"line_number":6818,"context_line":"                                                        migrate_data\u003d[])"},{"line_number":6819,"context_line":"        self.assertIsNone(ret)"},{"line_number":6820,"context_line":"        self.assertEqual(len(fake_notifier.NOTIFICATIONS), 2)"},{"line_number":6821,"context_line":"        msg \u003d fake_notifier.NOTIFICATIONS[0]"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_f4748f9b","line":6818,"range":{"start_line":6818,"start_character":69,"end_line":6818,"end_character":71},"in_reply_to":"5faad753_a0a25599","updated":"2019-09-10 02:18:03.000000000","message":"At this point it might be an artefact from before we added drop_move_claim as its own RPC call. The test passes if I undo this change.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82d0b6c04fe8d2731c27dd1b421e66822a506894","unresolved":false,"context_lines":[{"line_number":6815,"context_line":"            ret \u003d self.compute.rollback_live_migration_at_destination(c,"},{"line_number":6816,"context_line":"                                                        instance\u003dinstance,"},{"line_number":6817,"context_line":"                                                        destroy_disks\u003dTrue,"},{"line_number":6818,"context_line":"                                                        migrate_data\u003d[])"},{"line_number":6819,"context_line":"        self.assertIsNone(ret)"},{"line_number":6820,"context_line":"        self.assertEqual(len(fake_notifier.NOTIFICATIONS), 2)"},{"line_number":6821,"context_line":"        msg \u003d fake_notifier.NOTIFICATIONS[0]"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_ef82764f","line":6818,"range":{"start_line":6818,"start_character":69,"end_line":6818,"end_character":71},"in_reply_to":"5faad753_a0a25599","updated":"2019-09-09 22:48:50.000000000","message":"assuming you are correct then ya an empty migrate_data object would be a better replacement","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":6720,"context_line":"                self.compute._rollback_live_migration("},{"line_number":6721,"context_line":"                    c, instance, \u0027foo\u0027, migrate_data\u003dmigrate_data,"},{"line_number":6722,"context_line":"                    source_bdms\u003dsource_bdms)"},{"line_number":6723,"context_line":"            mock_drop_claim.assert_called_with(c, instance, \u0027foo\u0027)"},{"line_number":6724,"context_line":"            mock_notify.assert_has_calls(["},{"line_number":6725,"context_line":"                mock.call(c, instance, self.compute.host,"},{"line_number":6726,"context_line":"                          action\u003d\u0027live_migration_rollback\u0027, phase\u003d\u0027start\u0027,"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_aa8d35d4","line":6723,"range":{"start_line":6723,"start_character":28,"end_line":6723,"end_character":46},"updated":"2019-09-10 19:05:07.000000000","message":"assert_called_once_with","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":6720,"context_line":"                self.compute._rollback_live_migration("},{"line_number":6721,"context_line":"                    c, instance, \u0027foo\u0027, migrate_data\u003dmigrate_data,"},{"line_number":6722,"context_line":"                    source_bdms\u003dsource_bdms)"},{"line_number":6723,"context_line":"            mock_drop_claim.assert_called_with(c, instance, \u0027foo\u0027)"},{"line_number":6724,"context_line":"            mock_notify.assert_has_calls(["},{"line_number":6725,"context_line":"                mock.call(c, instance, self.compute.host,"},{"line_number":6726,"context_line":"                          action\u003d\u0027live_migration_rollback\u0027, phase\u003d\u0027start\u0027,"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_5560e6a5","line":6723,"range":{"start_line":6723,"start_character":28,"end_line":6723,"end_character":46},"in_reply_to":"5faad753_aa8d35d4","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"}],"nova/tests/unit/compute/test_compute_mgr.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a9398aff3dc934fd6dceda45387497bd15322b4c","unresolved":false,"context_lines":[{"line_number":2808,"context_line":"            self.assertNotIn(\u0027src_supports_numa_live_migration\u0027, result)"},{"line_number":2809,"context_line":""},{"line_number":2810,"context_line":"    def test_check_can_live_migrate_source_can_numa_lm(self):"},{"line_number":2811,"context_line":"        self._test_check_can_live_migrate_source(True, True)"},{"line_number":2812,"context_line":""},{"line_number":2813,"context_line":"    def test_check_can_live_migrate_source_cant_numa_lm(self):"},{"line_number":2814,"context_line":"        self._test_check_can_live_migrate_source(False, True)"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_233fcbb5","line":2811,"range":{"start_line":2811,"start_character":49,"end_line":2811,"end_character":59},"updated":"2019-09-03 21:13:00.000000000","message":"Using named args here and below would help readability.","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"51431a406b88d43efb87152c3abff60010a62e42","unresolved":false,"context_lines":[{"line_number":2808,"context_line":"            self.assertNotIn(\u0027src_supports_numa_live_migration\u0027, result)"},{"line_number":2809,"context_line":""},{"line_number":2810,"context_line":"    def test_check_can_live_migrate_source_can_numa_lm(self):"},{"line_number":2811,"context_line":"        self._test_check_can_live_migrate_source(True, True)"},{"line_number":2812,"context_line":""},{"line_number":2813,"context_line":"    def test_check_can_live_migrate_source_cant_numa_lm(self):"},{"line_number":2814,"context_line":"        self._test_check_can_live_migrate_source(False, True)"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_f912c6fc","line":2811,"range":{"start_line":2811,"start_character":49,"end_line":2811,"end_character":59},"in_reply_to":"7faddb67_233fcbb5","updated":"2019-09-04 00:25:46.000000000","message":"Yeah - I couldn\u0027t get named args to play nice with the existing mocks, so I\u0027ll just move them to be a context manager.","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"93cc9bc93da567d24945ecdc4d16734c70f1e823","unresolved":false,"context_lines":[{"line_number":2689,"context_line":"        ) as (mock_lm_claim, mock_get_nodename, mock_from_instance,"},{"line_number":2690,"context_line":"              mock_post_claim_migrate_data):"},{"line_number":2691,"context_line":"            instance \u003d objects.Instance(flavor\u003dobjects.Flavor())"},{"line_number":2692,"context_line":"            md \u003d objects.LibvirtLiveMigrateData()"},{"line_number":2693,"context_line":"            md.src_supports_numa_live_migration \u003d True"},{"line_number":2694,"context_line":"            new_md \u003d self.compute._live_migration_claim("},{"line_number":2695,"context_line":"                self.context, instance, md, mock.sentinel.migration,"},{"line_number":2696,"context_line":"                mock.sentinel.limits)"}],"source_content_type":"text/x-python","patch_set":73,"id":"7faddb67_fe413e64","line":2693,"range":{"start_line":2692,"start_character":12,"end_line":2693,"end_character":54},"updated":"2019-09-04 14:58:01.000000000","message":"md \u003d objects.LibvirtLiveMigrateData(\n     src_supports_numa_live_migration\u003dTrue)","commit_id":"9dce922cf0c0087e390360c23de37e1fe6ab20eb"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f26fdb06bc03288b373469d606ac3a6d7a6c24d7","unresolved":false,"context_lines":[{"line_number":2689,"context_line":"        ) as (mock_lm_claim, mock_get_nodename, mock_from_instance,"},{"line_number":2690,"context_line":"              mock_post_claim_migrate_data):"},{"line_number":2691,"context_line":"            instance \u003d objects.Instance(flavor\u003dobjects.Flavor())"},{"line_number":2692,"context_line":"            md \u003d objects.LibvirtLiveMigrateData()"},{"line_number":2693,"context_line":"            md.src_supports_numa_live_migration \u003d True"},{"line_number":2694,"context_line":"            new_md \u003d self.compute._live_migration_claim("},{"line_number":2695,"context_line":"                self.context, instance, md, mock.sentinel.migration,"},{"line_number":2696,"context_line":"                mock.sentinel.limits)"}],"source_content_type":"text/x-python","patch_set":73,"id":"7faddb67_3269428b","line":2693,"range":{"start_line":2692,"start_character":12,"end_line":2693,"end_character":54},"in_reply_to":"7faddb67_fe413e64","updated":"2019-09-04 19:29:58.000000000","message":"Done","commit_id":"9dce922cf0c0087e390360c23de37e1fe6ab20eb"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b663a85ce9ba9e8488be74fd383cb121dfeca1c7","unresolved":false,"context_lines":[{"line_number":2690,"context_line":"              mock_post_claim_migrate_data):"},{"line_number":2691,"context_line":"            instance \u003d objects.Instance(flavor\u003dobjects.Flavor())"},{"line_number":2692,"context_line":"            md \u003d objects.LibvirtLiveMigrateData("},{"line_number":2693,"context_line":"                src_supports_numa_live_migration\u003dTrue)"},{"line_number":2694,"context_line":"            new_md \u003d self.compute._live_migration_claim("},{"line_number":2695,"context_line":"                self.context, instance, md, mock.sentinel.migration,"},{"line_number":2696,"context_line":"                mock.sentinel.limits)"}],"source_content_type":"text/x-python","patch_set":74,"id":"7faddb67_4118a6cb","line":2693,"range":{"start_line":2693,"start_character":0,"end_line":2693,"end_character":54},"updated":"2019-09-05 00:37:24.000000000","message":"This can be removed since the conditional that uses it has been moved to check_can_live_migrate_destination.","commit_id":"f91c0242860d4f2c0bca6686d15e45ee70641f51"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b663a85ce9ba9e8488be74fd383cb121dfeca1c7","unresolved":false,"context_lines":[{"line_number":2701,"context_line":"                self.context, instance, md, mock_claim)"},{"line_number":2702,"context_line":"            self.assertEqual(self.dst_numa_info, new_md.dst_numa_info)"},{"line_number":2703,"context_line":""},{"line_number":2704,"context_line":"    def test_live_migration_claim_no_instance_numa_topo(self):"},{"line_number":2705,"context_line":"        with test.nested("},{"line_number":2706,"context_line":"            mock.patch.object(self.compute.rt,"},{"line_number":2707,"context_line":"                              \u0027live_migration_claim\u0027),"},{"line_number":2708,"context_line":"            mock.patch.object(fake_driver.FakeDriver,"},{"line_number":2709,"context_line":"                              \u0027post_claim_migrate_data\u0027)"},{"line_number":2710,"context_line":"        ) as (mock_lm_claim, mock_post_claim_migrate_data):"},{"line_number":2711,"context_line":"            instance \u003d objects.Instance()"},{"line_number":2712,"context_line":"            md \u003d objects.LibvirtLiveMigrateData()"},{"line_number":2713,"context_line":"            new_md \u003d self.compute._live_migration_claim("},{"line_number":2714,"context_line":"                self.context, instance, md, mock.sentinel.migration,"},{"line_number":2715,"context_line":"                mock.sentinel.limits)"},{"line_number":2716,"context_line":"            mock_lm_claim.assert_not_called()"},{"line_number":2717,"context_line":"            mock_post_claim_migrate_data.assert_not_called()"},{"line_number":2718,"context_line":"            self.assertNotIn(\u0027dst_numa_info\u0027, new_md)"},{"line_number":2719,"context_line":""},{"line_number":2720,"context_line":"    def test_live_migration_claim_claim_raises(self):"},{"line_number":2721,"context_line":"        stub_image_meta \u003d objects.ImageMeta()"}],"source_content_type":"text/x-python","patch_set":74,"id":"7faddb67_a1095a84","line":2718,"range":{"start_line":2704,"start_character":0,"end_line":2718,"end_character":53},"updated":"2019-09-05 00:37:24.000000000","message":"This doesn\u0027t need to exist anymore, the instance numa topology is no longer used as a sentinel for claiming.","commit_id":"f91c0242860d4f2c0bca6686d15e45ee70641f51"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":2675,"context_line":"        mock_claim \u003d mock.Mock()"},{"line_number":2676,"context_line":"        mock_claim.claimed_numa_topology \u003d mock.sentinel.claimed_topology"},{"line_number":2677,"context_line":"        stub_image_meta \u003d objects.ImageMeta()"},{"line_number":2678,"context_line":"        self.dst_numa_info \u003d objects.LibvirtLiveMigrateNUMAInfo()"},{"line_number":2679,"context_line":"        with test.nested("},{"line_number":2680,"context_line":"            mock.patch.object(self.compute.rt,"},{"line_number":2681,"context_line":"                              \u0027live_migration_claim\u0027,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_e0b12de3","line":2678,"range":{"start_line":2678,"start_character":8,"end_line":2678,"end_character":12},"updated":"2019-09-09 18:31:38.000000000","message":"Why does this need to be a member variable?","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":2675,"context_line":"        mock_claim \u003d mock.Mock()"},{"line_number":2676,"context_line":"        mock_claim.claimed_numa_topology \u003d mock.sentinel.claimed_topology"},{"line_number":2677,"context_line":"        stub_image_meta \u003d objects.ImageMeta()"},{"line_number":2678,"context_line":"        self.dst_numa_info \u003d objects.LibvirtLiveMigrateNUMAInfo()"},{"line_number":2679,"context_line":"        with test.nested("},{"line_number":2680,"context_line":"            mock.patch.object(self.compute.rt,"},{"line_number":2681,"context_line":"                              \u0027live_migration_claim\u0027,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_14e92b19","line":2678,"range":{"start_line":2678,"start_character":8,"end_line":2678,"end_character":12},"in_reply_to":"5faad753_e0b12de3","updated":"2019-09-10 02:18:03.000000000","message":"For L2671 and L2702 (and the equivalent in the next test method). I wanted to assert that _live_migration_claim was returning the thing that post_claim_migrate_data was giving it. I suppose I can just do that with return_value\u003d","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":2703,"context_line":""},{"line_number":2704,"context_line":"    def test_live_migration_claim_claim_raises(self):"},{"line_number":2705,"context_line":"        stub_image_meta \u003d objects.ImageMeta()"},{"line_number":2706,"context_line":"        self.dst_numa_info \u003d objects.LibvirtLiveMigrateNUMAInfo()"},{"line_number":2707,"context_line":"        with test.nested("},{"line_number":2708,"context_line":"            mock.patch.object("},{"line_number":2709,"context_line":"                self.compute.rt, \u0027live_migration_claim\u0027,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_c0c8b156","line":2706,"range":{"start_line":2706,"start_character":8,"end_line":2706,"end_character":12},"updated":"2019-09-09 18:31:38.000000000","message":"same","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":2727,"context_line":"                self.compute._live_migration_claim,"},{"line_number":2728,"context_line":"                self.context, instance, md, migration,"},{"line_number":2729,"context_line":"                mock.sentinel.limits)"},{"line_number":2730,"context_line":"            mock_lm_claim.assert_called_with("},{"line_number":2731,"context_line":"                self.context, instance, \u0027fake-dest-node\u0027, migration,"},{"line_number":2732,"context_line":"                mock.sentinel.limits)"},{"line_number":2733,"context_line":"            mock_get_nodename.assert_called_with(self.context, instance)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_400b618d","line":2730,"range":{"start_line":2730,"start_character":26,"end_line":2730,"end_character":44},"updated":"2019-09-09 18:31:38.000000000","message":"Here and throughout, if a mock is called exactly once, use assert_called_once_with.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":2727,"context_line":"                self.compute._live_migration_claim,"},{"line_number":2728,"context_line":"                self.context, instance, md, migration,"},{"line_number":2729,"context_line":"                mock.sentinel.limits)"},{"line_number":2730,"context_line":"            mock_lm_claim.assert_called_with("},{"line_number":2731,"context_line":"                self.context, instance, \u0027fake-dest-node\u0027, migration,"},{"line_number":2732,"context_line":"                mock.sentinel.limits)"},{"line_number":2733,"context_line":"            mock_get_nodename.assert_called_with(self.context, instance)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_54e6c346","line":2730,"range":{"start_line":2730,"start_character":26,"end_line":2730,"end_character":44},"in_reply_to":"5faad753_400b618d","updated":"2019-09-10 02:18:03.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":2730,"context_line":"            mock_lm_claim.assert_called_with("},{"line_number":2731,"context_line":"                self.context, instance, \u0027fake-dest-node\u0027, migration,"},{"line_number":2732,"context_line":"                mock.sentinel.limits)"},{"line_number":2733,"context_line":"            mock_get_nodename.assert_called_with(self.context, instance)"},{"line_number":2734,"context_line":"            mock_post_claim_migrate_data.assert_not_called()"},{"line_number":2735,"context_line":""},{"line_number":2736,"context_line":"    def test_drop_move_claim_at_destination(self):"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_00056977","line":2733,"range":{"start_line":2733,"start_character":49,"end_line":2733,"end_character":71},"updated":"2019-09-09 18:31:38.000000000","message":"This passes the test only b/c the code is wrong.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":2730,"context_line":"            mock_lm_claim.assert_called_with("},{"line_number":2731,"context_line":"                self.context, instance, \u0027fake-dest-node\u0027, migration,"},{"line_number":2732,"context_line":"                mock.sentinel.limits)"},{"line_number":2733,"context_line":"            mock_get_nodename.assert_called_with(self.context, instance)"},{"line_number":2734,"context_line":"            mock_post_claim_migrate_data.assert_not_called()"},{"line_number":2735,"context_line":""},{"line_number":2736,"context_line":"    def test_drop_move_claim_at_destination(self):"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_54bfa3fa","line":2733,"range":{"start_line":2733,"start_character":49,"end_line":2733,"end_character":71},"in_reply_to":"5faad753_00056977","updated":"2019-09-10 02:18:03.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":2741,"context_line":"                              return_value\u003d\u0027fake-node\u0027)"},{"line_number":2742,"context_line":"        ) as (mock_drop_move_claim, mock_get_nodename):"},{"line_number":2743,"context_line":"            self.compute.drop_move_claim_at_destination(self.context, instance)"},{"line_number":2744,"context_line":"            mock_get_nodename.assert_called_with(instance)"},{"line_number":2745,"context_line":"            mock_drop_move_claim.assert_called_with("},{"line_number":2746,"context_line":"                self.context, instance, \u0027fake-node\u0027,"},{"line_number":2747,"context_line":"                instance_type\u003dinstance.flavor)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_e0e60de9","line":2744,"range":{"start_line":2744,"start_character":30,"end_line":2744,"end_character":48},"updated":"2019-09-09 18:31:38.000000000","message":"Use assert_called_once_with.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":2741,"context_line":"                              return_value\u003d\u0027fake-node\u0027)"},{"line_number":2742,"context_line":"        ) as (mock_drop_move_claim, mock_get_nodename):"},{"line_number":2743,"context_line":"            self.compute.drop_move_claim_at_destination(self.context, instance)"},{"line_number":2744,"context_line":"            mock_get_nodename.assert_called_with(instance)"},{"line_number":2745,"context_line":"            mock_drop_move_claim.assert_called_with("},{"line_number":2746,"context_line":"                self.context, instance, \u0027fake-node\u0027,"},{"line_number":2747,"context_line":"                instance_type\u003dinstance.flavor)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_74bc1f05","line":2744,"range":{"start_line":2744,"start_character":30,"end_line":2744,"end_character":48},"in_reply_to":"5faad753_e0e60de9","updated":"2019-09-10 02:18:03.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":2742,"context_line":"        ) as (mock_drop_move_claim, mock_get_nodename):"},{"line_number":2743,"context_line":"            self.compute.drop_move_claim_at_destination(self.context, instance)"},{"line_number":2744,"context_line":"            mock_get_nodename.assert_called_with(instance)"},{"line_number":2745,"context_line":"            mock_drop_move_claim.assert_called_with("},{"line_number":2746,"context_line":"                self.context, instance, \u0027fake-node\u0027,"},{"line_number":2747,"context_line":"                instance_type\u003dinstance.flavor)"},{"line_number":2748,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_00ec89c5","line":2745,"range":{"start_line":2745,"start_character":33,"end_line":2745,"end_character":51},"updated":"2019-09-09 18:31:38.000000000","message":"same","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":2742,"context_line":"        ) as (mock_drop_move_claim, mock_get_nodename):"},{"line_number":2743,"context_line":"            self.compute.drop_move_claim_at_destination(self.context, instance)"},{"line_number":2744,"context_line":"            mock_get_nodename.assert_called_with(instance)"},{"line_number":2745,"context_line":"            mock_drop_move_claim.assert_called_with("},{"line_number":2746,"context_line":"                self.context, instance, \u0027fake-node\u0027,"},{"line_number":2747,"context_line":"                instance_type\u003dinstance.flavor)"},{"line_number":2748,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_1437ebb2","line":2745,"range":{"start_line":2745,"start_character":33,"end_line":2745,"end_character":51},"in_reply_to":"5faad753_00ec89c5","updated":"2019-09-10 02:18:03.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":2759,"context_line":"            mock_check, mock_get_bdms):"},{"line_number":2760,"context_line":"        fake_bdms \u003d objects.BlockDeviceMappingList()"},{"line_number":2761,"context_line":"        mock_get_bdms.return_value \u003d fake_bdms"},{"line_number":2762,"context_line":"        mock_check.return_value \u003d \u0027fake-driver-check-result\u0027"},{"line_number":2763,"context_line":"        mock_src_can_numa.return_value \u003d \u0027fake-can-numa-result\u0027"},{"line_number":2764,"context_line":"        is_volume_backed \u003d \u0027volume_backed\u0027"},{"line_number":2765,"context_line":"        dest_check_data \u003d migrate_data_obj.LiveMigrateData()"},{"line_number":2766,"context_line":"        db_instance \u003d fake_instance.fake_db_instance()"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_202bc5eb","line":2763,"range":{"start_line":2762,"start_character":8,"end_line":2763,"end_character":63},"updated":"2019-09-09 18:31:38.000000000","message":"Can we please use real objects here rather than types that the thing would never be?","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":2759,"context_line":"            mock_check, mock_get_bdms):"},{"line_number":2760,"context_line":"        fake_bdms \u003d objects.BlockDeviceMappingList()"},{"line_number":2761,"context_line":"        mock_get_bdms.return_value \u003d fake_bdms"},{"line_number":2762,"context_line":"        mock_check.return_value \u003d \u0027fake-driver-check-result\u0027"},{"line_number":2763,"context_line":"        mock_src_can_numa.return_value \u003d \u0027fake-can-numa-result\u0027"},{"line_number":2764,"context_line":"        is_volume_backed \u003d \u0027volume_backed\u0027"},{"line_number":2765,"context_line":"        dest_check_data \u003d migrate_data_obj.LiveMigrateData()"},{"line_number":2766,"context_line":"        db_instance \u003d fake_instance.fake_db_instance()"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_45028bb6","line":2763,"range":{"start_line":2762,"start_character":8,"end_line":2763,"end_character":63},"in_reply_to":"5faad753_202bc5eb","updated":"2019-09-10 02:18:03.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82d0b6c04fe8d2731c27dd1b421e66822a506894","unresolved":false,"context_lines":[{"line_number":2759,"context_line":"            mock_check, mock_get_bdms):"},{"line_number":2760,"context_line":"        fake_bdms \u003d objects.BlockDeviceMappingList()"},{"line_number":2761,"context_line":"        mock_get_bdms.return_value \u003d fake_bdms"},{"line_number":2762,"context_line":"        mock_check.return_value \u003d \u0027fake-driver-check-result\u0027"},{"line_number":2763,"context_line":"        mock_src_can_numa.return_value \u003d \u0027fake-can-numa-result\u0027"},{"line_number":2764,"context_line":"        is_volume_backed \u003d \u0027volume_backed\u0027"},{"line_number":2765,"context_line":"        dest_check_data \u003d migrate_data_obj.LiveMigrateData()"},{"line_number":2766,"context_line":"        db_instance \u003d fake_instance.fake_db_instance()"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_efd03653","line":2763,"range":{"start_line":2762,"start_character":8,"end_line":2763,"end_character":63},"in_reply_to":"5faad753_202bc5eb","updated":"2019-09-09 22:48:50.000000000","message":"given the amount of test i have found in the past that only work because we used incorerct data i stongly agree with matt on this. we should at a minium use the correct data type, perferable with a valid fake vlaue.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":2817,"context_line":"            mock.patch.object(compute_utils, \u0027EventReporter\u0027),"},{"line_number":2818,"context_line":"            mock.patch.object(migrate_data_obj.VIFMigrateData,"},{"line_number":2819,"context_line":"                              \u0027create_skeleton_migrate_vifs\u0027,"},{"line_number":2820,"context_line":"                              return_value\u003d[]),"},{"line_number":2821,"context_line":"            mock.patch.object(instance, \u0027get_network_info\u0027),"},{"line_number":2822,"context_line":"            mock.patch.object(self.compute, \u0027_claim_pci_for_instance_vifs\u0027),"},{"line_number":2823,"context_line":"            mock.patch.object(self.compute,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_003a4935","line":2820,"range":{"start_line":2820,"start_character":30,"end_line":2820,"end_character":45},"updated":"2019-09-09 18:31:38.000000000","message":"Why does this need to change?","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":2817,"context_line":"            mock.patch.object(compute_utils, \u0027EventReporter\u0027),"},{"line_number":2818,"context_line":"            mock.patch.object(migrate_data_obj.VIFMigrateData,"},{"line_number":2819,"context_line":"                              \u0027create_skeleton_migrate_vifs\u0027,"},{"line_number":2820,"context_line":"                              return_value\u003d[]),"},{"line_number":2821,"context_line":"            mock.patch.object(instance, \u0027get_network_info\u0027),"},{"line_number":2822,"context_line":"            mock.patch.object(self.compute, \u0027_claim_pci_for_instance_vifs\u0027),"},{"line_number":2823,"context_line":"            mock.patch.object(self.compute,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_d4271364","line":2820,"range":{"start_line":2820,"start_character":30,"end_line":2820,"end_character":45},"in_reply_to":"5faad753_003a4935","updated":"2019-09-10 02:18:03.000000000","message":"It was failing tox-lower-constraints otherwise: https://efbed3978079cc645f09-4b7d4da09de7dae33770cacbfd550cfb.ssl.cf5.rackcdn.com/634606/78/check/openstack-tox-lower-constraints/871ee0c/testr_results.html.gz","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82d0b6c04fe8d2731c27dd1b421e66822a506894","unresolved":false,"context_lines":[{"line_number":2817,"context_line":"            mock.patch.object(compute_utils, \u0027EventReporter\u0027),"},{"line_number":2818,"context_line":"            mock.patch.object(migrate_data_obj.VIFMigrateData,"},{"line_number":2819,"context_line":"                              \u0027create_skeleton_migrate_vifs\u0027,"},{"line_number":2820,"context_line":"                              return_value\u003d[]),"},{"line_number":2821,"context_line":"            mock.patch.object(instance, \u0027get_network_info\u0027),"},{"line_number":2822,"context_line":"            mock.patch.object(self.compute, \u0027_claim_pci_for_instance_vifs\u0027),"},{"line_number":2823,"context_line":"            mock.patch.object(self.compute,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_cf40da0a","line":2820,"range":{"start_line":2820,"start_character":30,"end_line":2820,"end_character":45},"in_reply_to":"5faad753_003a4935","updated":"2019-09-09 22:48:50.000000000","message":"i presume this is so artom can ignore the sriov migration cases. perhaps it is related to the pci claims? i dont know however why this needed to be changed an im just guessing.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":2844,"context_line":"            result \u003d self.compute.check_can_live_migrate_destination("},{"line_number":2845,"context_line":"                self.context, instance\u003dinstance,"},{"line_number":2846,"context_line":"                block_migration\u003dblock_migration,"},{"line_number":2847,"context_line":"                disk_over_commit\u003ddisk_over_commit, migration\u003d\u0027fake-migration\u0027,"},{"line_number":2848,"context_line":"                limits\u003d\u0027fake-limits\u0027)"},{"line_number":2849,"context_line":""},{"line_number":2850,"context_line":"            if do_raise:"},{"line_number":2851,"context_line":"                mock_fault_create.assert_called_once_with(self.context,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_c03bd135","line":2848,"range":{"start_line":2847,"start_character":51,"end_line":2848,"end_character":36},"updated":"2019-09-09 18:31:38.000000000","message":"I\u0027d prefer to use real objects if possible.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":2844,"context_line":"            result \u003d self.compute.check_can_live_migrate_destination("},{"line_number":2845,"context_line":"                self.context, instance\u003dinstance,"},{"line_number":2846,"context_line":"                block_migration\u003dblock_migration,"},{"line_number":2847,"context_line":"                disk_over_commit\u003ddisk_over_commit, migration\u003d\u0027fake-migration\u0027,"},{"line_number":2848,"context_line":"                limits\u003d\u0027fake-limits\u0027)"},{"line_number":2849,"context_line":""},{"line_number":2850,"context_line":"            if do_raise:"},{"line_number":2851,"context_line":"                mock_fault_create.assert_called_once_with(self.context,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_258f4f2b","line":2848,"range":{"start_line":2847,"start_character":51,"end_line":2848,"end_character":36},"in_reply_to":"5faad753_c03bd135","updated":"2019-09-10 02:18:03.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":2854,"context_line":"                                                   dest_check_data)"},{"line_number":2855,"context_line":"            mock_dest_can_numa.assert_called_with(dest_check_data,"},{"line_number":2856,"context_line":"                                                  \u0027fake-migration\u0027)"},{"line_number":2857,"context_line":"            if src_numa_lm is None or src_numa_lm is False:"},{"line_number":2858,"context_line":"                mock_lm_claim.assert_not_called()"},{"line_number":2859,"context_line":"                self.assertEqual(mig_data, result)"},{"line_number":2860,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_401921d5","line":2857,"updated":"2019-09-09 18:31:38.000000000","message":"How about just \"if not src_numa_lm:\"?","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":2854,"context_line":"                                                   dest_check_data)"},{"line_number":2855,"context_line":"            mock_dest_can_numa.assert_called_with(dest_check_data,"},{"line_number":2856,"context_line":"                                                  \u0027fake-migration\u0027)"},{"line_number":2857,"context_line":"            if src_numa_lm is None or src_numa_lm is False:"},{"line_number":2858,"context_line":"                mock_lm_claim.assert_not_called()"},{"line_number":2859,"context_line":"                self.assertEqual(mig_data, result)"},{"line_number":2860,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_857de31d","line":2857,"in_reply_to":"5faad753_401921d5","updated":"2019-09-10 02:18:03.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":2941,"context_line":"                self.compute._source_can_numa_live_migrate("},{"line_number":2942,"context_line":"                    self.context, negative_dest_check_data,"},{"line_number":2943,"context_line":"                    copy.deepcopy(negative_source_check_data)))"},{"line_number":2944,"context_line":"        with mock.patch.object(self.compute.compute_rpcapi,"},{"line_number":2945,"context_line":"                               \u0027supports_numa_live_migration\u0027,"},{"line_number":2946,"context_line":"                               return_value\u003dFalse):"},{"line_number":2947,"context_line":"            self.assertNotIn("},{"line_number":2948,"context_line":"                \u0027src_supports_numa_live_migration\u0027,"},{"line_number":2949,"context_line":"                self.compute._source_can_numa_live_migrate("}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_e0828dc8","line":2946,"range":{"start_line":2944,"start_character":8,"end_line":2946,"end_character":51},"updated":"2019-09-09 18:31:38.000000000","message":"Why don\u0027t you assert that this is called?","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":2941,"context_line":"                self.compute._source_can_numa_live_migrate("},{"line_number":2942,"context_line":"                    self.context, negative_dest_check_data,"},{"line_number":2943,"context_line":"                    copy.deepcopy(negative_source_check_data)))"},{"line_number":2944,"context_line":"        with mock.patch.object(self.compute.compute_rpcapi,"},{"line_number":2945,"context_line":"                               \u0027supports_numa_live_migration\u0027,"},{"line_number":2946,"context_line":"                               return_value\u003dFalse):"},{"line_number":2947,"context_line":"            self.assertNotIn("},{"line_number":2948,"context_line":"                \u0027src_supports_numa_live_migration\u0027,"},{"line_number":2949,"context_line":"                self.compute._source_can_numa_live_migrate("}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_257bcf8c","line":2946,"range":{"start_line":2944,"start_character":8,"end_line":2946,"end_character":51},"in_reply_to":"5faad753_e0828dc8","updated":"2019-09-10 02:18:03.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":2695,"context_line":"            mock_lm_claim.assert_called_once_with("},{"line_number":2696,"context_line":"                self.context, instance, \u0027fake-dest-node\u0027, migration,"},{"line_number":2697,"context_line":"                mock.sentinel.limits)"},{"line_number":2698,"context_line":"            mock_post_claim_migrate_data.assert_called_with("},{"line_number":2699,"context_line":"                self.context, instance, md, mock_claim)"},{"line_number":2700,"context_line":""},{"line_number":2701,"context_line":"    def test_live_migration_claim_claim_raises(self):"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_0ab80974","line":2698,"range":{"start_line":2698,"start_character":41,"end_line":2698,"end_character":59},"updated":"2019-09-10 19:05:07.000000000","message":"assert_called_once_with","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":2695,"context_line":"            mock_lm_claim.assert_called_once_with("},{"line_number":2696,"context_line":"                self.context, instance, \u0027fake-dest-node\u0027, migration,"},{"line_number":2697,"context_line":"                mock.sentinel.limits)"},{"line_number":2698,"context_line":"            mock_post_claim_migrate_data.assert_called_with("},{"line_number":2699,"context_line":"                self.context, instance, md, mock_claim)"},{"line_number":2700,"context_line":""},{"line_number":2701,"context_line":"    def test_live_migration_claim_claim_raises(self):"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_155a6ef2","line":2698,"range":{"start_line":2698,"start_character":41,"end_line":2698,"end_character":59},"in_reply_to":"5faad753_0ab80974","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":2723,"context_line":"            mock_lm_claim.assert_called_once_with("},{"line_number":2724,"context_line":"                self.context, instance, \u0027fake-dest-node\u0027, migration,"},{"line_number":2725,"context_line":"                mock.sentinel.limits)"},{"line_number":2726,"context_line":"            mock_get_nodename.assert_called_with(instance)"},{"line_number":2727,"context_line":"            mock_post_claim_migrate_data.assert_not_called()"},{"line_number":2728,"context_line":""},{"line_number":2729,"context_line":"    def test_drop_move_claim_at_destination(self):"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_6a65fd44","line":2726,"range":{"start_line":2726,"start_character":30,"end_line":2726,"end_character":48},"updated":"2019-09-10 19:05:07.000000000","message":"assert_called_once_with","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":2723,"context_line":"            mock_lm_claim.assert_called_once_with("},{"line_number":2724,"context_line":"                self.context, instance, \u0027fake-dest-node\u0027, migration,"},{"line_number":2725,"context_line":"                mock.sentinel.limits)"},{"line_number":2726,"context_line":"            mock_get_nodename.assert_called_with(instance)"},{"line_number":2727,"context_line":"            mock_post_claim_migrate_data.assert_not_called()"},{"line_number":2728,"context_line":""},{"line_number":2729,"context_line":"    def test_drop_move_claim_at_destination(self):"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_355d2ae9","line":2726,"range":{"start_line":2726,"start_character":30,"end_line":2726,"end_character":48},"in_reply_to":"5faad753_6a65fd44","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":2769,"context_line":"                self.context, instance\u003dinstance,"},{"line_number":2770,"context_line":"                dest_check_data\u003ddest_check_data)"},{"line_number":2771,"context_line":"        self.assertEqual(can_numa_result, result)"},{"line_number":2772,"context_line":"        mock_src_can_numa.assert_called_with(self.context, dest_check_data,"},{"line_number":2773,"context_line":"                                             drvr_check_result)"},{"line_number":2774,"context_line":"        mock_event.assert_called_once_with("},{"line_number":2775,"context_line":"            self.context, \u0027compute_check_can_live_migrate_source\u0027, CONF.host,"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_cab19191","line":2772,"range":{"start_line":2772,"start_character":26,"end_line":2772,"end_character":44},"updated":"2019-09-10 19:05:07.000000000","message":"assert_called_once_with","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":2769,"context_line":"                self.context, instance\u003dinstance,"},{"line_number":2770,"context_line":"                dest_check_data\u003ddest_check_data)"},{"line_number":2771,"context_line":"        self.assertEqual(can_numa_result, result)"},{"line_number":2772,"context_line":"        mock_src_can_numa.assert_called_with(self.context, dest_check_data,"},{"line_number":2773,"context_line":"                                             drvr_check_result)"},{"line_number":2774,"context_line":"        mock_event.assert_called_once_with("},{"line_number":2775,"context_line":"            self.context, \u0027compute_check_can_live_migrate_source\u0027, CONF.host,"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_956dfe99","line":2772,"range":{"start_line":2772,"start_character":26,"end_line":2772,"end_character":44},"in_reply_to":"5faad753_cab19191","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":2855,"context_line":"                mock_lm_claim.assert_not_called()"},{"line_number":2856,"context_line":"                self.assertEqual(mig_data, result)"},{"line_number":2857,"context_line":"            else:"},{"line_number":2858,"context_line":"                mock_lm_claim.assert_called_with("},{"line_number":2859,"context_line":"                    self.context, instance, mig_data, migration, limits)"},{"line_number":2860,"context_line":"                self.assertEqual(post_claim_md, result)"},{"line_number":2861,"context_line":"            mock_check_clean.assert_called_once_with(self.context,"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_8aab991b","line":2858,"range":{"start_line":2858,"start_character":30,"end_line":2858,"end_character":48},"updated":"2019-09-10 19:05:07.000000000","message":"assert_called_once_with","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":2855,"context_line":"                mock_lm_claim.assert_not_called()"},{"line_number":2856,"context_line":"                self.assertEqual(mig_data, result)"},{"line_number":2857,"context_line":"            else:"},{"line_number":2858,"context_line":"                mock_lm_claim.assert_called_with("},{"line_number":2859,"context_line":"                    self.context, instance, mig_data, migration, limits)"},{"line_number":2860,"context_line":"                self.assertEqual(post_claim_md, result)"},{"line_number":2861,"context_line":"            mock_check_clean.assert_called_once_with(self.context,"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_b5683a87","line":2858,"range":{"start_line":2858,"start_character":30,"end_line":2858,"end_character":48},"in_reply_to":"5faad753_8aab991b","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":8656,"context_line":"            self.assertIsNone(self.instance.task_state)"},{"line_number":8657,"context_line":"            save.assert_called_once_with("},{"line_number":8658,"context_line":"                expected_task_state\u003dtask_states.MIGRATING)"},{"line_number":8659,"context_line":"            mock_apply_mig_ctxt.assert_called_with()"},{"line_number":8660,"context_line":"            mock_drop_mig_ctxt.assert_called_with()"},{"line_number":8661,"context_line":""},{"line_number":8662,"context_line":"        _do_test()"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_4a63611b","line":8659,"range":{"start_line":8659,"start_character":32,"end_line":8659,"end_character":50},"updated":"2019-09-10 19:05:07.000000000","message":"assert_called_once_with","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":8656,"context_line":"            self.assertIsNone(self.instance.task_state)"},{"line_number":8657,"context_line":"            save.assert_called_once_with("},{"line_number":8658,"context_line":"                expected_task_state\u003dtask_states.MIGRATING)"},{"line_number":8659,"context_line":"            mock_apply_mig_ctxt.assert_called_with()"},{"line_number":8660,"context_line":"            mock_drop_mig_ctxt.assert_called_with()"},{"line_number":8661,"context_line":""},{"line_number":8662,"context_line":"        _do_test()"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_550546c1","line":8659,"range":{"start_line":8659,"start_character":32,"end_line":8659,"end_character":50},"in_reply_to":"5faad753_4a63611b","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":8657,"context_line":"            save.assert_called_once_with("},{"line_number":8658,"context_line":"                expected_task_state\u003dtask_states.MIGRATING)"},{"line_number":8659,"context_line":"            mock_apply_mig_ctxt.assert_called_with()"},{"line_number":8660,"context_line":"            mock_drop_mig_ctxt.assert_called_with()"},{"line_number":8661,"context_line":""},{"line_number":8662,"context_line":"        _do_test()"},{"line_number":8663,"context_line":""}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_6a665d2c","line":8660,"range":{"start_line":8660,"start_character":31,"end_line":8660,"end_character":49},"updated":"2019-09-10 19:05:07.000000000","message":"assert_called_once_with","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":8657,"context_line":"            save.assert_called_once_with("},{"line_number":8658,"context_line":"                expected_task_state\u003dtask_states.MIGRATING)"},{"line_number":8659,"context_line":"            mock_apply_mig_ctxt.assert_called_with()"},{"line_number":8660,"context_line":"            mock_drop_mig_ctxt.assert_called_with()"},{"line_number":8661,"context_line":""},{"line_number":8662,"context_line":"        _do_test()"},{"line_number":8663,"context_line":""}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_750882d8","line":8660,"range":{"start_line":8660,"start_character":31,"end_line":8660,"end_character":49},"in_reply_to":"5faad753_6a665d2c","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":8693,"context_line":"                mock.call(self.context, self.instance, self.instance.host,"},{"line_number":8694,"context_line":"                          action\u003d\u0027live_migration_post_dest\u0027, phase\u003d\u0027end\u0027)])"},{"line_number":8695,"context_line":"            self.assertIsNone(self.instance.node)"},{"line_number":8696,"context_line":"            mock_apply_mig_ctxt.assert_called_with()"},{"line_number":8697,"context_line":"            mock_drop_mig_ctxt.assert_called_with()"},{"line_number":8698,"context_line":""},{"line_number":8699,"context_line":"        _do_test()"},{"line_number":8700,"context_line":""}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_ca7671d9","line":8697,"range":{"start_line":8696,"start_character":12,"end_line":8697,"end_character":51},"updated":"2019-09-10 19:05:07.000000000","message":"assert_called_once_with","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":8693,"context_line":"                mock.call(self.context, self.instance, self.instance.host,"},{"line_number":8694,"context_line":"                          action\u003d\u0027live_migration_post_dest\u0027, phase\u003d\u0027end\u0027)])"},{"line_number":8695,"context_line":"            self.assertIsNone(self.instance.node)"},{"line_number":8696,"context_line":"            mock_apply_mig_ctxt.assert_called_with()"},{"line_number":8697,"context_line":"            mock_drop_mig_ctxt.assert_called_with()"},{"line_number":8698,"context_line":""},{"line_number":8699,"context_line":"        _do_test()"},{"line_number":8700,"context_line":""}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_35120a0b","line":8697,"range":{"start_line":8696,"start_character":12,"end_line":8697,"end_character":51},"in_reply_to":"5faad753_ca7671d9","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":8726,"context_line":"                              self.compute.post_live_migration_at_destination,"},{"line_number":8727,"context_line":"                              self.context, self.instance, False)"},{"line_number":8728,"context_line":"            self.assertEqual(vm_states.ERROR, self.instance.vm_state)"},{"line_number":8729,"context_line":"            mock_apply_mig_ctxt.assert_called_with()"},{"line_number":8730,"context_line":"            mock_drop_mig_ctxt.assert_called_with()"},{"line_number":8731,"context_line":""},{"line_number":8732,"context_line":"        _do_test()"},{"line_number":8733,"context_line":""}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_ea71eddf","line":8730,"range":{"start_line":8729,"start_character":12,"end_line":8730,"end_character":51},"updated":"2019-09-10 19:05:07.000000000","message":"assert_called_once_with","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":8726,"context_line":"                              self.compute.post_live_migration_at_destination,"},{"line_number":8727,"context_line":"                              self.context, self.instance, False)"},{"line_number":8728,"context_line":"            self.assertEqual(vm_states.ERROR, self.instance.vm_state)"},{"line_number":8729,"context_line":"            mock_apply_mig_ctxt.assert_called_with()"},{"line_number":8730,"context_line":"            mock_drop_mig_ctxt.assert_called_with()"},{"line_number":8731,"context_line":""},{"line_number":8732,"context_line":"        _do_test()"},{"line_number":8733,"context_line":""}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_d5f856c5","line":8730,"range":{"start_line":8729,"start_character":12,"end_line":8730,"end_character":51},"in_reply_to":"5faad753_ea71eddf","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":8767,"context_line":"            self.assertEqual(1, mock_log_error.call_count)"},{"line_number":8768,"context_line":"            self.assertIn(\u0027Network cleanup failed for source host\u0027,"},{"line_number":8769,"context_line":"                          mock_log_error.call_args[0][0])"},{"line_number":8770,"context_line":"            mock_apply_mig_ctxt.assert_called_with()"},{"line_number":8771,"context_line":"            mock_drop_mig_ctxt.assert_called_with()"},{"line_number":8772,"context_line":""},{"line_number":8773,"context_line":"        _do_test()"},{"line_number":8774,"context_line":""}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_4a4cc19d","line":8771,"range":{"start_line":8770,"start_character":12,"end_line":8771,"end_character":51},"updated":"2019-09-10 19:05:07.000000000","message":"assert_called_once_with","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":8767,"context_line":"            self.assertEqual(1, mock_log_error.call_count)"},{"line_number":8768,"context_line":"            self.assertIn(\u0027Network cleanup failed for source host\u0027,"},{"line_number":8769,"context_line":"                          mock_log_error.call_args[0][0])"},{"line_number":8770,"context_line":"            mock_apply_mig_ctxt.assert_called_with()"},{"line_number":8771,"context_line":"            mock_drop_mig_ctxt.assert_called_with()"},{"line_number":8772,"context_line":""},{"line_number":8773,"context_line":"        _do_test()"},{"line_number":8774,"context_line":""}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_b5fd9ab2","line":8771,"range":{"start_line":8770,"start_character":12,"end_line":8771,"end_character":51},"in_reply_to":"5faad753_4a4cc19d","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":9027,"context_line":"            self.assertEqual(bdm.attachment_id, orig_attachment_id)"},{"line_number":9028,"context_line":"            self.assertEqual(orig_attachment_id, bdm.connection_info)"},{"line_number":9029,"context_line":"            bdm.save.assert_called_once_with()"},{"line_number":9030,"context_line":"            mock_drop_mig_ctxt.assert_called_with()"},{"line_number":9031,"context_line":""},{"line_number":9032,"context_line":"        _test()"},{"line_number":9033,"context_line":""}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_ca5f513f","line":9030,"range":{"start_line":9030,"start_character":31,"end_line":9030,"end_character":49},"updated":"2019-09-10 19:05:07.000000000","message":"assert_called_once_with","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":9027,"context_line":"            self.assertEqual(bdm.attachment_id, orig_attachment_id)"},{"line_number":9028,"context_line":"            self.assertEqual(orig_attachment_id, bdm.connection_info)"},{"line_number":9029,"context_line":"            bdm.save.assert_called_once_with()"},{"line_number":9030,"context_line":"            mock_drop_mig_ctxt.assert_called_with()"},{"line_number":9031,"context_line":""},{"line_number":9032,"context_line":"        _test()"},{"line_number":9033,"context_line":""}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_9502deb3","line":9030,"range":{"start_line":9030,"start_character":31,"end_line":9030,"end_character":49},"in_reply_to":"5faad753_ca5f513f","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":9065,"context_line":"            self.assertEqual(1, mock_log_error.call_count)"},{"line_number":9066,"context_line":"            self.assertIn(\u0027Network cleanup failed for destination host\u0027,"},{"line_number":9067,"context_line":"                          mock_log_error.call_args[0][0])"},{"line_number":9068,"context_line":"            drop_mig_ctxt.assert_called_with()"},{"line_number":9069,"context_line":""},{"line_number":9070,"context_line":"        _do_test()"},{"line_number":9071,"context_line":""}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_ea5a4d4e","line":9068,"range":{"start_line":9068,"start_character":26,"end_line":9068,"end_character":44},"updated":"2019-09-10 19:05:07.000000000","message":"assert_called_once_with","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":9065,"context_line":"            self.assertEqual(1, mock_log_error.call_count)"},{"line_number":9066,"context_line":"            self.assertIn(\u0027Network cleanup failed for destination host\u0027,"},{"line_number":9067,"context_line":"                          mock_log_error.call_args[0][0])"},{"line_number":9068,"context_line":"            drop_mig_ctxt.assert_called_with()"},{"line_number":9069,"context_line":""},{"line_number":9070,"context_line":"        _do_test()"},{"line_number":9071,"context_line":""}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_753162a2","line":9068,"range":{"start_line":9068,"start_character":26,"end_line":9068,"end_character":44},"in_reply_to":"5faad753_ea5a4d4e","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"170c421642c61c37c9e382d4ef4b84b82342183b","unresolved":false,"context_lines":[{"line_number":2858,"context_line":"                self.assertEqual(mig_data, result)"},{"line_number":2859,"context_line":"                mock_log.info.assert_called()"},{"line_number":2860,"context_line":"                self.assertThat("},{"line_number":2861,"context_line":"                    mock_log.info.call_args[0][0],"},{"line_number":2862,"context_line":"                    testtools.matchers.MatchesRegex("},{"line_number":2863,"context_line":"                        \u0027Destination was ready for NUMA live migration\u0027))"},{"line_number":2864,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":85,"id":"5faad753_1f7a72f0","line":2861,"range":{"start_line":2861,"start_character":34,"end_line":2861,"end_character":43},"updated":"2019-09-11 17:05:28.000000000","message":"This is asking for trouble because it\u0027s the args that the mock was last called with, so if someone adds another LOG.info after yours this test breaks.\n\nRather than mock LOG.info, it\u0027d be simpler to just check this way:\n\nself.assertIn(\u0027Destination was ready for NUMA live migration\u0027,\n              self.stdlog.logger.output)","commit_id":"50eede9a012a1c63cfefe7f3e8f0d75774d3d551"}],"nova/tests/unit/compute/test_resource_tracker.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"93cc9bc93da567d24945ecdc4d16734c70f1e823","unresolved":false,"context_lines":[{"line_number":3036,"context_line":"        instance \u003d objects.Instance("},{"line_number":3037,"context_line":"            vm_state\u003dvm_states.ACTIVE, task_state\u003dtask_states.MIGRATING,"},{"line_number":3038,"context_line":"            migration_context\u003dmigration_context)"},{"line_number":3039,"context_line":"        migration \u003d objects.Migration("},{"line_number":3040,"context_line":"            source_compute\u003d\u0027other-host\u0027, source_node\u003d\u0027other-node\u0027,"},{"line_number":3041,"context_line":"            dest_compute\u003d_HOSTNAME, dest_node\u003d_NODENAME,"},{"line_number":3042,"context_line":"            instance_uuid\u003duuids.instance, id\u003d1, instance\u003dinstance)"},{"line_number":3043,"context_line":"        self.rt._update_usage_from_migrations("},{"line_number":3044,"context_line":"            mock.sentinel.ctx, [migration], _NODENAME)"},{"line_number":3045,"context_line":"        mock_update_usage.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":73,"id":"7faddb67_b92c4093","line":3042,"range":{"start_line":3039,"start_character":0,"end_line":3042,"end_character":66},"updated":"2019-09-04 14:58:01.000000000","message":"Did you mean to set migration_type on this? I\u0027m guessing you think you don\u0027t need to since you moved the logic to be just based on the status, but I think it\u0027s probably good to set it to make sure we\u0027re not missing some other logic that changes behavior if the type is live, right?","commit_id":"9dce922cf0c0087e390360c23de37e1fe6ab20eb"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f26fdb06bc03288b373469d606ac3a6d7a6c24d7","unresolved":false,"context_lines":[{"line_number":3036,"context_line":"        instance \u003d objects.Instance("},{"line_number":3037,"context_line":"            vm_state\u003dvm_states.ACTIVE, task_state\u003dtask_states.MIGRATING,"},{"line_number":3038,"context_line":"            migration_context\u003dmigration_context)"},{"line_number":3039,"context_line":"        migration \u003d objects.Migration("},{"line_number":3040,"context_line":"            source_compute\u003d\u0027other-host\u0027, source_node\u003d\u0027other-node\u0027,"},{"line_number":3041,"context_line":"            dest_compute\u003d_HOSTNAME, dest_node\u003d_NODENAME,"},{"line_number":3042,"context_line":"            instance_uuid\u003duuids.instance, id\u003d1, instance\u003dinstance)"},{"line_number":3043,"context_line":"        self.rt._update_usage_from_migrations("},{"line_number":3044,"context_line":"            mock.sentinel.ctx, [migration], _NODENAME)"},{"line_number":3045,"context_line":"        mock_update_usage.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":73,"id":"7faddb67_5212befe","line":3042,"range":{"start_line":3039,"start_character":0,"end_line":3042,"end_character":66},"in_reply_to":"7faddb67_b92c4093","updated":"2019-09-04 19:29:58.000000000","message":"Ah, I see what you mean. Need to make sure nothing else in _update_usage_from_migrations is skipping because it\u0027s a live migration. Done.","commit_id":"9dce922cf0c0087e390360c23de37e1fe6ab20eb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":2864,"context_line":"class TestUpdateUsageFromMigration(test.NoDBTestCase):"},{"line_number":2865,"context_line":"    @mock.patch(\u0027nova.compute.resource_tracker.ResourceTracker.\u0027"},{"line_number":2866,"context_line":"                \u0027_get_instance_type\u0027)"},{"line_number":2867,"context_line":"    def test_unsupported_move_type(self, get_mock):"},{"line_number":2868,"context_line":"        rt \u003d resource_tracker.ResourceTracker(_HOSTNAME,"},{"line_number":2869,"context_line":"                                              mock.sentinel.virt_driver)"},{"line_number":2870,"context_line":"        migration \u003d objects.Migration(migration_type\u003d\u0027live-migration\u0027)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_8074f936","side":"PARENT","line":2867,"range":{"start_line":2867,"start_character":8,"end_line":2867,"end_character":34},"updated":"2019-09-09 18:31:38.000000000","message":"By removing this it seems you\u0027ve lost coverage for the non-live-migration / non-resize case:\n\nhttps://4512af881821b854aa29-3983523b23ff606ef29537676faa1166.ssl.cf2.rackcdn.com/634606/80/check/openstack-tox-cover/690bdc3/cover/nova_compute_resource_tracker_py.html#n1240\n\nRather than remove this test could we just change it to using an \"evacuation\" migration type?","commit_id":"3efc5268120c32803d5bd65cc949f70f2b655b42"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":2864,"context_line":"class TestUpdateUsageFromMigration(test.NoDBTestCase):"},{"line_number":2865,"context_line":"    @mock.patch(\u0027nova.compute.resource_tracker.ResourceTracker.\u0027"},{"line_number":2866,"context_line":"                \u0027_get_instance_type\u0027)"},{"line_number":2867,"context_line":"    def test_unsupported_move_type(self, get_mock):"},{"line_number":2868,"context_line":"        rt \u003d resource_tracker.ResourceTracker(_HOSTNAME,"},{"line_number":2869,"context_line":"                                              mock.sentinel.virt_driver)"},{"line_number":2870,"context_line":"        migration \u003d objects.Migration(migration_type\u003d\u0027live-migration\u0027)"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_2a52bc14","side":"PARENT","line":2867,"range":{"start_line":2867,"start_character":8,"end_line":2867,"end_character":34},"in_reply_to":"5faad753_8074f936","updated":"2019-09-10 02:18:03.000000000","message":"AFAICT this existed to test [1]. Now that is_trackable_migration is gone entirely, I\u0027m not sure what\u0027s left to test...\n\n[1] https://review.opendev.org/#/c/634606/80/nova/compute/resource_tracker.py@a1141","commit_id":"3efc5268120c32803d5bd65cc949f70f2b655b42"}],"nova/tests/unit/compute/test_rpcapi.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a9398aff3dc934fd6dceda45387497bd15322b4c","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        rpcapi.router.client.return_value \u003d mock_client"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        ctxt \u003d context.RequestContext(\u0027fake_user\u0027, \u0027fake_project\u0027),"},{"line_number":387,"context_line":"        mock_client.can_send_version.return_value \u003d False"},{"line_number":388,"context_line":"        self.assertFalse(rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":389,"context_line":"        mock_client.can_send_version.return_value \u003d True"},{"line_number":390,"context_line":"        self.assertTrue(rpcapi.supports_numa_live_migration(ctxt))"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_e344534a","line":387,"range":{"start_line":387,"start_character":8,"end_line":387,"end_character":36},"updated":"2019-09-03 21:13:00.000000000","message":"Assert this is called twice (at the end) with 5.3?","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"51431a406b88d43efb87152c3abff60010a62e42","unresolved":false,"context_lines":[{"line_number":384,"context_line":"        rpcapi.router.client.return_value \u003d mock_client"},{"line_number":385,"context_line":""},{"line_number":386,"context_line":"        ctxt \u003d context.RequestContext(\u0027fake_user\u0027, \u0027fake_project\u0027),"},{"line_number":387,"context_line":"        mock_client.can_send_version.return_value \u003d False"},{"line_number":388,"context_line":"        self.assertFalse(rpcapi.supports_numa_live_migration(ctxt))"},{"line_number":389,"context_line":"        mock_client.can_send_version.return_value \u003d True"},{"line_number":390,"context_line":"        self.assertTrue(rpcapi.supports_numa_live_migration(ctxt))"}],"source_content_type":"text/x-python","patch_set":71,"id":"7faddb67_d9c34a57","line":387,"range":{"start_line":387,"start_character":8,"end_line":387,"end_character":36},"in_reply_to":"7faddb67_e344534a","updated":"2019-09-04 00:25:46.000000000","message":"Done","commit_id":"a3cd2bff8c6202120d9462afb778117f4424a43d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        mock_client.prepare.assert_called_with(server\u003d\u0027dest\u0027, version\u003d\u00275.0\u0027,"},{"line_number":426,"context_line":"                                               call_monitor_timeout\u003dmock.ANY,"},{"line_number":427,"context_line":"                                               timeout\u003dmock.ANY)"},{"line_number":428,"context_line":"        mock_cctxt.call.assert_called_with("},{"line_number":429,"context_line":"            ctxt, \u0027check_can_live_migrate_destination\u0027,"},{"line_number":430,"context_line":"            instance\u003dself.fake_instance_obj, block_migration\u003dFalse,"},{"line_number":431,"context_line":"            disk_over_commit\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_ca2431c9","line":428,"range":{"start_line":428,"start_character":24,"end_line":428,"end_character":42},"updated":"2019-09-10 19:05:07.000000000","message":"assert_called_once_with","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":425,"context_line":"        mock_client.prepare.assert_called_with(server\u003d\u0027dest\u0027, version\u003d\u00275.0\u0027,"},{"line_number":426,"context_line":"                                               call_monitor_timeout\u003dmock.ANY,"},{"line_number":427,"context_line":"                                               timeout\u003dmock.ANY)"},{"line_number":428,"context_line":"        mock_cctxt.call.assert_called_with("},{"line_number":429,"context_line":"            ctxt, \u0027check_can_live_migrate_destination\u0027,"},{"line_number":430,"context_line":"            instance\u003dself.fake_instance_obj, block_migration\u003dFalse,"},{"line_number":431,"context_line":"            disk_over_commit\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_15282e32","line":428,"range":{"start_line":428,"start_character":24,"end_line":428,"end_character":42},"in_reply_to":"5faad753_ca2431c9","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"}],"nova/tests/unit/conductor/tasks/test_live_migrate.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"93cc9bc93da567d24945ecdc4d16734c70f1e823","unresolved":false,"context_lines":[{"line_number":281,"context_line":"                         mock_get_info.call_args_list)"},{"line_number":282,"context_line":"        mock_check.assert_called_once_with(self.context, self.instance,"},{"line_number":283,"context_line":"            self.destination, self.block_migration, self.disk_over_commit,"},{"line_number":284,"context_line":"            self.task.migration, None)"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def test_check_requested_destination_fails_with_same_dest(self):"},{"line_number":287,"context_line":"        self.task.destination \u003d \"same\""}],"source_content_type":"text/x-python","patch_set":73,"id":"7faddb67_b96440b4","line":284,"range":{"start_line":284,"start_character":33,"end_line":284,"end_character":38},"updated":"2019-09-04 14:58:01.000000000","message":"This validates that you\u0027re making the new call, but I don\u0027t see anywhere that you validate that you actually pass limits if it\u0027s returned by _find_destination() ... right?","commit_id":"9dce922cf0c0087e390360c23de37e1fe6ab20eb"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f26fdb06bc03288b373469d606ac3a6d7a6c24d7","unresolved":false,"context_lines":[{"line_number":281,"context_line":"                         mock_get_info.call_args_list)"},{"line_number":282,"context_line":"        mock_check.assert_called_once_with(self.context, self.instance,"},{"line_number":283,"context_line":"            self.destination, self.block_migration, self.disk_over_commit,"},{"line_number":284,"context_line":"            self.task.migration, None)"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def test_check_requested_destination_fails_with_same_dest(self):"},{"line_number":287,"context_line":"        self.task.destination \u003d \"same\""}],"source_content_type":"text/x-python","patch_set":73,"id":"7faddb67_72949a44","line":284,"range":{"start_line":284,"start_character":33,"end_line":284,"end_character":38},"in_reply_to":"7faddb67_b96440b4","updated":"2019-09-04 19:29:58.000000000","message":"Done","commit_id":"9dce922cf0c0087e390360c23de37e1fe6ab20eb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":266,"context_line":"            ram_allocation_ratio\u003d1.0)"},{"line_number":267,"context_line":"        mock_get_info.return_value \u003d hypervisor_details"},{"line_number":268,"context_line":"        mock_check.return_value \u003d \"migrate_data\""},{"line_number":269,"context_line":"        self.task.limits \u003d \u0027fake-limits\u0027"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        with test.nested("},{"line_number":272,"context_line":"            mock.patch.object(self.task.network_api,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_80739915","line":269,"range":{"start_line":269,"start_character":27,"end_line":269,"end_character":40},"updated":"2019-09-09 18:31:38.000000000","message":"Why not use one of your fake limits objects above?","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":266,"context_line":"            ram_allocation_ratio\u003d1.0)"},{"line_number":267,"context_line":"        mock_get_info.return_value \u003d hypervisor_details"},{"line_number":268,"context_line":"        mock_check.return_value \u003d \"migrate_data\""},{"line_number":269,"context_line":"        self.task.limits \u003d \u0027fake-limits\u0027"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        with test.nested("},{"line_number":272,"context_line":"            mock.patch.object(self.task.network_api,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_aa3d4cbc","line":269,"range":{"start_line":269,"start_character":27,"end_line":269,"end_character":40},"in_reply_to":"5faad753_80739915","updated":"2019-09-10 02:18:03.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82d0b6c04fe8d2731c27dd1b421e66822a506894","unresolved":false,"context_lines":[{"line_number":266,"context_line":"            ram_allocation_ratio\u003d1.0)"},{"line_number":267,"context_line":"        mock_get_info.return_value \u003d hypervisor_details"},{"line_number":268,"context_line":"        mock_check.return_value \u003d \"migrate_data\""},{"line_number":269,"context_line":"        self.task.limits \u003d \u0027fake-limits\u0027"},{"line_number":270,"context_line":""},{"line_number":271,"context_line":"        with test.nested("},{"line_number":272,"context_line":"            mock.patch.object(self.task.network_api,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_ef2cb648","line":269,"range":{"start_line":269,"start_character":27,"end_line":269,"end_character":40},"in_reply_to":"5faad753_80739915","updated":"2019-09-09 22:48:50.000000000","message":"most of the other example below are using fake_limits1\nso while im not really familar with these test that seam liek the correct thing to pass.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e8aea8f0ad3a088d7fbb5634c9419028474a67c","unresolved":false,"context_lines":[{"line_number":9629,"context_line":"                                      disk_available_mb\u003d1024,"},{"line_number":9630,"context_line":"                                      exception\u003dNone):"},{"line_number":9631,"context_line":"        instance \u003d objects.Instance(**self.test_instance)"},{"line_number":9632,"context_line":"        instance.numa_topology \u003d objects.InstanceNUMATopology(cells\u003d["},{"line_number":9633,"context_line":"            objects.InstanceNUMACell()])"},{"line_number":9634,"context_line":"        dest_check_data \u003d objects.LibvirtLiveMigrateData("},{"line_number":9635,"context_line":"            filename\u003d\u0027file\u0027,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_20d3c53a","line":9632,"updated":"2019-09-09 18:31:38.000000000","message":"nit: this is no longer necessary","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":9629,"context_line":"                                      disk_available_mb\u003d1024,"},{"line_number":9630,"context_line":"                                      exception\u003dNone):"},{"line_number":9631,"context_line":"        instance \u003d objects.Instance(**self.test_instance)"},{"line_number":9632,"context_line":"        instance.numa_topology \u003d objects.InstanceNUMATopology(cells\u003d["},{"line_number":9633,"context_line":"            objects.InstanceNUMACell()])"},{"line_number":9634,"context_line":"        dest_check_data \u003d objects.LibvirtLiveMigrateData("},{"line_number":9635,"context_line":"            filename\u003d\u0027file\u0027,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_6a47544d","line":9632,"in_reply_to":"5faad753_20d3c53a","updated":"2019-09-10 02:18:03.000000000","message":"Since we\u0027ve settled on limiting the scope of this series and not including the allocation-style pinning stuff, looks like it\u0027s still necessary.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82d0b6c04fe8d2731c27dd1b421e66822a506894","unresolved":false,"context_lines":[{"line_number":9629,"context_line":"                                      disk_available_mb\u003d1024,"},{"line_number":9630,"context_line":"                                      exception\u003dNone):"},{"line_number":9631,"context_line":"        instance \u003d objects.Instance(**self.test_instance)"},{"line_number":9632,"context_line":"        instance.numa_topology \u003d objects.InstanceNUMATopology(cells\u003d["},{"line_number":9633,"context_line":"            objects.InstanceNUMACell()])"},{"line_number":9634,"context_line":"        dest_check_data \u003d objects.LibvirtLiveMigrateData("},{"line_number":9635,"context_line":"            filename\u003d\u0027file\u0027,"}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_4f1b8a1a","line":9632,"in_reply_to":"5faad753_20d3c53a","updated":"2019-09-09 22:48:50.000000000","message":"because atroms code will run with non numa instances?\n\nif we remove the support fro \u003cvcpu cpuset\u003e for non numa instances we would need to keep this right? or was this unrelated?","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":9360,"context_line":"        compute_info \u003d {\u0027cpu_info\u0027: \u0027asdf\u0027, \u0027disk_available_least\u0027: 1}"},{"line_number":9361,"context_line":"        result \u003d drvr.check_can_live_migrate_destination("},{"line_number":9362,"context_line":"            self.context, instance_ref, compute_info, compute_info)"},{"line_number":9363,"context_line":"        self.assertNotIn(result, \u0027dst_supports_numa_lm\u0027)"},{"line_number":9364,"context_line":""},{"line_number":9365,"context_line":"    @mock.patch.object(libvirt_driver.LibvirtDriver,"},{"line_number":9366,"context_line":"        \u0027_create_shared_storage_test_file\u0027)"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_aadf75d4","line":9363,"range":{"start_line":9363,"start_character":8,"end_line":9363,"end_character":56},"updated":"2019-09-10 19:05:07.000000000","message":"Uh, what? Don\u0027t you mean:\n\nself.assertNotIn(\u0027dst_supports_numa_live_migration\u0027, result)","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":9360,"context_line":"        compute_info \u003d {\u0027cpu_info\u0027: \u0027asdf\u0027, \u0027disk_available_least\u0027: 1}"},{"line_number":9361,"context_line":"        result \u003d drvr.check_can_live_migrate_destination("},{"line_number":9362,"context_line":"            self.context, instance_ref, compute_info, compute_info)"},{"line_number":9363,"context_line":"        self.assertNotIn(result, \u0027dst_supports_numa_lm\u0027)"},{"line_number":9364,"context_line":""},{"line_number":9365,"context_line":"    @mock.patch.object(libvirt_driver.LibvirtDriver,"},{"line_number":9366,"context_line":"        \u0027_create_shared_storage_test_file\u0027)"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_95f09ecb","line":9363,"range":{"start_line":9363,"start_character":8,"end_line":9363,"end_character":56},"in_reply_to":"5faad753_aadf75d4","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"987cfb8787cfbf61fe269058bc9d7b5de1dde8a8","unresolved":false,"context_lines":[{"line_number":9662,"context_line":"            if numa_lm:"},{"line_number":9663,"context_line":"                self.assertTrue(ret.src_supports_numa_live_migration)"},{"line_number":9664,"context_line":"            else:"},{"line_number":9665,"context_line":"                self.assertNotIn(ret, \u0027src_supports_numa_live_migration\u0027)"},{"line_number":9666,"context_line":""},{"line_number":9667,"context_line":"        mock_is_shared.assert_called_once_with(instance, dest_check_data, None)"},{"line_number":9668,"context_line":"        mock_check_shared.assert_called_once_with(\u0027file\u0027, instance)"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_ca03d141","line":9665,"range":{"start_line":9665,"start_character":21,"end_line":9665,"end_character":32},"updated":"2019-09-10 19:05:07.000000000","message":"The order of your args is busted.","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f0c1db3f59655596a8b7e9271da76a42bfce6a79","unresolved":false,"context_lines":[{"line_number":9662,"context_line":"            if numa_lm:"},{"line_number":9663,"context_line":"                self.assertTrue(ret.src_supports_numa_live_migration)"},{"line_number":9664,"context_line":"            else:"},{"line_number":9665,"context_line":"                self.assertNotIn(ret, \u0027src_supports_numa_live_migration\u0027)"},{"line_number":9666,"context_line":""},{"line_number":9667,"context_line":"        mock_is_shared.assert_called_once_with(instance, dest_check_data, None)"},{"line_number":9668,"context_line":"        mock_check_shared.assert_called_once_with(\u0027file\u0027, instance)"}],"source_content_type":"text/x-python","patch_set":83,"id":"5faad753_b5eb5ada","line":9665,"range":{"start_line":9665,"start_character":21,"end_line":9665,"end_character":32},"in_reply_to":"5faad753_ca03d141","updated":"2019-09-11 00:04:52.000000000","message":"Done","commit_id":"808caebf89061633f6de589df31c8c973069ce73"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d6d7e6069507ccd55519f2521095a678a8da192b","unresolved":false,"context_lines":[{"line_number":9360,"context_line":"        compute_info \u003d {\u0027cpu_info\u0027: \u0027asdf\u0027, \u0027disk_available_least\u0027: 1}"},{"line_number":9361,"context_line":"        result \u003d drvr.check_can_live_migrate_destination("},{"line_number":9362,"context_line":"            self.context, instance_ref, compute_info, compute_info)"},{"line_number":9363,"context_line":"        self.assertNotIn(\u0027dst_supports_numa_lm\u0027, result)"},{"line_number":9364,"context_line":""},{"line_number":9365,"context_line":"    @mock.patch.object(libvirt_driver.LibvirtDriver,"},{"line_number":9366,"context_line":"        \u0027_create_shared_storage_test_file\u0027)"}],"source_content_type":"text/x-python","patch_set":84,"id":"5faad753_7db4d635","line":9363,"range":{"start_line":9363,"start_character":26,"end_line":9363,"end_character":46},"updated":"2019-09-11 13:33:50.000000000","message":"This is still a false positive test because this is the wrong field name, it should be dst_supports_numa_live_migration like above.","commit_id":"bb29abff94456ebf7484e94fb685c027a75884bf"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3104f275bb3e4bf14d4a718374222cb062c569ce","unresolved":false,"context_lines":[{"line_number":9360,"context_line":"        compute_info \u003d {\u0027cpu_info\u0027: \u0027asdf\u0027, \u0027disk_available_least\u0027: 1}"},{"line_number":9361,"context_line":"        result \u003d drvr.check_can_live_migrate_destination("},{"line_number":9362,"context_line":"            self.context, instance_ref, compute_info, compute_info)"},{"line_number":9363,"context_line":"        self.assertNotIn(\u0027dst_supports_numa_lm\u0027, result)"},{"line_number":9364,"context_line":""},{"line_number":9365,"context_line":"    @mock.patch.object(libvirt_driver.LibvirtDriver,"},{"line_number":9366,"context_line":"        \u0027_create_shared_storage_test_file\u0027)"}],"source_content_type":"text/x-python","patch_set":84,"id":"5faad753_d3705ba8","line":9363,"range":{"start_line":9363,"start_character":26,"end_line":9363,"end_character":46},"in_reply_to":"5faad753_10002901","updated":"2019-09-11 14:59:16.000000000","message":"This, and the accuracy of the log message in check.*dest() is why I feel like we should just set it \u003dTrue/False if we\u0027re new enough, and if it\u0027s false we know that it\u0027s disabled by pinning and not lack of support. But it\u0027s really not a big deal and definitely don\u0027t think we should change it now.\n\nMaybe o.vo should raise exception if you run its __contains__ with a non-field value...","commit_id":"bb29abff94456ebf7484e94fb685c027a75884bf"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"95ddeda9c388ad709257717cb8f6deec31879808","unresolved":false,"context_lines":[{"line_number":9360,"context_line":"        compute_info \u003d {\u0027cpu_info\u0027: \u0027asdf\u0027, \u0027disk_available_least\u0027: 1}"},{"line_number":9361,"context_line":"        result \u003d drvr.check_can_live_migrate_destination("},{"line_number":9362,"context_line":"            self.context, instance_ref, compute_info, compute_info)"},{"line_number":9363,"context_line":"        self.assertNotIn(\u0027dst_supports_numa_lm\u0027, result)"},{"line_number":9364,"context_line":""},{"line_number":9365,"context_line":"    @mock.patch.object(libvirt_driver.LibvirtDriver,"},{"line_number":9366,"context_line":"        \u0027_create_shared_storage_test_file\u0027)"}],"source_content_type":"text/x-python","patch_set":84,"id":"5faad753_10002901","line":9363,"range":{"start_line":9363,"start_character":26,"end_line":9363,"end_character":46},"in_reply_to":"5faad753_7db4d635","updated":"2019-09-11 14:00:23.000000000","message":"Done","commit_id":"bb29abff94456ebf7484e94fb685c027a75884bf"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e590e7b9ba28c132ddf11be77c7d00a0aafbafc5","unresolved":false,"context_lines":[{"line_number":7463,"context_line":"        # already been loaded at the API layer via expected_attrs (but it may"},{"line_number":7464,"context_line":"        # be None)."},{"line_number":7465,"context_line":"        if instance.numa_topology:"},{"line_number":7466,"context_line":"            LOG.debug(\u0027Instance has a NUMA topology, preparing for NUMA \u0027"},{"line_number":7467,"context_line":"                      \u0027live migration\u0027)"},{"line_number":7468,"context_line":"            dest_check_data.instance_numa_topology \u003d instance.numa_topology"},{"line_number":7469,"context_line":""},{"line_number":7470,"context_line":"        return dest_check_data"}],"source_content_type":"text/x-python","patch_set":50,"id":"7faddb67_35fb937b","line":7467,"range":{"start_line":7466,"start_character":67,"end_line":7467,"end_character":37},"updated":"2019-08-16 18:31:47.000000000","message":"I know we talk about \"NUMA live migration\" as if it\u0027s a feature, but really, we\u0027re just filling in the gaps. This wording makes it sound like \"This instance uses NUMA, so we\u0027re going to do this OTHER thing, called NUMA live migration, which is different and stuff\".","commit_id":"b48455254ea565894b18d189426b8cf77ca5e66e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"33c558c9af0058974f5d2320f20c11f8c45ae660","unresolved":false,"context_lines":[{"line_number":7480,"context_line":"        if instance.numa_topology:"},{"line_number":7481,"context_line":"            LOG.debug(\u0027Instance has a NUMA topology, preparing for NUMA \u0027"},{"line_number":7482,"context_line":"                      \u0027live migration\u0027)"},{"line_number":7483,"context_line":"            dest_check_data.instance_numa_topology \u003d instance.numa_topology"},{"line_number":7484,"context_line":""},{"line_number":7485,"context_line":"        return dest_check_data"},{"line_number":7486,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"7faddb67_a0102dad","line":7483,"updated":"2019-08-23 16:03:31.000000000","message":"Per my comment earlier in the set -- why do we need to duplicate this in the migrate data if the other side can get it from the db just as easy (and/or may already have it on their instance object) ?","commit_id":"091eb3d68b454730ee315b3ccc2c9316fcfab1ee"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d9613ff3096bd2dc351e5dac1270b86693d95d2a","unresolved":false,"context_lines":[{"line_number":7480,"context_line":"        if instance.numa_topology:"},{"line_number":7481,"context_line":"            LOG.debug(\u0027Instance has a NUMA topology, preparing for NUMA \u0027"},{"line_number":7482,"context_line":"                      \u0027live migration\u0027)"},{"line_number":7483,"context_line":"            dest_check_data.instance_numa_topology \u003d instance.numa_topology"},{"line_number":7484,"context_line":""},{"line_number":7485,"context_line":"        return dest_check_data"},{"line_number":7486,"context_line":""}],"source_content_type":"text/x-python","patch_set":51,"id":"7faddb67_b3b2c605","line":7483,"in_reply_to":"7faddb67_a0102dad","updated":"2019-08-23 21:26:51.000000000","message":"Yeah, but we need some way to signal to the destination that the source can perform a NUMA live migration. I recall checking the service version as being fragile, so this was decided instead.","commit_id":"091eb3d68b454730ee315b3ccc2c9316fcfab1ee"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"944a0690ec65b8600443660daf3a4189531438d4","unresolved":false,"context_lines":[{"line_number":7459,"context_line":"        # TODO(artom) Used to indicate that the source can perform a NUMA-aware"},{"line_number":7460,"context_line":"        # live migration. instance.numa_topology will be present as it has"},{"line_number":7461,"context_line":"        # already been loaded at the API layer via expected_attrs (but it may"},{"line_number":7462,"context_line":"        # be None). Can be removed in U."},{"line_number":7463,"context_line":"        if instance.numa_topology:"},{"line_number":7464,"context_line":"            LOG.debug(\u0027Instance has a NUMA topology, preparing for NUMA \u0027"},{"line_number":7465,"context_line":"                      \u0027live migration\u0027)"}],"source_content_type":"text/x-python","patch_set":58,"id":"7faddb67_a4e7b3e3","line":7462,"range":{"start_line":7462,"start_character":20,"end_line":7462,"end_character":40},"updated":"2019-08-27 13:53:05.000000000","message":"Why? I don\u0027t see any API behavioral (southbound) change in this, so I\u0027m not sure why this check tells us anything. And, I\u0027m not sure why it can be removed in U. Can you elaborate here?","commit_id":"46c87fe369a6591eaaf67093e9e338b794f45458"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"d21d7e3d72480efe5111b37373fa8ac09d6edabe","unresolved":false,"context_lines":[{"line_number":7459,"context_line":"        # TODO(artom) Used to indicate that the source can perform a NUMA-aware"},{"line_number":7460,"context_line":"        # live migration. instance.numa_topology will be present as it has"},{"line_number":7461,"context_line":"        # already been loaded at the API layer via expected_attrs (but it may"},{"line_number":7462,"context_line":"        # be None). Can be removed in U."},{"line_number":7463,"context_line":"        if instance.numa_topology:"},{"line_number":7464,"context_line":"            LOG.debug(\u0027Instance has a NUMA topology, preparing for NUMA \u0027"},{"line_number":7465,"context_line":"                      \u0027live migration\u0027)"}],"source_content_type":"text/x-python","patch_set":58,"id":"7faddb67_8205c4c3","line":7462,"range":{"start_line":7462,"start_character":20,"end_line":7462,"end_character":40},"in_reply_to":"7faddb67_a4e7b3e3","updated":"2019-08-27 16:56:49.000000000","message":"I think the TODO was in the wrong place. Moved it inside the if to better explain what was happening.","commit_id":"46c87fe369a6591eaaf67093e9e338b794f45458"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"55b9376b6d09e591ee73090d22357cae0090edf3","unresolved":false,"context_lines":[{"line_number":7467,"context_line":"            # can perform a NUMA-aware live migration. NUMA-aware live"},{"line_number":7468,"context_line":"            # migration will become unconditionally supported in RPC 6.0, so"},{"line_number":7469,"context_line":"            # this sentinel can be removed then."},{"line_number":7470,"context_line":"            dest_check_data.src_supports_numa_live_migration \u003d True"},{"line_number":7471,"context_line":""},{"line_number":7472,"context_line":"        return dest_check_data"},{"line_number":7473,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"7faddb67_47a6c156","line":7470,"updated":"2019-08-30 14:32:48.000000000","message":"This isn\u0027t really related to RPC version 5.2. We will set this on the object, and if both hosts support the newer object with this field, then it will pass between them without any problem. Even if we *do* both support it, the RPC layer won\u0027t let you make your new call if the pin is set low enough, so you need to make sure to check that before either side does the new thing, in case you have to revert and then can\u0027t call your new drop method.","commit_id":"12156aaaece3b163ee69dd2b797379a1d9400544"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"b857cdf983c048bb97d0cd3475102d5ada46616d","unresolved":false,"context_lines":[{"line_number":7467,"context_line":"            # can perform a NUMA-aware live migration. NUMA-aware live"},{"line_number":7468,"context_line":"            # migration will become unconditionally supported in RPC 6.0, so"},{"line_number":7469,"context_line":"            # this sentinel can be removed then."},{"line_number":7470,"context_line":"            dest_check_data.src_supports_numa_live_migration \u003d True"},{"line_number":7471,"context_line":""},{"line_number":7472,"context_line":"        return dest_check_data"},{"line_number":7473,"context_line":""}],"source_content_type":"text/x-python","patch_set":62,"id":"7faddb67_4abc85ba","line":7470,"in_reply_to":"7faddb67_47a6c156","updated":"2019-08-30 18:19:53.000000000","message":"See previous comment.","commit_id":"12156aaaece3b163ee69dd2b797379a1d9400544"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"93cc9bc93da567d24945ecdc4d16734c70f1e823","unresolved":false,"context_lines":[{"line_number":7468,"context_line":"            # can perform a NUMA-aware live migration. NUMA-aware live"},{"line_number":7469,"context_line":"            # migration will become unconditionally supported in RPC 6.0, so"},{"line_number":7470,"context_line":"            # this sentinel can be removed then."},{"line_number":7471,"context_line":"            dest_check_data.src_supports_numa_live_migration \u003d True"},{"line_number":7472,"context_line":""},{"line_number":7473,"context_line":"        return dest_check_data"},{"line_number":7474,"context_line":""}],"source_content_type":"text/x-python","patch_set":73,"id":"7faddb67_d9f81cc5","line":7471,"updated":"2019-09-04 14:58:01.000000000","message":"There\u0027s no unit test for this.","commit_id":"9dce922cf0c0087e390360c23de37e1fe6ab20eb"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"f26fdb06bc03288b373469d606ac3a6d7a6c24d7","unresolved":false,"context_lines":[{"line_number":7468,"context_line":"            # can perform a NUMA-aware live migration. NUMA-aware live"},{"line_number":7469,"context_line":"            # migration will become unconditionally supported in RPC 6.0, so"},{"line_number":7470,"context_line":"            # this sentinel can be removed then."},{"line_number":7471,"context_line":"            dest_check_data.src_supports_numa_live_migration \u003d True"},{"line_number":7472,"context_line":""},{"line_number":7473,"context_line":"        return dest_check_data"},{"line_number":7474,"context_line":""}],"source_content_type":"text/x-python","patch_set":73,"id":"7faddb67_b2945237","line":7471,"in_reply_to":"7faddb67_d9f81cc5","updated":"2019-09-04 19:29:58.000000000","message":"Done","commit_id":"9dce922cf0c0087e390360c23de37e1fe6ab20eb"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0f595579452fcf6f00099a624cda81f14118e88c","unresolved":false,"context_lines":[{"line_number":7461,"context_line":"        # default to True here for all computes \u003e\u003d Queens."},{"line_number":7462,"context_line":"        dest_check_data.src_supports_native_luks \u003d True"},{"line_number":7463,"context_line":""},{"line_number":7464,"context_line":"        if instance.numa_topology:"},{"line_number":7465,"context_line":"            LOG.debug(\u0027Instance has a NUMA topology, preparing for NUMA \u0027"},{"line_number":7466,"context_line":"                      \u0027live migration\u0027)"},{"line_number":7467,"context_line":"            # TODO(artom) Set to indicate that the source (us)"}],"source_content_type":"text/x-python","patch_set":75,"id":"7faddb67_70a31600","line":7464,"updated":"2019-09-05 20:57:42.000000000","message":"Why do we even need this in the driver? I guess it\u0027s so that we\u0027re saying this driver supports it but that doesn\u0027t mean some other driver, like hyper-v, does.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"7366991691163d1a836262d728d7e81aa9819d16","unresolved":false,"context_lines":[{"line_number":7461,"context_line":"        # default to True here for all computes \u003e\u003d Queens."},{"line_number":7462,"context_line":"        dest_check_data.src_supports_native_luks \u003d True"},{"line_number":7463,"context_line":""},{"line_number":7464,"context_line":"        if instance.numa_topology:"},{"line_number":7465,"context_line":"            LOG.debug(\u0027Instance has a NUMA topology, preparing for NUMA \u0027"},{"line_number":7466,"context_line":"                      \u0027live migration\u0027)"},{"line_number":7467,"context_line":"            # TODO(artom) Set to indicate that the source (us)"}],"source_content_type":"text/x-python","patch_set":75,"id":"5faad753_1c4adb26","line":7464,"in_reply_to":"7faddb67_70a31600","updated":"2019-09-06 16:44:40.000000000","message":"It\u0027s gone - even if the instance has no NUMA topology, we might need to update its allocation-style CPU pinning, see my -1 on the previous patch.","commit_id":"9ab751ebf78cad707db59d9c7ccbc54f3416533c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a2d7514a4719dae4027bfad915c7b84a3c1afa0f","unresolved":false,"context_lines":[{"line_number":7460,"context_line":"        # NUMA-aware live migration. NUMA-aware live migration will become"},{"line_number":7461,"context_line":"        # unconditionally supported in RPC 6.0, so this sentinel can be removed"},{"line_number":7462,"context_line":"        # then."},{"line_number":7463,"context_line":"        dest_check_data.src_supports_numa_live_migration \u003d True"},{"line_number":7464,"context_line":""},{"line_number":7465,"context_line":"        return dest_check_data"},{"line_number":7466,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_80e39933","line":7463,"updated":"2019-09-09 18:08:49.000000000","message":"Based on your previous reply, would it also be good to mention that this is also needed to live migration CPU pinned instances that don\u0027t have a numa topology?\n\n\u003e even if the instance has no NUMA topology, we might\n\u003e need to update its allocation-style CPU pinning","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"bce55aa2428cce4a5d8dba51be70dffd7080ccfc","unresolved":false,"context_lines":[{"line_number":7460,"context_line":"        # NUMA-aware live migration. NUMA-aware live migration will become"},{"line_number":7461,"context_line":"        # unconditionally supported in RPC 6.0, so this sentinel can be removed"},{"line_number":7462,"context_line":"        # then."},{"line_number":7463,"context_line":"        dest_check_data.src_supports_numa_live_migration \u003d True"},{"line_number":7464,"context_line":""},{"line_number":7465,"context_line":"        return dest_check_data"},{"line_number":7466,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_a5249f0e","line":7463,"in_reply_to":"5faad753_430b6b8d","updated":"2019-09-10 02:18:03.000000000","message":"So since we finally decided to omit the allocation-style pinning from this series, this needs to go back under an if instance.numa_topology","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"82d0b6c04fe8d2731c27dd1b421e66822a506894","unresolved":false,"context_lines":[{"line_number":7460,"context_line":"        # NUMA-aware live migration. NUMA-aware live migration will become"},{"line_number":7461,"context_line":"        # unconditionally supported in RPC 6.0, so this sentinel can be removed"},{"line_number":7462,"context_line":"        # then."},{"line_number":7463,"context_line":"        dest_check_data.src_supports_numa_live_migration \u003d True"},{"line_number":7464,"context_line":""},{"line_number":7465,"context_line":"        return dest_check_data"},{"line_number":7466,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_af0f9e2c","line":7463,"in_reply_to":"5faad753_430b6b8d","updated":"2019-09-09 22:48:50.000000000","message":"i mentioned this on irc but the only dirver the supportc cpu pinning is the libvirt driver and it as an internal impelemantion detail chose to make all instance with cpu pinning (hs:cpu_policy\u003ddedicated) have a single numa node unless you explcitly request multiple numa nodes.\n\nso if it has cpu pinning enabled it has a numa toplogy.\n\nthere are case where we soft pin instnace to float over a set of cores but that is a sperate thing to hw:cpu_policy\u003ddedicated.","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"ccf745a6e07ed7893e61176950c03da4ffa135e0","unresolved":false,"context_lines":[{"line_number":7460,"context_line":"        # NUMA-aware live migration. NUMA-aware live migration will become"},{"line_number":7461,"context_line":"        # unconditionally supported in RPC 6.0, so this sentinel can be removed"},{"line_number":7462,"context_line":"        # then."},{"line_number":7463,"context_line":"        dest_check_data.src_supports_numa_live_migration \u003d True"},{"line_number":7464,"context_line":""},{"line_number":7465,"context_line":"        return dest_check_data"},{"line_number":7466,"context_line":""}],"source_content_type":"text/x-python","patch_set":80,"id":"5faad753_430b6b8d","line":7463,"in_reply_to":"5faad753_80e39933","updated":"2019-09-09 19:34:06.000000000","message":"Done","commit_id":"652c09f888b68071fd9c1d4b9370c00029dd13d1"}]}
