)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e858f0644e81a70e2b287b847c0b7a18ea0d9900","unresolved":false,"context_lines":[{"line_number":20,"context_line":"fails, it will not break the cleanup procedure on source host. Since the"},{"line_number":21,"context_line":"VM is already on dest host when we in _post_live_migration, we won\u0027t bring it"},{"line_number":22,"context_line":"back to source host for anything wrong happening on dest host cleanup. Besides,"},{"line_number":23,"context_line":"driver.cleanup shouldn\u0027t care aboout where it is called, it should be allowed to"},{"line_number":24,"context_line":"be invoked everywhere. So we move driver.cleanup on source host before rpc call"},{"line_number":25,"context_line":"post_live_migration_at_destination, the migration_context has not been applied"},{"line_number":26,"context_line":"yet at that time, we can cleanup vpmem based on instance obj."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"df33271e_8970a6de","line":23,"range":{"start_line":23,"start_character":30,"end_line":23,"end_character":36},"updated":"2020-03-26 16:08:49.000000000","message":"about","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e858f0644e81a70e2b287b847c0b7a18ea0d9900","unresolved":false,"context_lines":[{"line_number":16,"context_line":"   live migration"},{"line_number":17,"context_line":"5. cleanup vpmems on src/dest when live migration succeeds/fails"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"In _post_live_migration, even if post_live_migration_at_destination rpc call"},{"line_number":20,"context_line":"fails, it will not break the cleanup procedure on source host. Since the"},{"line_number":21,"context_line":"VM is already on dest host when we in _post_live_migration, we won\u0027t bring it"},{"line_number":22,"context_line":"back to source host for anything wrong happening on dest host cleanup. Besides,"},{"line_number":23,"context_line":"driver.cleanup shouldn\u0027t care aboout where it is called, it should be allowed to"},{"line_number":24,"context_line":"be invoked everywhere. So we move driver.cleanup on source host before rpc call"},{"line_number":25,"context_line":"post_live_migration_at_destination, the migration_context has not been applied"},{"line_number":26,"context_line":"yet at that time, we can cleanup vpmem based on instance obj."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: I5c346e690148678a2f0dc63f4f516a944c3db8cd"},{"line_number":29,"context_line":"Implements: blueprint support-live-migration-with-virtual-persistent-memory"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"df33271e_c9710ee1","line":26,"range":{"start_line":19,"start_character":0,"end_line":26,"end_character":61},"updated":"2020-03-26 16:08:49.000000000","message":"Can you rephrase this? It\u0027s not clear to me what you\u0027re trying to say. Are you saying that you\u0027ve moved the call to \u0027driver.cleanup\u0027 from the destination host to the source host?\n\nLater: okay, after seeing [1] I realise you\u0027re saying that you moved the call to \u0027driver.cleanup\u0027 to occur before the RPC call \u0027post_live_migration_at_destination\u0027. This is still confusing though and should be reworded and maybe split into a separate patch\n\n[1] https://review.opendev.org/#/c/687856/20/nova/compute/manager.py@8362","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"85e7778e2b15f6e2f6d1458f6cce0418eb13fce6","unresolved":false,"context_lines":[{"line_number":16,"context_line":"   live migration"},{"line_number":17,"context_line":"5. cleanup vpmems on src/dest when live migration succeeds/fails"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"In _post_live_migration, even if post_live_migration_at_destination rpc call"},{"line_number":20,"context_line":"fails, it will not break the cleanup procedure on source host. Since the"},{"line_number":21,"context_line":"VM is already on dest host when we in _post_live_migration, we won\u0027t bring it"},{"line_number":22,"context_line":"back to source host for anything wrong happening on dest host cleanup. Besides,"},{"line_number":23,"context_line":"driver.cleanup shouldn\u0027t care aboout where it is called, it should be allowed to"},{"line_number":24,"context_line":"be invoked everywhere. So we move driver.cleanup on source host before rpc call"},{"line_number":25,"context_line":"post_live_migration_at_destination, the migration_context has not been applied"},{"line_number":26,"context_line":"yet at that time, we can cleanup vpmem based on instance obj."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: I5c346e690148678a2f0dc63f4f516a944c3db8cd"},{"line_number":29,"context_line":"Implements: blueprint support-live-migration-with-virtual-persistent-memory"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"df33271e_e1085dda","line":26,"range":{"start_line":19,"start_character":0,"end_line":26,"end_character":61},"in_reply_to":"df33271e_7e606c02","updated":"2020-03-27 09:18:29.000000000","message":"About the change on _post_live_migration, I just tried to explain it has no negative effect. I think it shouldn\u0027t be in commit message since it involves too much implementation details, so I just state that why I need to modify it now.","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"59443995d378b81cd2b290025d2b82403e1d1fc6","unresolved":false,"context_lines":[{"line_number":16,"context_line":"   live migration"},{"line_number":17,"context_line":"5. cleanup vpmems on src/dest when live migration succeeds/fails"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"In _post_live_migration, even if post_live_migration_at_destination rpc call"},{"line_number":20,"context_line":"fails, it will not break the cleanup procedure on source host. Since the"},{"line_number":21,"context_line":"VM is already on dest host when we in _post_live_migration, we won\u0027t bring it"},{"line_number":22,"context_line":"back to source host for anything wrong happening on dest host cleanup. Besides,"},{"line_number":23,"context_line":"driver.cleanup shouldn\u0027t care aboout where it is called, it should be allowed to"},{"line_number":24,"context_line":"be invoked everywhere. So we move driver.cleanup on source host before rpc call"},{"line_number":25,"context_line":"post_live_migration_at_destination, the migration_context has not been applied"},{"line_number":26,"context_line":"yet at that time, we can cleanup vpmem based on instance obj."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: I5c346e690148678a2f0dc63f4f516a944c3db8cd"},{"line_number":29,"context_line":"Implements: blueprint support-live-migration-with-virtual-persistent-memory"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"df33271e_7e606c02","line":26,"range":{"start_line":19,"start_character":0,"end_line":26,"end_character":61},"in_reply_to":"df33271e_c9710ee1","updated":"2020-03-27 09:04:41.000000000","message":"Done","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9eb8787ad70aea61d6d9752a71217e0466738fa8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     LuyaoZhong \u003cluyao.zhong@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2020-04-01 03:06:59 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"support live migration with vpmem"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"1. Check if the cluster supports live migration with vpmem"},{"line_number":10,"context_line":"2. On source host we generate new dest xml with vpmem info stored in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"df33271e_28688b85","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":1},"updated":"2020-04-07 10:47:29.000000000","message":"S","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6182b523f35d9ed2fa2066c81d896014a2860346","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     LuyaoZhong \u003cluyao.zhong@intel.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2020-04-01 03:06:59 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"support live migration with vpmem"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"1. Check if the cluster supports live migration with vpmem"},{"line_number":10,"context_line":"2. On source host we generate new dest xml with vpmem info stored in"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"df33271e_93610c3d","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":1},"in_reply_to":"df33271e_28688b85","updated":"2020-04-07 13:15:10.000000000","message":"Done","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"}],"nova/compute/manager.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"56ccf989084348fc60b0c07691d7164ec19ddef4","unresolved":false,"context_lines":[{"line_number":8620,"context_line":"                phase\u003dfields.NotificationPhase.START,"},{"line_number":8621,"context_line":"                bdms\u003dbdms)"},{"line_number":8622,"context_line":""},{"line_number":8623,"context_line":"        do_cleanup, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":8624,"context_line":"                migrate_data)"},{"line_number":8625,"context_line":""},{"line_number":8626,"context_line":"        if do_cleanup:"},{"line_number":8627,"context_line":"            self.compute_rpcapi.rollback_live_migration_at_destination("}],"source_content_type":"text/x-python","patch_set":10,"id":"1fa4df85_ef3f6822","line":8624,"range":{"start_line":8623,"start_character":8,"end_line":8624,"end_character":29},"updated":"2020-03-05 07:15:50.000000000","message":"I understand that you add the new rpc method \u0027cleanup_specific_resource\u0027 due to the \u0027do_cleanup\u0027 flag. If the `do_cleanup` is false, then \u0027rollback_live_migration_at_destination\u0027 won\u0027t be call. Then the normal cleanup code path for vpmem won\u0027t be trigger.\n\nBut I check the code, we only set the do_cleanup as false when the instance path is shared between hosts.\n\nAs my understand, if the instance path is shared, that means we shouldn\u0027t cleanup the target/source instance path. But that code path is already controlled by \u0027destroy_disks\u0027 flag:\nhttps://github.com/openstack/nova/blob/master/nova/virt/libvirt/driver.py#L1346-L1352\n\nOther then destory_disks controlled code path, the driver.cleanup is about undefine the domain, disconnect volume, destory vif. So I\u0027m thinking even if the instance path is shared, we still need to cleanup those things. So I\u0027m thinking \u0027do_cleanup\u0027 flag maybe wrong at here, whatever we should call \u0027rollback_live_migration_at_destination\u0027. And then we can cleanup the vpmem. Then we needn\u0027t that extra rpc call.","commit_id":"a68fce989912412097c06bfbb2fa7808cc3db31b"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"1bbf89dde79f1f8630a682702f218b546afcb026","unresolved":false,"context_lines":[{"line_number":8620,"context_line":"                phase\u003dfields.NotificationPhase.START,"},{"line_number":8621,"context_line":"                bdms\u003dbdms)"},{"line_number":8622,"context_line":""},{"line_number":8623,"context_line":"        do_cleanup, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":8624,"context_line":"                migrate_data)"},{"line_number":8625,"context_line":""},{"line_number":8626,"context_line":"        if do_cleanup:"},{"line_number":8627,"context_line":"            self.compute_rpcapi.rollback_live_migration_at_destination("}],"source_content_type":"text/x-python","patch_set":10,"id":"1fa4df85_998b74c1","line":8624,"range":{"start_line":8623,"start_character":8,"end_line":8624,"end_character":29},"in_reply_to":"1fa4df85_728033c0","updated":"2020-03-09 03:07:57.000000000","message":"Thanks for your comments, Alex Xu and Lee Yarwood.\nI look into the code path and agree with your suggestion. I\u0027ll remove the do_cleanup check in next patch version, and test the functionality.","commit_id":"a68fce989912412097c06bfbb2fa7808cc3db31b"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"601c9e54e39a22883aa041b3e308d757001243b5","unresolved":false,"context_lines":[{"line_number":8620,"context_line":"                phase\u003dfields.NotificationPhase.START,"},{"line_number":8621,"context_line":"                bdms\u003dbdms)"},{"line_number":8622,"context_line":""},{"line_number":8623,"context_line":"        do_cleanup, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":8624,"context_line":"                migrate_data)"},{"line_number":8625,"context_line":""},{"line_number":8626,"context_line":"        if do_cleanup:"},{"line_number":8627,"context_line":"            self.compute_rpcapi.rollback_live_migration_at_destination("}],"source_content_type":"text/x-python","patch_set":10,"id":"1fa4df85_728033c0","line":8624,"range":{"start_line":8623,"start_character":8,"end_line":8624,"end_character":29},"in_reply_to":"1fa4df85_ef3f6822","updated":"2020-03-05 17:51:49.000000000","message":"L8602-8613 will handle cleaning up volumes on the dest.\n\nIt does look like we are missing logic to cleanup VIFs outside of rollback_live_migration_at_destination.\n\nFor the Libvirt driver at least I believe libvirtd on the dest should handle the removal of the domain if the migration was not successful [1][2]. There might be corner cases to that so maybe calling rollback_live_migration_at_destination regardless of the value of do_cleanup is the correct thing to do here?\n\n[1]https://github.com/openstack/nova/blob/19cbbbebddadb125b8123ce0350b7146b29a59c6/nova/virt/libvirt/driver.py#L913-L915\n[2]https://github.com/openstack/nova/blob/19cbbbebddadb125b8123ce0350b7146b29a59c6/nova/virt/libvirt/guest.py#L609-L611","commit_id":"a68fce989912412097c06bfbb2fa7808cc3db31b"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"69990d7a9e9391d1e7c5bd2cca095df2f42f2360","unresolved":false,"context_lines":[{"line_number":8358,"context_line":"            LOG.exception(\"Post live migration at destination %s failed\","},{"line_number":8359,"context_line":"                          dest, instance\u003dinstance, error\u003derror)"},{"line_number":8360,"context_line":""},{"line_number":8361,"context_line":"        do_cleanup, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":8362,"context_line":"                migrate_data)"},{"line_number":8363,"context_line":""},{"line_number":8364,"context_line":"        if do_cleanup:"},{"line_number":8365,"context_line":"            # NOTE(artom) By this time post_live_migration_at_destination()"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_db074018","line":8362,"range":{"start_line":8361,"start_character":7,"end_line":8362,"end_character":29},"updated":"2020-03-14 09:29:25.000000000","message":"we can return do_cleanup as true for libvirt vritdriver. Then we needn\u0027t \u0027cleanup_specific_resources\u0027 method.","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d2d6ca4fb9f93320d36fb98f57ba39495b978ec4","unresolved":false,"context_lines":[{"line_number":8358,"context_line":"            LOG.exception(\"Post live migration at destination %s failed\","},{"line_number":8359,"context_line":"                          dest, instance\u003dinstance, error\u003derror)"},{"line_number":8360,"context_line":""},{"line_number":8361,"context_line":"        do_cleanup, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":8362,"context_line":"                migrate_data)"},{"line_number":8363,"context_line":""},{"line_number":8364,"context_line":"        if do_cleanup:"},{"line_number":8365,"context_line":"            # NOTE(artom) By this time post_live_migration_at_destination()"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_ba911549","line":8362,"range":{"start_line":8361,"start_character":7,"end_line":8362,"end_character":29},"in_reply_to":"1fa4df85_516c8c07","updated":"2020-03-16 11:07:58.000000000","message":"patch set v12 gives a possible solution to address the \u0027do_cleanup\u0027 flag issue.","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"746062a5aa61f9f50ef6541fec7a1eeff2ed7e0e","unresolved":false,"context_lines":[{"line_number":8358,"context_line":"            LOG.exception(\"Post live migration at destination %s failed\","},{"line_number":8359,"context_line":"                          dest, instance\u003dinstance, error\u003derror)"},{"line_number":8360,"context_line":""},{"line_number":8361,"context_line":"        do_cleanup, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":8362,"context_line":"                migrate_data)"},{"line_number":8363,"context_line":""},{"line_number":8364,"context_line":"        if do_cleanup:"},{"line_number":8365,"context_line":"            # NOTE(artom) By this time post_live_migration_at_destination()"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_516c8c07","line":8362,"range":{"start_line":8361,"start_character":7,"end_line":8362,"end_character":29},"in_reply_to":"1fa4df85_db074018","updated":"2020-03-16 07:53:39.000000000","message":"I tried your suggestion, this may have chain reaction:\n1. it seems like all existing testcases do not cover the case that do_cleanup is True.\n2. if I set the do_cleanup True, it causes unittests and functional testcases failed. Espectialy for functional test, such as notification test, since we refresh the instance obj if do_cleanup is True, the instance host and node is updated to dest host/node, also the migration status is changed, so the notification we get can\u0027t match sample, should we change the sample to match the code or change the code to match the sample?\n\nI\u0027m thinking about we may do these in another seperate patch. As I state above, we still need the \u0027cleanup_specific_resources\u0027, so we can use it here for now.","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"7b9901b42bbe937fade2b244329e86d2a401d2bd","unresolved":false,"context_lines":[{"line_number":8358,"context_line":"            LOG.exception(\"Post live migration at destination %s failed\","},{"line_number":8359,"context_line":"                          dest, instance\u003dinstance, error\u003derror)"},{"line_number":8360,"context_line":""},{"line_number":8361,"context_line":"        do_cleanup, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":8362,"context_line":"                migrate_data)"},{"line_number":8363,"context_line":""},{"line_number":8364,"context_line":"        if do_cleanup:"},{"line_number":8365,"context_line":"            # NOTE(artom) By this time post_live_migration_at_destination()"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_ce20dbfa","line":8362,"range":{"start_line":8361,"start_character":7,"end_line":8362,"end_character":29},"in_reply_to":"1fa4df85_db074018","updated":"2020-03-16 03:12:02.000000000","message":"Yes for here, but we need this method in https://review.opendev.org/#/c/678451/8/nova/compute/manager.py@10280.","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"11954cc501cd31522b3a7e1b653a6a19ee9890fb","unresolved":false,"context_lines":[{"line_number":8668,"context_line":"                phase\u003dfields.NotificationPhase.START,"},{"line_number":8669,"context_line":"                bdms\u003dbdms)"},{"line_number":8670,"context_line":""},{"line_number":8671,"context_line":"        _, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":8672,"context_line":"                migrate_data)"},{"line_number":8673,"context_line":""},{"line_number":8674,"context_line":"        # NOTE(luyao): Invoke rollback_live_migration_at_destination regardless"},{"line_number":8675,"context_line":"        # of \u0027do_cleanup\u0027 value in _live_migration_cleanup_flags. \u0027do_cleanup\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_98230ebf","line":8672,"range":{"start_line":8671,"start_character":7,"end_line":8672,"end_character":29},"updated":"2020-03-14 09:05:41.000000000","message":"I\u0027m not sure we should ignore do_cleanup for all the virt driver. My previous comment is about libvirt. At least I think we should return True for do_cleanup always for the libvirt virt driver. Sorry, I didn\u0027t clear about that.","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"e56193205dbc1c146a154afadce4c953e063a31b","unresolved":false,"context_lines":[{"line_number":8668,"context_line":"                phase\u003dfields.NotificationPhase.START,"},{"line_number":8669,"context_line":"                bdms\u003dbdms)"},{"line_number":8670,"context_line":""},{"line_number":8671,"context_line":"        _, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":8672,"context_line":"                migrate_data)"},{"line_number":8673,"context_line":""},{"line_number":8674,"context_line":"        # NOTE(luyao): Invoke rollback_live_migration_at_destination regardless"},{"line_number":8675,"context_line":"        # of \u0027do_cleanup\u0027 value in _live_migration_cleanup_flags. \u0027do_cleanup\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_d41b8a70","line":8672,"range":{"start_line":8671,"start_character":7,"end_line":8672,"end_character":29},"in_reply_to":"1fa4df85_0ecb5353","updated":"2020-03-16 08:15:03.000000000","message":"Since the \u0027do_cleanup\u0027 flag I stated, I check it again. I don\u0027t know why we don\u0027t need to invoke the rollback_live_migration_at_destination(do_cleanup is False as default), I think at least invoking this method does not trigger any error?.","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6d4cde58cd496442f4c36cf52ccf9bc728593250","unresolved":false,"context_lines":[{"line_number":8668,"context_line":"                phase\u003dfields.NotificationPhase.START,"},{"line_number":8669,"context_line":"                bdms\u003dbdms)"},{"line_number":8670,"context_line":""},{"line_number":8671,"context_line":"        _, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":8672,"context_line":"                migrate_data)"},{"line_number":8673,"context_line":""},{"line_number":8674,"context_line":"        # NOTE(luyao): Invoke rollback_live_migration_at_destination regardless"},{"line_number":8675,"context_line":"        # of \u0027do_cleanup\u0027 value in _live_migration_cleanup_flags. \u0027do_cleanup\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_0ecb5353","line":8672,"range":{"start_line":8671,"start_character":7,"end_line":8672,"end_character":29},"in_reply_to":"1fa4df85_98230ebf","updated":"2020-03-16 02:54:44.000000000","message":"yes, you\u0027re right, thanks.","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"40b00a38b1cd88c4a0c4a853e7b169f7eaab55df","unresolved":false,"context_lines":[{"line_number":8492,"context_line":"                # NOTE(artom) Apply followed by drop looks weird, but apply"},{"line_number":8493,"context_line":"                # just saves the new fields while drop actually removes the"},{"line_number":8494,"context_line":"                # migration context from the instance."},{"line_number":8495,"context_line":"                # NOTE(luyao) drop migration_context and set task_state"},{"line_number":8496,"context_line":"                # after cleanup done at source host"},{"line_number":8497,"context_line":"                instance.apply_migration_context()"},{"line_number":8498,"context_line":"                instance.host \u003d self.host"},{"line_number":8499,"context_line":"                instance.power_state \u003d current_power_state"}],"source_content_type":"text/x-python","patch_set":14,"id":"1fa4df85_d83ab8e5","line":8496,"range":{"start_line":8495,"start_character":0,"end_line":8496,"end_character":51},"updated":"2020-03-18 06:00:47.000000000","message":"Since we set task_state on source host, we must bump the rpcapi version, and set the message target version. Otherwise it will trigger error under mixed version compute services env, e.g. live migration will stuck at MIGRATING since old compute service running on the source host while new compute service running on the dest, the task_state will not be updated to None forever.","commit_id":"cdb69fda7d8a201fb6c4818eee11d561018431ac"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"4e21e8ccd239c63981333f176c60d5e1586fccd5","unresolved":false,"context_lines":[{"line_number":8492,"context_line":"                # NOTE(artom) Apply followed by drop looks weird, but apply"},{"line_number":8493,"context_line":"                # just saves the new fields while drop actually removes the"},{"line_number":8494,"context_line":"                # migration context from the instance."},{"line_number":8495,"context_line":"                # NOTE(luyao) drop migration_context and set task_state"},{"line_number":8496,"context_line":"                # after cleanup done at source host"},{"line_number":8497,"context_line":"                instance.apply_migration_context()"},{"line_number":8498,"context_line":"                instance.host \u003d self.host"},{"line_number":8499,"context_line":"                instance.power_state \u003d current_power_state"}],"source_content_type":"text/x-python","patch_set":14,"id":"1fa4df85_a7d0f9f8","line":8496,"range":{"start_line":8495,"start_character":0,"end_line":8496,"end_character":51},"in_reply_to":"1fa4df85_d83ab8e5","updated":"2020-03-18 11:25:40.000000000","message":"I misunderstood this, set message target can\u0027t address the bug I stated above.\n\nAn alternative way to solve this problem is to cleanup source host first then invoke post_live_migration_at_destination. Then we will not lose the migration_context, and live migration can run well under mixed-version compute services.","commit_id":"cdb69fda7d8a201fb6c4818eee11d561018431ac"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2da7f9535af47d6fa6070fd323da7356d561a6c2","unresolved":false,"context_lines":[{"line_number":7602,"context_line":"    def _live_migration_claim(self, ctxt, instance, migrate_data,"},{"line_number":7603,"context_line":"                              migration, limits, allocs):"},{"line_number":7604,"context_line":"        \"\"\"Runs on the destination and does a resources claim, if necessary."},{"line_number":7605,"context_line":"        Currently, only NUMA live migrations require it."},{"line_number":7606,"context_line":""},{"line_number":7607,"context_line":"        :param ctxt: Request context"},{"line_number":7608,"context_line":"        :param instance: The Instance being live migrated"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_9d6c2a37","line":7605,"updated":"2020-03-18 13:44:26.000000000","message":"Nit: remove this sentence.","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2da7f9535af47d6fa6070fd323da7356d561a6c2","unresolved":false,"context_lines":[{"line_number":8180,"context_line":"        do_cleanup \u003d False"},{"line_number":8181,"context_line":"        destroy_disks \u003d False"},{"line_number":8182,"context_line":"        if isinstance(migrate_data, migrate_data_obj.LibvirtLiveMigrateData):"},{"line_number":8183,"context_line":"            # NOTE(luyao): We need to cleanup any zombie Planned VM"},{"line_number":8184,"context_line":"            do_cleanup \u003d True"},{"line_number":8185,"context_line":"            destroy_disks \u003d not migrate_data.is_shared_block_storage"},{"line_number":8186,"context_line":"        elif isinstance(migrate_data, migrate_data_obj.XenapiLiveMigrateData):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_3dcad619","line":8183,"updated":"2020-03-18 13:44:26.000000000","message":"Maybe the answer is later in this patch, but how does supporting vpmem create the need to cleanup zombie VMs?","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"ee6e21468d0243b9147210f006a855df1ba81a00","unresolved":false,"context_lines":[{"line_number":8180,"context_line":"        do_cleanup \u003d False"},{"line_number":8181,"context_line":"        destroy_disks \u003d False"},{"line_number":8182,"context_line":"        if isinstance(migrate_data, migrate_data_obj.LibvirtLiveMigrateData):"},{"line_number":8183,"context_line":"            # NOTE(luyao): We need to cleanup any zombie Planned VM"},{"line_number":8184,"context_line":"            do_cleanup \u003d True"},{"line_number":8185,"context_line":"            destroy_disks \u003d not migrate_data.is_shared_block_storage"},{"line_number":8186,"context_line":"        elif isinstance(migrate_data, migrate_data_obj.XenapiLiveMigrateData):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_63b1878f","line":8183,"in_reply_to":"1fa4df85_3dcad619","updated":"2020-03-19 04:02:02.000000000","message":"Actually this is not exactly what vpmem needs, it\u0027s more like a bug fixing or confusing code improving. In patch set 10, I got some comments from Alex and Lee Yarwood. I‘d like summarize for you:\n\n1. for libvirt, do_cleanup is just a flag to mark if the instance_path is shared. If the instance path is shared, that means we shouldn\u0027t cleanup the target/source instance path. But that code path is already controlled by \u0027destroy_disks\u0027 flag\n2. we have two operations based on this do_cleanup flag,\n   a) rpc call \u0027rollback_live_migration_at_destination\u0027 on source host when rollback live migration\n   b) driver.cleanup on source host when post live migration\nboth a) and b) have other logic like undefine the domain, disconnect volume or destory vif except for cleanup instance path. These operations shouldn\u0027t be controlled by only do_cleanup flag.\n\nSo that\u0027s why we set this flag always True. And then we can utilize this change to hide vpmem cleanup inside rpc call rollback_live_migration_at_destination or driver.cleanup.","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"30a0930d1a6af811e1db9cf94f33850e3ed21ba1","unresolved":false,"context_lines":[{"line_number":8180,"context_line":"        do_cleanup \u003d False"},{"line_number":8181,"context_line":"        destroy_disks \u003d False"},{"line_number":8182,"context_line":"        if isinstance(migrate_data, migrate_data_obj.LibvirtLiveMigrateData):"},{"line_number":8183,"context_line":"            # NOTE(luyao): We need to cleanup any zombie Planned VM"},{"line_number":8184,"context_line":"            do_cleanup \u003d True"},{"line_number":8185,"context_line":"            destroy_disks \u003d not migrate_data.is_shared_block_storage"},{"line_number":8186,"context_line":"        elif isinstance(migrate_data, migrate_data_obj.XenapiLiveMigrateData):"}],"source_content_type":"text/x-python","patch_set":15,"id":"df33271e_008e7b77","line":8183,"in_reply_to":"1fa4df85_63b1878f","updated":"2020-03-21 07:45:28.000000000","message":"I think we should separate this change to another patch as bug fix. That is more clear for the reviewer","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2da7f9535af47d6fa6070fd323da7356d561a6c2","unresolved":false,"context_lines":[{"line_number":8336,"context_line":"        do_cleanup, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":8337,"context_line":"                migrate_data)"},{"line_number":8338,"context_line":""},{"line_number":8339,"context_line":"        if do_cleanup:"},{"line_number":8340,"context_line":"            # NOTE(luyao) we need migration_context to support specific"},{"line_number":8341,"context_line":"            # resources cleanup like vpmem, we invoke cleanup before"},{"line_number":8342,"context_line":"            # post_live_migration_at_destination, the migration_context"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_7df84e48","line":8339,"updated":"2020-03-18 13:44:26.000000000","message":"I *think* this change in order is fine, though I\u0027d like to run my (as-yet unmerged, *sigh*) NUMA live migration functional tests [1] on top of this to make sure.","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6d0d4733bb10a0cbababf493ed4ebe5dc19c0121","unresolved":false,"context_lines":[{"line_number":8336,"context_line":"        do_cleanup, destroy_disks \u003d self._live_migration_cleanup_flags("},{"line_number":8337,"context_line":"                migrate_data)"},{"line_number":8338,"context_line":""},{"line_number":8339,"context_line":"        if do_cleanup:"},{"line_number":8340,"context_line":"            # NOTE(luyao) we need migration_context to support specific"},{"line_number":8341,"context_line":"            # resources cleanup like vpmem, we invoke cleanup before"},{"line_number":8342,"context_line":"            # post_live_migration_at_destination, the migration_context"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_798374aa","line":8339,"in_reply_to":"1fa4df85_7df84e48","updated":"2020-03-19 07:24:14.000000000","message":"You mean this patch[1] right? There is a typo in the patch, I left a comment there.\nI run your functional tests on top of my patch, all tests passed.\n\n[1]https://review.opendev.org/#/c/672595","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7a08de7aac87c5981518e1ebdf00a1ff4f71a556","unresolved":false,"context_lines":[{"line_number":8340,"context_line":"            # NOTE(luyao) we need migration_context to support specific"},{"line_number":8341,"context_line":"            # resources cleanup like vpmem, we invoke cleanup before"},{"line_number":8342,"context_line":"            # post_live_migration_at_destination, the migration_context"},{"line_number":8343,"context_line":"            # has not droped at this time."},{"line_number":8344,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":8345,"context_line":"                      instance\u003dinstance)"},{"line_number":8346,"context_line":"            with instance.mutated_migration_context(prefix\u003d\u0027old_\u0027):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_e424aab1","line":8343,"range":{"start_line":8343,"start_character":22,"end_line":8343,"end_character":28},"updated":"2020-03-18 14:34:26.000000000","message":"dropped?","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"ee6e21468d0243b9147210f006a855df1ba81a00","unresolved":false,"context_lines":[{"line_number":8340,"context_line":"            # NOTE(luyao) we need migration_context to support specific"},{"line_number":8341,"context_line":"            # resources cleanup like vpmem, we invoke cleanup before"},{"line_number":8342,"context_line":"            # post_live_migration_at_destination, the migration_context"},{"line_number":8343,"context_line":"            # has not droped at this time."},{"line_number":8344,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":8345,"context_line":"                      instance\u003dinstance)"},{"line_number":8346,"context_line":"            with instance.mutated_migration_context(prefix\u003d\u0027old_\u0027):"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_a313ff65","line":8343,"range":{"start_line":8343,"start_character":22,"end_line":8343,"end_character":28},"in_reply_to":"1fa4df85_e424aab1","updated":"2020-03-19 04:02:02.000000000","message":"yes, I\u0027ll fix this typo","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7a08de7aac87c5981518e1ebdf00a1ff4f71a556","unresolved":false,"context_lines":[{"line_number":8343,"context_line":"            # has not droped at this time."},{"line_number":8344,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":8345,"context_line":"                      instance\u003dinstance)"},{"line_number":8346,"context_line":"            with instance.mutated_migration_context(prefix\u003d\u0027old_\u0027):"},{"line_number":8347,"context_line":"                self.driver.cleanup(ctxt, instance, unplug_nw_info,"},{"line_number":8348,"context_line":"                                    destroy_disks\u003ddestroy_disks,"},{"line_number":8349,"context_line":"                                    migrate_data\u003dmigrate_data,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_645e7a13","line":8346,"updated":"2020-03-18 14:34:26.000000000","message":"IMHO, this is not improving understandability of this code. We\u0027re now rolling the instance forwards and backwards at various times. I\u0027m not sure it\u0027s reasonable to move this before the RPC call without surveying the rest of the drivers, and I\u0027m not sure whether that means the cleanup method(s) expect the migration context to be reverted at that point, nor am I sure if this is \"good enough\".\n\nIn general, I don\u0027t think that moving major points of synchronization like this is a good practice. If we need another \"hook\" for the virt driver to be able to do something before the post RPC call below, then we should add that. More ideally, we\u0027d do something to enable the driver to do what it needs in the cleanup routine (i.e. stash some data somewhere, etc).","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"ee6e21468d0243b9147210f006a855df1ba81a00","unresolved":false,"context_lines":[{"line_number":8343,"context_line":"            # has not droped at this time."},{"line_number":8344,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":8345,"context_line":"                      instance\u003dinstance)"},{"line_number":8346,"context_line":"            with instance.mutated_migration_context(prefix\u003d\u0027old_\u0027):"},{"line_number":8347,"context_line":"                self.driver.cleanup(ctxt, instance, unplug_nw_info,"},{"line_number":8348,"context_line":"                                    destroy_disks\u003ddestroy_disks,"},{"line_number":8349,"context_line":"                                    migrate_data\u003dmigrate_data,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_be7232ac","line":8346,"in_reply_to":"1fa4df85_0063e9b2","updated":"2020-03-19 04:02:02.000000000","message":"Thanks for Alex help clarifying.\n\n@Dan Simth, I have something to add.\n\nIn line 8358, we can see that even if the RPC call fails, it will not break the procedure of cleanup on source host. Only 2 drivers implemented cleanup interface currently,\n1. hiperv.cleanup: unplug vifs\n2. libvirt.cleanup:  unplug vifs, disconnect volume, destroy disk, delete instance file, undefine domain, and *cleanup_specific_resources* like vpmem.\nSo it\u0027s probably OK to move this cleanup before RPC call since it\u0027s no difference for other drivers. And mutated_migration_context will only have effects on libvirt driver.\n\n\nIf we move this before RPC call, the instance will still hold old info at this time, maybe we don\u0027t need mutated_migration_context here, but still need it in rollback_live_migration_at_destination(line 8782).","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8674d74d276ab108ac5aa63bce09e474b4dd26d0","unresolved":false,"context_lines":[{"line_number":8343,"context_line":"            # has not droped at this time."},{"line_number":8344,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":8345,"context_line":"                      instance\u003dinstance)"},{"line_number":8346,"context_line":"            with instance.mutated_migration_context(prefix\u003d\u0027old_\u0027):"},{"line_number":8347,"context_line":"                self.driver.cleanup(ctxt, instance, unplug_nw_info,"},{"line_number":8348,"context_line":"                                    destroy_disks\u003ddestroy_disks,"},{"line_number":8349,"context_line":"                                    migrate_data\u003dmigrate_data,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_0063e9b2","line":8346,"in_reply_to":"1fa4df85_645e7a13","updated":"2020-03-18 23:21:43.000000000","message":"The usage of \"mutated_migration_context\" is what I suggested. Luyao\u0027s initial method is passing down the prefix to the virt driver. I thought the virt driver shouldn\u0027t worry about it.\n\nFor the moving this cleanup before cleanup, the reason is that we need to do the cleanup before we drop the \u0027migration_context\u0027, otherwise we loss the info for the allocated source vpmem.\n\n\nAlso luyao add new virt driver method for cleanup resources(only vpmem now). Then it is me again...I suggested reuse the virt driver cleanup method. I don\u0027t want to add any special method for code path just for vpmem. So I suggested do any cleanup inside the original cleanup/destroy virt driver method.\n\nAnother way is moving the drop_migration_context and instance\u0027s task_state/host update to source node. (currently, we update them in the destination host in \u0027self.compute_rpcapi.post_live_migration_at_destination\u0027, line 8356)\n\nBut that needs us to handle the upgrade issue, like we need to src/dest is old or new. Then we need to decide to update the instance state in the original position or in the new position. Then keep the live mgiraton works correctly in upgrade.\n\nI don\u0027t know which one is best...thanks for give us suggestion.","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"30a0930d1a6af811e1db9cf94f33850e3ed21ba1","unresolved":false,"context_lines":[{"line_number":8343,"context_line":"            # has not droped at this time."},{"line_number":8344,"context_line":"            LOG.debug(\u0027Calling driver.cleanup from _post_live_migration\u0027,"},{"line_number":8345,"context_line":"                      instance\u003dinstance)"},{"line_number":8346,"context_line":"            with instance.mutated_migration_context(prefix\u003d\u0027old_\u0027):"},{"line_number":8347,"context_line":"                self.driver.cleanup(ctxt, instance, unplug_nw_info,"},{"line_number":8348,"context_line":"                                    destroy_disks\u003ddestroy_disks,"},{"line_number":8349,"context_line":"                                    migrate_data\u003dmigrate_data,"}],"source_content_type":"text/x-python","patch_set":15,"id":"df33271e_80d0cb52","line":8346,"in_reply_to":"1fa4df85_be7232ac","updated":"2020-03-21 07:45:28.000000000","message":"I checked the code. I found even if \u0027post_live_migration_at_destination\u0027 failed, we are still going to cleanup on the source node (line 8359).\n\nI think the reason is when we enter the post live migration stage, the VM is already in destination host. We won\u0027t bring it back for any wrong on the destination side cleanup.\n\nFor the concern of synchronization point, I\u0027m not sure I understand correctly. But I think the \u0027driver.cleanup\u0027 method shouldn\u0027t care about where it is being called. The implement for that method should just do the cleanup whenever we call it.\n\nSo, I prefer the move the cleanup, that sounds like easy.","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2da7f9535af47d6fa6070fd323da7356d561a6c2","unresolved":false,"context_lines":[{"line_number":8686,"context_line":"                migrate_data.src_supports_numa_live_migration):"},{"line_number":8687,"context_line":"            LOG.debug(\u0027Calling destination to drop move claim.\u0027,"},{"line_number":8688,"context_line":"                      instance\u003dinstance)"},{"line_number":8689,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":8690,"context_line":"                                                               instance, dest)"},{"line_number":8691,"context_line":""},{"line_number":8692,"context_line":"        # NOTE(luyao) after all rollback operations done, then update"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_3d66562b","line":8689,"updated":"2020-03-18 13:44:26.000000000","message":"I think you need to call this for your vpmem stuff too, no? You create a claim on L7622...","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"ee6e21468d0243b9147210f006a855df1ba81a00","unresolved":false,"context_lines":[{"line_number":8686,"context_line":"                migrate_data.src_supports_numa_live_migration):"},{"line_number":8687,"context_line":"            LOG.debug(\u0027Calling destination to drop move claim.\u0027,"},{"line_number":8688,"context_line":"                      instance\u003dinstance)"},{"line_number":8689,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":8690,"context_line":"                                                               instance, dest)"},{"line_number":8691,"context_line":""},{"line_number":8692,"context_line":"        # NOTE(luyao) after all rollback operations done, then update"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_3eeba2dc","line":8689,"in_reply_to":"1fa4df85_3d66562b","updated":"2020-03-19 04:02:02.000000000","message":"Yes, I need this, vpmem must have numa config, so this will be called.","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"81df62a5bf98693f9e2322f1b4ea5445dc8e1396","unresolved":false,"context_lines":[{"line_number":8715,"context_line":"                phase\u003dfields.NotificationPhase.END,"},{"line_number":8716,"context_line":"                bdms\u003dbdms)"},{"line_number":8717,"context_line":""},{"line_number":8718,"context_line":"        # TODO(luyao): set migration status to \u0027failed\u0027 but not \u0027error\u0027"},{"line_number":8719,"context_line":"        # which means rollback_live_migration is done, we have cleanup"},{"line_number":8720,"context_line":"        # all stuff and get instance back to normal status."},{"line_number":8721,"context_line":"        self._set_migration_status(migration, migration_status)"},{"line_number":8722,"context_line":""},{"line_number":8723,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":16,"id":"df33271e_974598b6","line":8720,"range":{"start_line":8718,"start_character":8,"end_line":8720,"end_character":59},"updated":"2020-03-24 06:27:08.000000000","message":"I guess you move this to next patch?","commit_id":"76af67a09b2e3b46de6a12b9a74bcd1c67a54425"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"7c3f412217f20c3929538d860f6c7959206fd109","unresolved":false,"context_lines":[{"line_number":8715,"context_line":"                phase\u003dfields.NotificationPhase.END,"},{"line_number":8716,"context_line":"                bdms\u003dbdms)"},{"line_number":8717,"context_line":""},{"line_number":8718,"context_line":"        # TODO(luyao): set migration status to \u0027failed\u0027 but not \u0027error\u0027"},{"line_number":8719,"context_line":"        # which means rollback_live_migration is done, we have cleanup"},{"line_number":8720,"context_line":"        # all stuff and get instance back to normal status."},{"line_number":8721,"context_line":"        self._set_migration_status(migration, migration_status)"},{"line_number":8722,"context_line":""},{"line_number":8723,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":16,"id":"df33271e_263bbb38","line":8720,"range":{"start_line":8718,"start_character":8,"end_line":8720,"end_character":59},"in_reply_to":"df33271e_974598b6","updated":"2020-03-24 09:50:42.000000000","message":"yes","commit_id":"76af67a09b2e3b46de6a12b9a74bcd1c67a54425"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e858f0644e81a70e2b287b847c0b7a18ea0d9900","unresolved":false,"context_lines":[{"line_number":8169,"context_line":"        self._notify_live_migrate_abort_end(context, instance)"},{"line_number":8170,"context_line":""},{"line_number":8171,"context_line":"    def _live_migration_cleanup_flags(self, migrate_data, migr_ctxt\u003dNone):"},{"line_number":8172,"context_line":"        \"\"\"Determine whether disks or instance path or other resources"},{"line_number":8173,"context_line":"        need to be cleaned up after live migration (at source on success,"},{"line_number":8174,"context_line":"        at destination on rollback)"},{"line_number":8175,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_494fbe91","line":8172,"range":{"start_line":8172,"start_character":34,"end_line":8172,"end_character":37},"updated":"2020-03-26 16:08:49.000000000","message":",","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"59443995d378b81cd2b290025d2b82403e1d1fc6","unresolved":false,"context_lines":[{"line_number":8169,"context_line":"        self._notify_live_migrate_abort_end(context, instance)"},{"line_number":8170,"context_line":""},{"line_number":8171,"context_line":"    def _live_migration_cleanup_flags(self, migrate_data, migr_ctxt\u003dNone):"},{"line_number":8172,"context_line":"        \"\"\"Determine whether disks or instance path or other resources"},{"line_number":8173,"context_line":"        need to be cleaned up after live migration (at source on success,"},{"line_number":8174,"context_line":"        at destination on rollback)"},{"line_number":8175,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_3e6ee400","line":8172,"range":{"start_line":8172,"start_character":34,"end_line":8172,"end_character":37},"in_reply_to":"df33271e_494fbe91","updated":"2020-03-27 09:04:41.000000000","message":"Done","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e858f0644e81a70e2b287b847c0b7a18ea0d9900","unresolved":false,"context_lines":[{"line_number":8689,"context_line":"                            \u0027during live migration rollback.\u0027,"},{"line_number":8690,"context_line":"                            instance\u003dinstance)"},{"line_number":8691,"context_line":""},{"line_number":8692,"context_line":"        # NOTE(luyao): drop move_claim and migration_context after cleanup"},{"line_number":8693,"context_line":"        # done, then the specific resources claimed on destination will be"},{"line_number":8694,"context_line":"        # released savely."},{"line_number":8695,"context_line":"        # TODO(artom) drop_move_claim_at_destination() is new in RPC 5.3, only"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_e4123958","line":8692,"range":{"start_line":8692,"start_character":23,"end_line":8692,"end_character":27},"updated":"2020-03-26 16:08:49.000000000","message":"we drop","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"59443995d378b81cd2b290025d2b82403e1d1fc6","unresolved":false,"context_lines":[{"line_number":8689,"context_line":"                            \u0027during live migration rollback.\u0027,"},{"line_number":8690,"context_line":"                            instance\u003dinstance)"},{"line_number":8691,"context_line":""},{"line_number":8692,"context_line":"        # NOTE(luyao): drop move_claim and migration_context after cleanup"},{"line_number":8693,"context_line":"        # done, then the specific resources claimed on destination will be"},{"line_number":8694,"context_line":"        # released savely."},{"line_number":8695,"context_line":"        # TODO(artom) drop_move_claim_at_destination() is new in RPC 5.3, only"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_5eada82f","line":8692,"range":{"start_line":8692,"start_character":23,"end_line":8692,"end_character":27},"in_reply_to":"df33271e_e4123958","updated":"2020-03-27 09:04:41.000000000","message":"Done","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e858f0644e81a70e2b287b847c0b7a18ea0d9900","unresolved":false,"context_lines":[{"line_number":8690,"context_line":"                            instance\u003dinstance)"},{"line_number":8691,"context_line":""},{"line_number":8692,"context_line":"        # NOTE(luyao): drop move_claim and migration_context after cleanup"},{"line_number":8693,"context_line":"        # done, then the specific resources claimed on destination will be"},{"line_number":8694,"context_line":"        # released savely."},{"line_number":8695,"context_line":"        # TODO(artom) drop_move_claim_at_destination() is new in RPC 5.3, only"},{"line_number":8696,"context_line":"        # call it if we performed a NUMA-aware live migration (which implies us"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_6428e985","line":8693,"range":{"start_line":8693,"start_character":10,"end_line":8693,"end_character":20},"updated":"2020-03-26 16:08:49.000000000","message":"is complete, to ensure","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"59443995d378b81cd2b290025d2b82403e1d1fc6","unresolved":false,"context_lines":[{"line_number":8690,"context_line":"                            instance\u003dinstance)"},{"line_number":8691,"context_line":""},{"line_number":8692,"context_line":"        # NOTE(luyao): drop move_claim and migration_context after cleanup"},{"line_number":8693,"context_line":"        # done, then the specific resources claimed on destination will be"},{"line_number":8694,"context_line":"        # released savely."},{"line_number":8695,"context_line":"        # TODO(artom) drop_move_claim_at_destination() is new in RPC 5.3, only"},{"line_number":8696,"context_line":"        # call it if we performed a NUMA-aware live migration (which implies us"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_beacb434","line":8693,"range":{"start_line":8693,"start_character":10,"end_line":8693,"end_character":20},"in_reply_to":"df33271e_6428e985","updated":"2020-03-27 09:04:41.000000000","message":"Done","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e858f0644e81a70e2b287b847c0b7a18ea0d9900","unresolved":false,"context_lines":[{"line_number":8691,"context_line":""},{"line_number":8692,"context_line":"        # NOTE(luyao): drop move_claim and migration_context after cleanup"},{"line_number":8693,"context_line":"        # done, then the specific resources claimed on destination will be"},{"line_number":8694,"context_line":"        # released savely."},{"line_number":8695,"context_line":"        # TODO(artom) drop_move_claim_at_destination() is new in RPC 5.3, only"},{"line_number":8696,"context_line":"        # call it if we performed a NUMA-aware live migration (which implies us"},{"line_number":8697,"context_line":"        # being able to send RPC 5.3). To check this, we can use the"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_840c0d3c","line":8694,"range":{"start_line":8694,"start_character":19,"end_line":8694,"end_character":25},"updated":"2020-03-26 16:08:49.000000000","message":"safely","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"59443995d378b81cd2b290025d2b82403e1d1fc6","unresolved":false,"context_lines":[{"line_number":8691,"context_line":""},{"line_number":8692,"context_line":"        # NOTE(luyao): drop move_claim and migration_context after cleanup"},{"line_number":8693,"context_line":"        # done, then the specific resources claimed on destination will be"},{"line_number":8694,"context_line":"        # released savely."},{"line_number":8695,"context_line":"        # TODO(artom) drop_move_claim_at_destination() is new in RPC 5.3, only"},{"line_number":8696,"context_line":"        # call it if we performed a NUMA-aware live migration (which implies us"},{"line_number":8697,"context_line":"        # being able to send RPC 5.3). To check this, we can use the"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_9ea73050","line":8694,"range":{"start_line":8694,"start_character":19,"end_line":8694,"end_character":25},"in_reply_to":"df33271e_840c0d3c","updated":"2020-03-27 09:04:41.000000000","message":"Done","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e858f0644e81a70e2b287b847c0b7a18ea0d9900","unresolved":false,"context_lines":[{"line_number":8710,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":8711,"context_line":"                                                               instance, dest)"},{"line_number":8712,"context_line":""},{"line_number":8713,"context_line":"        # NOTE(luyao) after all rollback operations done, then update"},{"line_number":8714,"context_line":"        # the instance info"},{"line_number":8715,"context_line":"        instance.task_state \u003d None"},{"line_number":8716,"context_line":"        instance.progress \u003d 0"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_2436e1e7","line":8713,"range":{"start_line":8713,"start_character":10,"end_line":8713,"end_character":69},"updated":"2020-03-26 16:08:49.000000000","message":"NOTE(luyao): We only update instance info after rollback operations are complete","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"59443995d378b81cd2b290025d2b82403e1d1fc6","unresolved":false,"context_lines":[{"line_number":8710,"context_line":"            self.compute_rpcapi.drop_move_claim_at_destination(context,"},{"line_number":8711,"context_line":"                                                               instance, dest)"},{"line_number":8712,"context_line":""},{"line_number":8713,"context_line":"        # NOTE(luyao) after all rollback operations done, then update"},{"line_number":8714,"context_line":"        # the instance info"},{"line_number":8715,"context_line":"        instance.task_state \u003d None"},{"line_number":8716,"context_line":"        instance.progress \u003d 0"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_fe63dc18","line":8713,"range":{"start_line":8713,"start_character":10,"end_line":8713,"end_character":69},"in_reply_to":"df33271e_2436e1e7","updated":"2020-03-27 09:04:41.000000000","message":"Done","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e858f0644e81a70e2b287b847c0b7a18ea0d9900","unresolved":false,"context_lines":[{"line_number":8726,"context_line":"                bdms\u003dbdms)"},{"line_number":8727,"context_line":""},{"line_number":8728,"context_line":"        # TODO(luyao): set migration status to \u0027failed\u0027 but not \u0027error\u0027"},{"line_number":8729,"context_line":"        # which means rollback_live_migration is done, we have cleanup"},{"line_number":8730,"context_line":"        # all stuff and get instance back to normal status."},{"line_number":8731,"context_line":"        self._set_migration_status(migration, migration_status)"},{"line_number":8732,"context_line":""},{"line_number":8733,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_244b8159","line":8730,"range":{"start_line":8729,"start_character":63,"end_line":8730,"end_character":27},"updated":"2020-03-26 16:08:49.000000000","message":"successfully cleaned up and returned the instance","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"59443995d378b81cd2b290025d2b82403e1d1fc6","unresolved":false,"context_lines":[{"line_number":8726,"context_line":"                bdms\u003dbdms)"},{"line_number":8727,"context_line":""},{"line_number":8728,"context_line":"        # TODO(luyao): set migration status to \u0027failed\u0027 but not \u0027error\u0027"},{"line_number":8729,"context_line":"        # which means rollback_live_migration is done, we have cleanup"},{"line_number":8730,"context_line":"        # all stuff and get instance back to normal status."},{"line_number":8731,"context_line":"        self._set_migration_status(migration, migration_status)"},{"line_number":8732,"context_line":""},{"line_number":8733,"context_line":"    @wrap_exception()"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_de66d829","line":8730,"range":{"start_line":8729,"start_character":63,"end_line":8730,"end_character":27},"in_reply_to":"df33271e_244b8159","updated":"2020-03-27 09:04:41.000000000","message":"Done","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9eb8787ad70aea61d6d9752a71217e0466738fa8","unresolved":false,"context_lines":[{"line_number":8261,"context_line":"        newly created instance-xxx dir on the destination as a part of its"},{"line_number":8262,"context_line":"        rollback process"},{"line_number":8263,"context_line":""},{"line_number":8264,"context_line":"        There maybe other resources which need cleanup. Currently only for"},{"line_number":8265,"context_line":"        libvirt driver we need cleanup vpmems if there are."},{"line_number":8266,"context_line":""},{"line_number":8267,"context_line":"        :param migrate_data: implementation specific data"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_6830d39f","line":8264,"range":{"start_line":8264,"start_character":14,"end_line":8264,"end_character":19},"updated":"2020-04-07 10:47:29.000000000","message":"may be","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6182b523f35d9ed2fa2066c81d896014a2860346","unresolved":false,"context_lines":[{"line_number":8261,"context_line":"        newly created instance-xxx dir on the destination as a part of its"},{"line_number":8262,"context_line":"        rollback process"},{"line_number":8263,"context_line":""},{"line_number":8264,"context_line":"        There maybe other resources which need cleanup. Currently only for"},{"line_number":8265,"context_line":"        libvirt driver we need cleanup vpmems if there are."},{"line_number":8266,"context_line":""},{"line_number":8267,"context_line":"        :param migrate_data: implementation specific data"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_b38530d2","line":8264,"range":{"start_line":8264,"start_character":14,"end_line":8264,"end_character":19},"in_reply_to":"df33271e_6830d39f","updated":"2020-04-07 13:15:10.000000000","message":"Done","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9eb8787ad70aea61d6d9752a71217e0466738fa8","unresolved":false,"context_lines":[{"line_number":8261,"context_line":"        newly created instance-xxx dir on the destination as a part of its"},{"line_number":8262,"context_line":"        rollback process"},{"line_number":8263,"context_line":""},{"line_number":8264,"context_line":"        There maybe other resources which need cleanup. Currently only for"},{"line_number":8265,"context_line":"        libvirt driver we need cleanup vpmems if there are."},{"line_number":8266,"context_line":""},{"line_number":8267,"context_line":"        :param migrate_data: implementation specific data"},{"line_number":8268,"context_line":"        :param migr_ctxt: specific resources stored in migration_context"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_0821474e","line":8265,"range":{"start_line":8264,"start_character":54,"end_line":8265,"end_character":59},"updated":"2020-04-07 10:47:29.000000000","message":"; currently this is limited to vPMEM devices with the libvirt driver.","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6182b523f35d9ed2fa2066c81d896014a2860346","unresolved":false,"context_lines":[{"line_number":8261,"context_line":"        newly created instance-xxx dir on the destination as a part of its"},{"line_number":8262,"context_line":"        rollback process"},{"line_number":8263,"context_line":""},{"line_number":8264,"context_line":"        There maybe other resources which need cleanup. Currently only for"},{"line_number":8265,"context_line":"        libvirt driver we need cleanup vpmems if there are."},{"line_number":8266,"context_line":""},{"line_number":8267,"context_line":"        :param migrate_data: implementation specific data"},{"line_number":8268,"context_line":"        :param migr_ctxt: specific resources stored in migration_context"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_136cdc34","line":8265,"range":{"start_line":8264,"start_character":54,"end_line":8265,"end_character":59},"in_reply_to":"df33271e_0821474e","updated":"2020-04-07 13:15:10.000000000","message":"Done","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9eb8787ad70aea61d6d9752a71217e0466738fa8","unresolved":false,"context_lines":[{"line_number":8287,"context_line":"            # must be deleted for preparing next block migration"},{"line_number":8288,"context_line":"            # must be deleted for preparing next live migration w/o shared"},{"line_number":8289,"context_line":"            # storage"},{"line_number":8290,"context_line":"            # vpmem must be cleanped up"},{"line_number":8291,"context_line":"            do_cleanup \u003d not migrate_data.is_shared_instance_path or has_vpmem"},{"line_number":8292,"context_line":"            destroy_disks \u003d not migrate_data.is_shared_block_storage"},{"line_number":8293,"context_line":"        elif isinstance(migrate_data, migrate_data_obj.XenapiLiveMigrateData):"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_882d5748","line":8290,"range":{"start_line":8290,"start_character":28,"end_line":8290,"end_character":36},"updated":"2020-04-07 10:47:29.000000000","message":"cleaned","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6182b523f35d9ed2fa2066c81d896014a2860346","unresolved":false,"context_lines":[{"line_number":8287,"context_line":"            # must be deleted for preparing next block migration"},{"line_number":8288,"context_line":"            # must be deleted for preparing next live migration w/o shared"},{"line_number":8289,"context_line":"            # storage"},{"line_number":8290,"context_line":"            # vpmem must be cleanped up"},{"line_number":8291,"context_line":"            do_cleanup \u003d not migrate_data.is_shared_instance_path or has_vpmem"},{"line_number":8292,"context_line":"            destroy_disks \u003d not migrate_data.is_shared_block_storage"},{"line_number":8293,"context_line":"        elif isinstance(migrate_data, migrate_data_obj.XenapiLiveMigrateData):"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_1355fc50","line":8290,"range":{"start_line":8290,"start_character":28,"end_line":8290,"end_character":36},"in_reply_to":"df33271e_882d5748","updated":"2020-04-07 13:15:10.000000000","message":"Done","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"ab6615924ccf908937d0b878ce7d205cc78c2929","unresolved":false,"context_lines":[{"line_number":7669,"context_line":"                ctxt, instance, dest_check_data)"},{"line_number":7670,"context_line":"            if (\u0027src_supports_numa_live_migration\u0027 in migrate_data and"},{"line_number":7671,"context_line":"                    migrate_data.src_supports_numa_live_migration):"},{"line_number":7672,"context_line":"                migrate_data \u003d self._live_migration_claim("},{"line_number":7673,"context_line":"                    ctxt, instance, migrate_data, migration, limits, allocs)"},{"line_number":7674,"context_line":"            elif \u0027dst_supports_numa_live_migration\u0027 in dest_check_data:"},{"line_number":7675,"context_line":"                LOG.info(\u0027Destination was ready for NUMA live migration, \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"df33271e_07080d2b","line":7672,"updated":"2020-04-07 16:01:04.000000000","message":"You\u0027re still only calling this if the instance has a NUMA topology - IIRC, an instance NUMA topology has no bearing on VPMEM, so this is incorrect.","commit_id":"4bd5af66b55b1ac5e5fa654eb31bf90616d62256"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"71910220f9ad4b627968efe9f703c8c7660eff04","unresolved":false,"context_lines":[{"line_number":7669,"context_line":"                ctxt, instance, dest_check_data)"},{"line_number":7670,"context_line":"            if (\u0027src_supports_numa_live_migration\u0027 in migrate_data and"},{"line_number":7671,"context_line":"                    migrate_data.src_supports_numa_live_migration):"},{"line_number":7672,"context_line":"                migrate_data \u003d self._live_migration_claim("},{"line_number":7673,"context_line":"                    ctxt, instance, migrate_data, migration, limits, allocs)"},{"line_number":7674,"context_line":"            elif \u0027dst_supports_numa_live_migration\u0027 in dest_check_data:"},{"line_number":7675,"context_line":"                LOG.info(\u0027Destination was ready for NUMA live migration, \u0027"}],"source_content_type":"text/x-python","patch_set":24,"id":"df33271e_07912c9a","line":7672,"in_reply_to":"df33271e_07080d2b","updated":"2020-04-07 16:02:25.000000000","message":"\u003cstephenfin\u003e artom: You need to have a guest NUMA topology to use vPMEM\n\nMea culpa.","commit_id":"4bd5af66b55b1ac5e5fa654eb31bf90616d62256"}],"nova/compute/rpcapi.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0518f88cb2f47b12c29bb13425474359e40cef9d","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        * 5.8 - Add confirm_snapshot_based_resize_at_source()"},{"line_number":377,"context_line":"        * 5.9 - Add revert_snapshot_based_resize_at_dest()"},{"line_number":378,"context_line":"        * 5.10 - Add finish_revert_snapshot_based_resize_at_source()"},{"line_number":379,"context_line":"        * 5.11 - Add support for live migration with vpmem"},{"line_number":380,"context_line":"    \u0027\u0027\u0027"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    VERSION_ALIASES \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_1bfe3805","line":379,"range":{"start_line":379,"start_character":10,"end_line":379,"end_character":58},"updated":"2020-03-14 09:26:35.000000000","message":"you can just bump the object version without bump the rpcapi version","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6d4cde58cd496442f4c36cf52ccf9bc728593250","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        * 5.8 - Add confirm_snapshot_based_resize_at_source()"},{"line_number":377,"context_line":"        * 5.9 - Add revert_snapshot_based_resize_at_dest()"},{"line_number":378,"context_line":"        * 5.10 - Add finish_revert_snapshot_based_resize_at_source()"},{"line_number":379,"context_line":"        * 5.11 - Add support for live migration with vpmem"},{"line_number":380,"context_line":"    \u0027\u0027\u0027"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    VERSION_ALIASES \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_4eb14be1","line":379,"range":{"start_line":379,"start_character":10,"end_line":379,"end_character":58},"in_reply_to":"1fa4df85_1bfe3805","updated":"2020-03-16 02:54:44.000000000","message":"Sorry, I don\u0027t get what you mean. What object version? Do you mean the global service version?","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"a6c230c95b9daec3193fcaeb4e8a5e064773203c","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        * 5.8 - Add confirm_snapshot_based_resize_at_source()"},{"line_number":377,"context_line":"        * 5.9 - Add revert_snapshot_based_resize_at_dest()"},{"line_number":378,"context_line":"        * 5.10 - Add finish_revert_snapshot_based_resize_at_source()"},{"line_number":379,"context_line":"        * 5.11 - Add support for live migration with vpmem"},{"line_number":380,"context_line":"    \u0027\u0027\u0027"},{"line_number":381,"context_line":""},{"line_number":382,"context_line":"    VERSION_ALIASES \u003d {"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_4e0dcb8e","line":379,"range":{"start_line":379,"start_character":10,"end_line":379,"end_character":58},"in_reply_to":"1fa4df85_4eb14be1","updated":"2020-03-16 03:10:49.000000000","message":"yea, only bump the service version.","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"}],"nova/conductor/tasks/live_migrate.py":[{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"452a837102ca0306058343f4c7c8c54b89a9a9a8","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def supports_vpmem_live_migration(context, host):"},{"line_number":49,"context_line":"    \"\"\"Checks if the commpute host service is new enought to support"},{"line_number":50,"context_line":"    instance live migration with virtual persistent memory."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    :param context: The user request context."}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_d23423fe","line":49,"range":{"start_line":49,"start_character":50,"end_line":49,"end_character":57},"updated":"2020-03-12 14:20:32.000000000","message":"s/enought/enough","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6d4cde58cd496442f4c36cf52ccf9bc728593250","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"def supports_vpmem_live_migration(context, host):"},{"line_number":49,"context_line":"    \"\"\"Checks if the commpute host service is new enought to support"},{"line_number":50,"context_line":"    instance live migration with virtual persistent memory."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    :param context: The user request context."}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_2e8f2f2f","line":49,"range":{"start_line":49,"start_character":50,"end_line":49,"end_character":57},"in_reply_to":"1fa4df85_d23423fe","updated":"2020-03-16 02:54:44.000000000","message":"Got it.","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"452a837102ca0306058343f4c7c8c54b89a9a9a8","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            # live migrating with a specific destination host so the scheduler"},{"line_number":107,"context_line":"            # is bypassed. There are still some minimal checks performed here"},{"line_number":108,"context_line":"            # though."},{"line_number":109,"context_line":"            source_node, dest_node \u003d \\"},{"line_number":110,"context_line":"                self._check_compatible_with_source_hypervisor(self.destination)"},{"line_number":111,"context_line":"            # NOTE(gibi): consumer_generation \u003d None as we expect that the"},{"line_number":112,"context_line":"            # source host allocation is held by the migration therefore the"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_726beff0","line":109,"range":{"start_line":109,"start_character":37,"end_line":109,"end_character":38},"updated":"2020-03-12 14:20:32.000000000","message":"We should avoid use \\ as a line break, you can use () instead, such as: \n\n        source_node, dest_node \u003d (\n            self._check_compatible_with_source_hypervisor(self.destination))","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6d4cde58cd496442f4c36cf52ccf9bc728593250","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            # live migrating with a specific destination host so the scheduler"},{"line_number":107,"context_line":"            # is bypassed. There are still some minimal checks performed here"},{"line_number":108,"context_line":"            # though."},{"line_number":109,"context_line":"            source_node, dest_node \u003d \\"},{"line_number":110,"context_line":"                self._check_compatible_with_source_hypervisor(self.destination)"},{"line_number":111,"context_line":"            # NOTE(gibi): consumer_generation \u003d None as we expect that the"},{"line_number":112,"context_line":"            # source host allocation is held by the migration therefore the"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_ae8c7f35","line":109,"range":{"start_line":109,"start_character":37,"end_line":109,"end_character":38},"in_reply_to":"1fa4df85_726beff0","updated":"2020-03-16 02:54:44.000000000","message":"Got it, thanks","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0518f88cb2f47b12c29bb13425474359e40cef9d","unresolved":false,"context_lines":[{"line_number":262,"context_line":"            1. check if Instance contains vpmem resources"},{"line_number":263,"context_line":"            2. check if live migration with vpmem is supported"},{"line_number":264,"context_line":"        \"\"\""},{"line_number":265,"context_line":"        if \u0027resources\u0027 not in self.instance or not self.instance.resources:"},{"line_number":266,"context_line":"            return"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        has_vpmem \u003d False"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_5806f622","line":265,"range":{"start_line":265,"start_character":12,"end_line":265,"end_character":43},"updated":"2020-03-14 09:26:35.000000000","message":"emm...why you didn\u0027t check this in the https://review.opendev.org/#/c/708110/4?","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6d4cde58cd496442f4c36cf52ccf9bc728593250","unresolved":false,"context_lines":[{"line_number":262,"context_line":"            1. check if Instance contains vpmem resources"},{"line_number":263,"context_line":"            2. check if live migration with vpmem is supported"},{"line_number":264,"context_line":"        \"\"\""},{"line_number":265,"context_line":"        if \u0027resources\u0027 not in self.instance or not self.instance.resources:"},{"line_number":266,"context_line":"            return"},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        has_vpmem \u003d False"}],"source_content_type":"text/x-python","patch_set":11,"id":"1fa4df85_8e8e6325","line":265,"range":{"start_line":265,"start_character":12,"end_line":265,"end_character":43},"in_reply_to":"1fa4df85_5806f622","updated":"2020-03-16 02:54:44.000000000","message":"It\u0027s a mistake, I\u0027ll correct it.","commit_id":"384473e5d827e397ee994fa6f8cc2c99efdbeb14"},{"author":{"_account_id":8864,"name":"Artom Lifshitz","email":"notartom@gmail.com","username":"artom"},"change_message_id":"2da7f9535af47d6fa6070fd323da7356d561a6c2","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    :returns: True if the compute host is new enough to support live migration"},{"line_number":55,"context_line":"    with vpmem"},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    svc \u003d objects.Service.get_by_host_and_binary(context, host, \u0027nova-compute\u0027)"},{"line_number":58,"context_line":"    return svc.version \u003e\u003d 49"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_dd3aa2e5","line":57,"updated":"2020-03-18 13:44:26.000000000","message":"IIRC Dan Smith wasn\u0027t too keen on this - something about this not always been useful information. Which is why I went with flags in the live migrate data object.","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6a3a5fe36477b53cf95063cccaf0f3855fcb4f8d","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    :returns: True if the compute host is new enough to support live migration"},{"line_number":55,"context_line":"    with vpmem"},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    svc \u003d objects.Service.get_by_host_and_binary(context, host, \u0027nova-compute\u0027)"},{"line_number":58,"context_line":"    return svc.version \u003e\u003d 49"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_395e5c12","line":57,"in_reply_to":"1fa4df85_419ed063","updated":"2020-03-19 05:51:30.000000000","message":"OK, I agree with that checking minimum version is safer, I\u0027ll move to use objects.Service.get_minimum_version.","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7a08de7aac87c5981518e1ebdf00a1ff4f71a556","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    :returns: True if the compute host is new enough to support live migration"},{"line_number":55,"context_line":"    with vpmem"},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    svc \u003d objects.Service.get_by_host_and_binary(context, host, \u0027nova-compute\u0027)"},{"line_number":58,"context_line":"    return svc.version \u003e\u003d 49"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_419ed063","line":57,"in_reply_to":"1fa4df85_dd3aa2e5","updated":"2020-03-18 14:34:26.000000000","message":"Probably related to where the check gets done and whether or not the new-enough node would be doing the check.\n\nIn cases where we go from no support to supporting a thing, I think it\u0027s safer to check the minimum cluster version instead of a particular host.","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"90a37f1d80a6aa7dcb242ccaa0d6a241f81a903a","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            # the allocations to claim resources in resource tracker on the"},{"line_number":118,"context_line":"            # destiation host. When forcing the target host we don\u0027t call the"},{"line_number":119,"context_line":"            # scheduler."},{"line_number":120,"context_line":"            scheduler_utils.claim_resources_on_destination("},{"line_number":121,"context_line":"                self.context, self.report_client,"},{"line_number":122,"context_line":"                self.instance, source_node, dest_node,"},{"line_number":123,"context_line":"                source_allocations\u003dself._held_allocations,"},{"line_number":124,"context_line":"                consumer_generation\u003dNone)"},{"line_number":125,"context_line":"            self._check_requested_destination()"},{"line_number":126,"context_line":"            # TODO(mriedem): Call select_destinations() with a"},{"line_number":127,"context_line":"            # skip_filters\u003dTrue flag so the scheduler does the work of claiming"}],"source_content_type":"text/x-python","patch_set":16,"id":"df33271e_777d741b","line":124,"range":{"start_line":120,"start_character":12,"end_line":124,"end_character":41},"updated":"2020-03-24 06:24:17.000000000","message":"you should clean up this claim when the destination check failed.","commit_id":"76af67a09b2e3b46de6a12b9a74bcd1c67a54425"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"90a37f1d80a6aa7dcb242ccaa0d6a241f81a903a","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def _check_requested_destination(self):"},{"line_number":285,"context_line":"        \"\"\"Performs basic pre-live migration checks for the forced host.\"\"\""},{"line_number":286,"context_line":"        self._check_destination_is_not_source()"},{"line_number":287,"context_line":"        self._check_host_is_up(self.destination)"},{"line_number":288,"context_line":"        self._check_destination_has_enough_memory()"},{"line_number":289,"context_line":"        # NOTE(gibi): This code path is used when the live migration is forced"},{"line_number":290,"context_line":"        # to a target host and skipping the scheduler. Such operation is"},{"line_number":291,"context_line":"        # rejected for servers with nested resource allocations since"}],"source_content_type":"text/x-python","patch_set":16,"id":"df33271e_f78ea425","line":288,"range":{"start_line":286,"start_character":8,"end_line":288,"end_character":51},"updated":"2020-03-24 06:24:17.000000000","message":"all those three can be move before the resource claim","commit_id":"76af67a09b2e3b46de6a12b9a74bcd1c67a54425"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e858f0644e81a70e2b287b847c0b7a18ea0d9900","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            # NOTE(luyao): When forcing the target host we don\u0027t call the"},{"line_number":121,"context_line":"            # scheduler, that means we need to get allocations from placement"},{"line_number":122,"context_line":"            # first, then claim resources in resource tracker on the"},{"line_number":123,"context_line":"            # destiation host based on these allocations."},{"line_number":124,"context_line":"            scheduler_utils.claim_resources_on_destination("},{"line_number":125,"context_line":"                self.context, self.report_client,"},{"line_number":126,"context_line":"                self.instance, source_node, dest_node,"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_a47031a7","line":123,"range":{"start_line":123,"start_character":14,"end_line":123,"end_character":24},"updated":"2020-03-26 16:08:49.000000000","message":"destination","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"59443995d378b81cd2b290025d2b82403e1d1fc6","unresolved":false,"context_lines":[{"line_number":120,"context_line":"            # NOTE(luyao): When forcing the target host we don\u0027t call the"},{"line_number":121,"context_line":"            # scheduler, that means we need to get allocations from placement"},{"line_number":122,"context_line":"            # first, then claim resources in resource tracker on the"},{"line_number":123,"context_line":"            # destiation host based on these allocations."},{"line_number":124,"context_line":"            scheduler_utils.claim_resources_on_destination("},{"line_number":125,"context_line":"                self.context, self.report_client,"},{"line_number":126,"context_line":"                self.instance, source_node, dest_node,"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_7e77ccd5","line":123,"range":{"start_line":123,"start_character":14,"end_line":123,"end_character":24},"in_reply_to":"df33271e_a47031a7","updated":"2020-03-27 09:04:41.000000000","message":"Done","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e858f0644e81a70e2b287b847c0b7a18ea0d9900","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                self.instance, source_node, dest_node,"},{"line_number":127,"context_line":"                source_allocations\u003dself._held_allocations,"},{"line_number":128,"context_line":"                consumer_generation\u003dNone)"},{"line_number":129,"context_line":"            try:"},{"line_number":130,"context_line":"                self._check_requested_destination()"},{"line_number":131,"context_line":"            except Exception:"},{"line_number":132,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":133,"context_line":"                    self._remove_host_allocations(dest_node.uuid)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"            # TODO(mriedem): Call select_destinations() with a"},{"line_number":136,"context_line":"            # skip_filters\u003dTrue flag so the scheduler does the work of claiming"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_c492959f","line":133,"range":{"start_line":129,"start_character":0,"end_line":133,"end_character":65},"updated":"2020-03-26 16:08:49.000000000","message":"This seems like something we should have been doing before. Would it make sense to drag this out into a separate patch?","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"59443995d378b81cd2b290025d2b82403e1d1fc6","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                self.instance, source_node, dest_node,"},{"line_number":127,"context_line":"                source_allocations\u003dself._held_allocations,"},{"line_number":128,"context_line":"                consumer_generation\u003dNone)"},{"line_number":129,"context_line":"            try:"},{"line_number":130,"context_line":"                self._check_requested_destination()"},{"line_number":131,"context_line":"            except Exception:"},{"line_number":132,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":133,"context_line":"                    self._remove_host_allocations(dest_node.uuid)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"            # TODO(mriedem): Call select_destinations() with a"},{"line_number":136,"context_line":"            # skip_filters\u003dTrue flag so the scheduler does the work of claiming"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_9e7c50b6","line":133,"range":{"start_line":129,"start_character":0,"end_line":133,"end_character":65},"in_reply_to":"df33271e_c492959f","updated":"2020-03-27 09:04:41.000000000","message":"Done","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e858f0644e81a70e2b287b847c0b7a18ea0d9900","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":133,"context_line":"                    self._remove_host_allocations(dest_node.uuid)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"            # TODO(mriedem): Call select_destinations() with a"},{"line_number":136,"context_line":"            # skip_filters\u003dTrue flag so the scheduler does the work of claiming"},{"line_number":137,"context_line":"            # resources on the destination in Placement but still bypass the"},{"line_number":138,"context_line":"            # scheduler filters, which honors the \u0027force\u0027 flag in the API."},{"line_number":139,"context_line":"            # This raises NoValidHost which will be handled in"},{"line_number":140,"context_line":"            # ComputeTaskManager."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"            # dest_node is a ComputeNode object, so we need to get the actual"},{"line_number":143,"context_line":"            # node name off it to set in the Migration object below."}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_045f5d0e","line":140,"range":{"start_line":135,"start_character":0,"end_line":140,"end_character":33},"updated":"2020-03-26 16:08:49.000000000","message":"This TODO still belongs above the call to \u0027claim_resources_on_destination\u0027, right?","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"59443995d378b81cd2b290025d2b82403e1d1fc6","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":133,"context_line":"                    self._remove_host_allocations(dest_node.uuid)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"            # TODO(mriedem): Call select_destinations() with a"},{"line_number":136,"context_line":"            # skip_filters\u003dTrue flag so the scheduler does the work of claiming"},{"line_number":137,"context_line":"            # resources on the destination in Placement but still bypass the"},{"line_number":138,"context_line":"            # scheduler filters, which honors the \u0027force\u0027 flag in the API."},{"line_number":139,"context_line":"            # This raises NoValidHost which will be handled in"},{"line_number":140,"context_line":"            # ComputeTaskManager."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"            # dest_node is a ComputeNode object, so we need to get the actual"},{"line_number":143,"context_line":"            # node name off it to set in the Migration object below."}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_fe4c7c9f","line":140,"range":{"start_line":135,"start_character":0,"end_line":140,"end_character":33},"in_reply_to":"df33271e_045f5d0e","updated":"2020-03-27 09:04:41.000000000","message":"yeah","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e858f0644e81a70e2b287b847c0b7a18ea0d9900","unresolved":false,"context_lines":[{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        if has_vpmem and not supports_vpmem_live_migration(self.context):"},{"line_number":283,"context_line":"            raise exception.MigrationPreCheckError("},{"line_number":284,"context_line":"                reason\u003d\"Cannot live migration with virtual persistent \""},{"line_number":285,"context_line":"                       \"memory, the operation is not supported.\")"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def _check_host_is_up(self, host):"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_04b47d34","line":284,"range":{"start_line":284,"start_character":36,"end_line":284,"end_character":45},"updated":"2020-03-26 16:08:49.000000000","message":"not related, but since you\u0027re indenting this:\n\n  Cannot live migrate","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"59443995d378b81cd2b290025d2b82403e1d1fc6","unresolved":false,"context_lines":[{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        if has_vpmem and not supports_vpmem_live_migration(self.context):"},{"line_number":283,"context_line":"            raise exception.MigrationPreCheckError("},{"line_number":284,"context_line":"                reason\u003d\"Cannot live migration with virtual persistent \""},{"line_number":285,"context_line":"                       \"memory, the operation is not supported.\")"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":"    def _check_host_is_up(self, host):"}],"source_content_type":"text/x-python","patch_set":20,"id":"df33271e_1e4a007f","line":284,"range":{"start_line":284,"start_character":36,"end_line":284,"end_character":45},"in_reply_to":"df33271e_04b47d34","updated":"2020-03-27 09:04:41.000000000","message":"Done","commit_id":"ce94b2e75aec59e5d2a451c5454485a88dd3f422"},{"author":{"_account_id":30209,"name":"Huaqiang","email":"huaqiang.wang@intel.com","username":"Huaqiang.Wang"},"change_message_id":"32540047e5c6a223bd515650f2fb978d2d59c678","unresolved":false,"context_lines":[{"line_number":252,"context_line":"                       \"the operation.\")"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def _check_can_migrate_specific_resources(self):"},{"line_number":255,"context_line":"        \"\"\"Checks that an instance can migrate with specific resources."},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        For virtual persistent memory resource:"},{"line_number":258,"context_line":"            1. check if Instance contains vpmem resources"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_f9caff4c","side":"PARENT","line":255,"updated":"2020-04-07 07:18:51.000000000","message":"q","commit_id":"565dfac7a659ac756b1fb8bd9fcdd30eae24b46f"},{"author":{"_account_id":30209,"name":"Huaqiang","email":"huaqiang.wang@intel.com","username":"Huaqiang.Wang"},"change_message_id":"32540047e5c6a223bd515650f2fb978d2d59c678","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    :returns: True if the compute hosts are new enough to support live"},{"line_number":55,"context_line":"              migration with vpmem"},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    return objects.Service.get_minimum_version(context, \u0027nova-compute\u0027) \u003e\u003d 51"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class LiveMigrationTask(base.TaskBase):"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_99b493d3","line":57,"updated":"2020-04-07 07:18:51.000000000","message":"Why don\u0027t you use \u0027get_minimum_version_all_cells\u0027? Seems \n\u0027get_minimum_version\u0027 only checks one db belonging to one cell.","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"345b7ae9aba686e63acfceb2b810cd1cee8b1ab5","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    :returns: True if the compute hosts are new enough to support live"},{"line_number":55,"context_line":"              migration with vpmem"},{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    return objects.Service.get_minimum_version(context, \u0027nova-compute\u0027) \u003e\u003d 51"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"class LiveMigrationTask(base.TaskBase):"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_f954bf56","line":57,"in_reply_to":"df33271e_99b493d3","updated":"2020-04-07 07:30:33.000000000","message":"In a multi-cell cloud, instances can be live migrated to a different host in the same cell, but not across cells.\n\nSo \u0027get_minimum_version\u0027 is enough I think.","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"}],"nova/objects/instance.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7a08de7aac87c5981518e1ebdf00a1ff4f71a556","unresolved":false,"context_lines":[{"line_number":1063,"context_line":"        current_values \u003d {}"},{"line_number":1064,"context_line":"        for attr_name in _MIGRATION_CONTEXT_ATTRS:"},{"line_number":1065,"context_line":"            current_values[attr_name] \u003d getattr(self, attr_name)"},{"line_number":1066,"context_line":"        if prefix \u003d\u003d \u0027old_\u0027:"},{"line_number":1067,"context_line":"            self.revert_migration_context()"},{"line_number":1068,"context_line":"        else:"},{"line_number":1069,"context_line":"            self.apply_migration_context()"}],"source_content_type":"text/x-python","patch_set":15,"id":"1fa4df85_e1d33cd4","line":1066,"updated":"2020-03-18 14:34:26.000000000","message":"I don\u0027t really like this. Not only the asymmetric use of just the old prefix, but also the change in behavior here. This used to only ever roll forward temporarily and now this can roll back. What\u0027s the point exactly? To be able to look at the instance the way it was before?","commit_id":"c62000be9598e44e7b14a050e711ec778cdbc4d5"}],"nova/objects/migrate_data.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"1c5f30d5d3c18266837e6bd0bde758d77ff54712","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        \u0027src_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":254,"context_line":"        \u0027dst_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":255,"context_line":"        \u0027dst_numa_info\u0027: fields.ObjectField(\u0027LibvirtLiveMigrateNUMAInfo\u0027),"},{"line_number":256,"context_line":"        \u0027dst_resources\u0027: fields.ObjectField(\u0027ResourceList\u0027),"},{"line_number":257,"context_line":"    }"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_844dd472","line":256,"updated":"2019-11-13 03:34:44.000000000","message":"why we didn\u0027t use migraiton context?","commit_id":"f983b7e87e2d81c95fd166e5cf10e1e7ec39b97b"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"022c1d1f437768476c497512fcf3f9ef852ceabd","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        \u0027src_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":254,"context_line":"        \u0027dst_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":255,"context_line":"        \u0027dst_numa_info\u0027: fields.ObjectField(\u0027LibvirtLiveMigrateNUMAInfo\u0027),"},{"line_number":256,"context_line":"        \u0027dst_resources\u0027: fields.ObjectField(\u0027ResourceList\u0027),"},{"line_number":257,"context_line":"    }"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_25364853","line":256,"in_reply_to":"3fa7e38b_133844ec","updated":"2019-11-14 06:27:05.000000000","message":"where? if we do that in _claim_resources in RT, we need parse the order from flavor extra spec for each specific resources. I think it is not we expect.","commit_id":"f983b7e87e2d81c95fd166e5cf10e1e7ec39b97b"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"657bf5dc98ef5f1258525394716ddedf47e8b154","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        \u0027src_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":254,"context_line":"        \u0027dst_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":255,"context_line":"        \u0027dst_numa_info\u0027: fields.ObjectField(\u0027LibvirtLiveMigrateNUMAInfo\u0027),"},{"line_number":256,"context_line":"        \u0027dst_resources\u0027: fields.ObjectField(\u0027ResourceList\u0027),"},{"line_number":257,"context_line":"    }"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_778ab364","line":256,"in_reply_to":"3fa7e38b_25364853","updated":"2019-11-14 07:30:15.000000000","message":"move it to LiveMigrateData may be better","commit_id":"f983b7e87e2d81c95fd166e5cf10e1e7ec39b97b"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"790a37b5eabd915c389d62b6699211c9f5893b6f","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        \u0027src_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":254,"context_line":"        \u0027dst_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":255,"context_line":"        \u0027dst_numa_info\u0027: fields.ObjectField(\u0027LibvirtLiveMigrateNUMAInfo\u0027),"},{"line_number":256,"context_line":"        \u0027dst_resources\u0027: fields.ObjectField(\u0027ResourceList\u0027),"},{"line_number":257,"context_line":"    }"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_1d1a6e6e","line":256,"in_reply_to":"3fa7e38b_577e97af","updated":"2019-11-15 09:22:54.000000000","message":"Yes, you\u0027re right.","commit_id":"f983b7e87e2d81c95fd166e5cf10e1e7ec39b97b"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"0a1f081c33cba020632a6ce490ac3a17d91e3455","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        \u0027src_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":254,"context_line":"        \u0027dst_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":255,"context_line":"        \u0027dst_numa_info\u0027: fields.ObjectField(\u0027LibvirtLiveMigrateNUMAInfo\u0027),"},{"line_number":256,"context_line":"        \u0027dst_resources\u0027: fields.ObjectField(\u0027ResourceList\u0027),"},{"line_number":257,"context_line":"    }"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_577e97af","line":256,"in_reply_to":"3fa7e38b_778ab364","updated":"2019-11-14 08:40:35.000000000","message":"The caim resource is on the destination node. But we needn\u0027t care about the order when we claim the resource.\n\nBefore we update the xml for target VM on the source node, we can calculate the order for the target vpmem based on flavor(correct me if understand wrong, I understand that you use flavor for the order).","commit_id":"f983b7e87e2d81c95fd166e5cf10e1e7ec39b97b"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"23fec4298ceda7147c85d1a6b8fb1b418601f290","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        \u0027src_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":254,"context_line":"        \u0027dst_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":255,"context_line":"        \u0027dst_numa_info\u0027: fields.ObjectField(\u0027LibvirtLiveMigrateNUMAInfo\u0027),"},{"line_number":256,"context_line":"        \u0027dst_resources\u0027: fields.ObjectField(\u0027ResourceList\u0027),"},{"line_number":257,"context_line":"    }"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_b265aeb1","line":256,"in_reply_to":"3fa7e38b_844dd472","updated":"2019-11-13 08:33:41.000000000","message":"we need the order, migr_ctxt doesn\u0027y have order.","commit_id":"f983b7e87e2d81c95fd166e5cf10e1e7ec39b97b"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"9f7db031bb1fe801629fc27f6fb6fa1b49e5c7dc","unresolved":false,"context_lines":[{"line_number":253,"context_line":"        \u0027src_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":254,"context_line":"        \u0027dst_supports_numa_live_migration\u0027: fields.BooleanField(),"},{"line_number":255,"context_line":"        \u0027dst_numa_info\u0027: fields.ObjectField(\u0027LibvirtLiveMigrateNUMAInfo\u0027),"},{"line_number":256,"context_line":"        \u0027dst_resources\u0027: fields.ObjectField(\u0027ResourceList\u0027),"},{"line_number":257,"context_line":"    }"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_133844ec","line":256,"in_reply_to":"3fa7e38b_b265aeb1","updated":"2019-11-13 12:32:08.000000000","message":"why you can\u0027t calculate that in source node?","commit_id":"f983b7e87e2d81c95fd166e5cf10e1e7ec39b97b"}],"nova/tests/unit/compute/test_compute_mgr.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9eb8787ad70aea61d6d9752a71217e0466738fa8","unresolved":false,"context_lines":[{"line_number":10143,"context_line":"            is_shared_instance_path\u003dTrue)"},{"line_number":10144,"context_line":"        migr_ctxt \u003d objects.MigrationContext()"},{"line_number":10145,"context_line":"        vpmem_resource \u003d objects.Resource("},{"line_number":10146,"context_line":"                provider_uuid\u003duuids.rp_uuid,"},{"line_number":10147,"context_line":"                resource_class\u003d\"CUSTOM_PMEM_NAMESPACE_4GB\","},{"line_number":10148,"context_line":"                identifier\u003d\u0027ns_0\u0027, metadata\u003dobjects.LibvirtVPMEMDevice("},{"line_number":10149,"context_line":"                    label\u003d\u00274GB\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_e8c98379","line":10146,"range":{"start_line":10146,"start_character":12,"end_line":10146,"end_character":16},"updated":"2020-04-07 10:47:29.000000000","message":"nit (here and below)","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6182b523f35d9ed2fa2066c81d896014a2860346","unresolved":false,"context_lines":[{"line_number":10143,"context_line":"            is_shared_instance_path\u003dTrue)"},{"line_number":10144,"context_line":"        migr_ctxt \u003d objects.MigrationContext()"},{"line_number":10145,"context_line":"        vpmem_resource \u003d objects.Resource("},{"line_number":10146,"context_line":"                provider_uuid\u003duuids.rp_uuid,"},{"line_number":10147,"context_line":"                resource_class\u003d\"CUSTOM_PMEM_NAMESPACE_4GB\","},{"line_number":10148,"context_line":"                identifier\u003d\u0027ns_0\u0027, metadata\u003dobjects.LibvirtVPMEMDevice("},{"line_number":10149,"context_line":"                    label\u003d\u00274GB\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_d3e9d480","line":10146,"range":{"start_line":10146,"start_character":12,"end_line":10146,"end_character":16},"in_reply_to":"df33271e_e8c98379","updated":"2020-04-07 13:15:10.000000000","message":"Done","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"}],"nova/tests/unit/virt/libvirt/test_migration.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9eb8787ad70aea61d6d9752a71217e0466738fa8","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        self.assertEqual(1, mock_tostring.called)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def test_update_device_resources_xml_vpmem(self):"},{"line_number":120,"context_line":"        xml \u003d textwrap.dedent(\"\"\""},{"line_number":121,"context_line":"            \u003cdomain\u003e"},{"line_number":122,"context_line":"                \u003cdevices\u003e"},{"line_number":123,"context_line":"                    \u003cmemory model\u003d\u0027nvdimm\u0027\u003e"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_28724b4a","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":11},"updated":"2020-04-07 10:47:29.000000000","message":"old_xml ?","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6182b523f35d9ed2fa2066c81d896014a2860346","unresolved":false,"context_lines":[{"line_number":117,"context_line":"        self.assertEqual(1, mock_tostring.called)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def test_update_device_resources_xml_vpmem(self):"},{"line_number":120,"context_line":"        xml \u003d textwrap.dedent(\"\"\""},{"line_number":121,"context_line":"            \u003cdomain\u003e"},{"line_number":122,"context_line":"                \u003cdevices\u003e"},{"line_number":123,"context_line":"                    \u003cmemory model\u003d\u0027nvdimm\u0027\u003e"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_5392e4f7","line":120,"range":{"start_line":120,"start_character":8,"end_line":120,"end_character":11},"in_reply_to":"df33271e_28724b4a","updated":"2020-04-07 13:15:10.000000000","message":"yup","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9eb8787ad70aea61d6d9752a71217e0466738fa8","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        res \u003d etree.tostring(migration._update_device_resources_xml("},{"line_number":171,"context_line":"                                copy.deepcopy(doc), new_resources),"},{"line_number":172,"context_line":"                             encoding\u003d\u0027unicode\u0027)"},{"line_number":173,"context_line":"        new_xml \u003d xml.replace(\"/dev/dax0.1\", \"/dev/dax1.0\")"},{"line_number":174,"context_line":"        new_xml \u003d new_xml.replace(\"/dev/dax0.2\", \"/dev/dax2.0\")"},{"line_number":175,"context_line":"        self.assertXmlEqual(res, new_xml)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def test_update_numa_xml(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_4877cf3b","line":174,"range":{"start_line":173,"start_character":0,"end_line":174,"end_character":63},"updated":"2020-04-07 10:47:29.000000000","message":"Could you move this to after xml so we can see the comparison easier? A comment would be helpful too","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6182b523f35d9ed2fa2066c81d896014a2860346","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        res \u003d etree.tostring(migration._update_device_resources_xml("},{"line_number":171,"context_line":"                                copy.deepcopy(doc), new_resources),"},{"line_number":172,"context_line":"                             encoding\u003d\u0027unicode\u0027)"},{"line_number":173,"context_line":"        new_xml \u003d xml.replace(\"/dev/dax0.1\", \"/dev/dax1.0\")"},{"line_number":174,"context_line":"        new_xml \u003d new_xml.replace(\"/dev/dax0.2\", \"/dev/dax2.0\")"},{"line_number":175,"context_line":"        self.assertXmlEqual(res, new_xml)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def test_update_numa_xml(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_ae802348","line":174,"range":{"start_line":173,"start_character":0,"end_line":174,"end_character":63},"in_reply_to":"df33271e_4877cf3b","updated":"2020-04-07 13:15:10.000000000","message":"I prefer keeping this new_xml here since the updated vpmem info is from new_resources above. I\u0027ll add comment to make it clear.","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"23df57e5f5a353a5e10bed081ece9c36be0f5a67","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        res \u003d etree.tostring(migration._update_device_resources_xml("},{"line_number":171,"context_line":"                                copy.deepcopy(doc), new_resources),"},{"line_number":172,"context_line":"                             encoding\u003d\u0027unicode\u0027)"},{"line_number":173,"context_line":"        new_xml \u003d xml.replace(\"/dev/dax0.1\", \"/dev/dax1.0\")"},{"line_number":174,"context_line":"        new_xml \u003d new_xml.replace(\"/dev/dax0.2\", \"/dev/dax2.0\")"},{"line_number":175,"context_line":"        self.assertXmlEqual(res, new_xml)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def test_update_numa_xml(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_78c0a0e1","line":174,"range":{"start_line":173,"start_character":0,"end_line":174,"end_character":63},"in_reply_to":"df33271e_ae802348","updated":"2020-04-07 15:44:16.000000000","message":"Yup, comment makes it clearer","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"23df57e5f5a353a5e10bed081ece9c36be0f5a67","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                             encoding\u003d\u0027unicode\u0027)"},{"line_number":177,"context_line":"        # we expect vpmem info will be updated in xml after invoking"},{"line_number":178,"context_line":"        # _update_device_resources_xml"},{"line_number":179,"context_line":"        new_xml \u003d old_xml.replace(\"/dev/dax0.1\", \"/dev/dax1.0\")"},{"line_number":180,"context_line":"        new_xml \u003d new_xml.replace(\"/dev/dax0.2\", \"/dev/dax2.0\")"},{"line_number":181,"context_line":"        self.assertXmlEqual(res, new_xml)"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"df33271e_38a61855","line":179,"updated":"2020-04-07 15:44:16.000000000","message":"nit: Adding \n\n  new_xml \u003d old_xml\n\nbefore these lines would make this clearer, IMO","commit_id":"4bd5af66b55b1ac5e5fa654eb31bf90616d62256"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"23df57e5f5a353a5e10bed081ece9c36be0f5a67","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        # _update_device_resources_xml"},{"line_number":179,"context_line":"        new_xml \u003d old_xml.replace(\"/dev/dax0.1\", \"/dev/dax1.0\")"},{"line_number":180,"context_line":"        new_xml \u003d new_xml.replace(\"/dev/dax0.2\", \"/dev/dax2.0\")"},{"line_number":181,"context_line":"        self.assertXmlEqual(res, new_xml)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def test_update_numa_xml(self):"},{"line_number":184,"context_line":"        xml \u003d textwrap.dedent(\"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"df33271e_18b19490","line":181,"range":{"start_line":181,"start_character":28,"end_line":181,"end_character":40},"updated":"2020-04-07 15:44:16.000000000","message":"These are backwards, I think. It should be:\n\n  self.assertXmlEqual(expected, actual)\n\nso:\n\n  self.assertXmlEqual(new_xml, res)","commit_id":"4bd5af66b55b1ac5e5fa654eb31bf90616d62256"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"1416d91e2757264e276769f47182521dc8de22e3","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        # _update_device_resources_xml"},{"line_number":179,"context_line":"        new_xml \u003d old_xml.replace(\"/dev/dax0.1\", \"/dev/dax1.0\")"},{"line_number":180,"context_line":"        new_xml \u003d new_xml.replace(\"/dev/dax0.2\", \"/dev/dax2.0\")"},{"line_number":181,"context_line":"        self.assertXmlEqual(res, new_xml)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def test_update_numa_xml(self):"},{"line_number":184,"context_line":"        xml \u003d textwrap.dedent(\"\"\""}],"source_content_type":"text/x-python","patch_set":24,"id":"df33271e_fbebf30e","line":181,"range":{"start_line":181,"start_character":28,"end_line":181,"end_character":40},"in_reply_to":"df33271e_18b19490","updated":"2020-04-08 04:08:32.000000000","message":"yeah you\u0027re right, and it seems that most of other tests here have the same issue","commit_id":"4bd5af66b55b1ac5e5fa654eb31bf90616d62256"}],"nova/virt/driver.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"b1e9ba8a58177c11c8f65594d220ad5a779b2037","unresolved":false,"context_lines":[{"line_number":1831,"context_line":"        \"\"\""},{"line_number":1832,"context_line":"        return False"},{"line_number":1833,"context_line":""},{"line_number":1834,"context_line":"    def cleanup_specific_resources(self, instance):"},{"line_number":1835,"context_line":"        \"\"\"Cleanup specific resources, e.g virtual persistent memory.\"\"\""},{"line_number":1836,"context_line":"        pass"},{"line_number":1837,"context_line":""},{"line_number":1838,"context_line":""},{"line_number":1839,"context_line":"def load_compute_driver(virtapi, compute_driver\u003dNone):"}],"source_content_type":"text/x-python","patch_set":16,"id":"df33271e_171348b7","line":1836,"range":{"start_line":1834,"start_character":4,"end_line":1836,"end_character":12},"updated":"2020-03-24 06:27:34.000000000","message":"this feel like the part of next patch also.","commit_id":"76af67a09b2e3b46de6a12b9a74bcd1c67a54425"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5eab18354e147da85ec064e5f93b7fa6e8d0f3cf","unresolved":false,"context_lines":[{"line_number":8023,"context_line":"        migrate_data.dst_numa_info \u003d self._get_live_migrate_numa_info("},{"line_number":8024,"context_line":"                claim.claimed_numa_topology, claim.instance_type,"},{"line_number":8025,"context_line":"                claim.image_meta)"},{"line_number":8026,"context_line":"        migrate_data.dst_resources \u003d self._get_ordered_resources("},{"line_number":8027,"context_line":"                instance, instance.flavor)"},{"line_number":8028,"context_line":"        return migrate_data"},{"line_number":8029,"context_line":""},{"line_number":8030,"context_line":"    def _get_ordered_resources(self, instance, flavor):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_f73b03e7","line":8027,"range":{"start_line":8026,"start_character":37,"end_line":8027,"end_character":42},"updated":"2019-11-14 08:47:32.000000000","message":"so here, you already use migration_context to get the order pmem.","commit_id":"f983b7e87e2d81c95fd166e5cf10e1e7ec39b97b"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"90a37f1d80a6aa7dcb242ccaa0d6a241f81a903a","unresolved":false,"context_lines":[{"line_number":7968,"context_line":"                claim.image_meta)"},{"line_number":7969,"context_line":"        # sort instance.migration_context.new_resources, and use it bring"},{"line_number":7970,"context_line":"        # destination ordered resources to source host, e.g. vpmem resouce"},{"line_number":7971,"context_line":"        self._sort_migrating_resources("},{"line_number":7972,"context_line":"                instance, instance.flavor, prefix\u003d\u0027new_\u0027)"},{"line_number":7973,"context_line":"        return migrate_data"},{"line_number":7974,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"df33271e_3735ac47","line":7971,"range":{"start_line":7971,"start_character":13,"end_line":7971,"end_character":39},"updated":"2020-03-24 06:24:17.000000000","message":"I don\u0027t know why we want to sort the resources at here. Can we sort the resources before \u0027libvirt_migrate.get_updated_guest_xml\u0027?\n\nJust like we sort resource just before build domain xml when booting new instance.","commit_id":"76af67a09b2e3b46de6a12b9a74bcd1c67a54425"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"90a37f1d80a6aa7dcb242ccaa0d6a241f81a903a","unresolved":false,"context_lines":[{"line_number":8500,"context_line":"                    self._detach_direct_passthrough_vifs(context,"},{"line_number":8501,"context_line":"                        migrate_data, instance)"},{"line_number":8502,"context_line":"                new_resources \u003d None"},{"line_number":8503,"context_line":"                if isinstance(instance, objects.Instance):"},{"line_number":8504,"context_line":"                    migr_ctxt \u003d instance.migration_context"},{"line_number":8505,"context_line":"                    if migr_ctxt and \u0027new_resources\u0027 in migr_ctxt:"},{"line_number":8506,"context_line":"                        new_resources \u003d migr_ctxt.new_resources"}],"source_content_type":"text/x-python","patch_set":16,"id":"df33271e_57c83054","line":8503,"range":{"start_line":8503,"start_character":16,"end_line":8503,"end_character":58},"updated":"2020-03-24 06:24:17.000000000","message":"When we have instance is not the object?","commit_id":"76af67a09b2e3b46de6a12b9a74bcd1c67a54425"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"7c3f412217f20c3929538d860f6c7959206fd109","unresolved":false,"context_lines":[{"line_number":8500,"context_line":"                    self._detach_direct_passthrough_vifs(context,"},{"line_number":8501,"context_line":"                        migrate_data, instance)"},{"line_number":8502,"context_line":"                new_resources \u003d None"},{"line_number":8503,"context_line":"                if isinstance(instance, objects.Instance):"},{"line_number":8504,"context_line":"                    migr_ctxt \u003d instance.migration_context"},{"line_number":8505,"context_line":"                    if migr_ctxt and \u0027new_resources\u0027 in migr_ctxt:"},{"line_number":8506,"context_line":"                        new_resources \u003d migr_ctxt.new_resources"}],"source_content_type":"text/x-python","patch_set":16,"id":"df33271e_e639d341","line":8503,"range":{"start_line":8503,"start_character":16,"end_line":8503,"end_character":58},"in_reply_to":"df33271e_57c83054","updated":"2020-03-24 09:50:42.000000000","message":"in many tests it\u0027s not object, not sure in real env.","commit_id":"76af67a09b2e3b46de6a12b9a74bcd1c67a54425"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"1722003495e66473c8b81ff1be7841c475decfa8","unresolved":false,"context_lines":[{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":"    def cleanup(self, context, instance, network_info, block_device_info\u003dNone,"},{"line_number":1295,"context_line":"                destroy_disks\u003dTrue, migrate_data\u003dNone, destroy_vifs\u003dTrue):"},{"line_number":1296,"context_line":"        self._cleanup_specific_resources(instance)"},{"line_number":1297,"context_line":""},{"line_number":1298,"context_line":"        if destroy_vifs:"},{"line_number":1299,"context_line":"            self._unplug_vifs(instance, network_info, True)"}],"source_content_type":"text/x-python","patch_set":18,"id":"df33271e_f49fafb1","line":1296,"range":{"start_line":1296,"start_character":8,"end_line":1296,"end_character":50},"updated":"2020-03-24 23:20:39.000000000","message":"you forget to remove this, since you move this to next patch","commit_id":"dd198a176ba173b16b0e527a522050bb29f24c0c"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"0dbe4d4ca352292cd2c323212e2de84399a5918a","unresolved":false,"context_lines":[{"line_number":1293,"context_line":""},{"line_number":1294,"context_line":"    def cleanup(self, context, instance, network_info, block_device_info\u003dNone,"},{"line_number":1295,"context_line":"                destroy_disks\u003dTrue, migrate_data\u003dNone, destroy_vifs\u003dTrue):"},{"line_number":1296,"context_line":"        self._cleanup_specific_resources(instance)"},{"line_number":1297,"context_line":""},{"line_number":1298,"context_line":"        if destroy_vifs:"},{"line_number":1299,"context_line":"            self._unplug_vifs(instance, network_info, True)"}],"source_content_type":"text/x-python","patch_set":18,"id":"df33271e_8adc3875","line":1296,"range":{"start_line":1296,"start_character":8,"end_line":1296,"end_character":50},"in_reply_to":"df33271e_f49fafb1","updated":"2020-03-25 03:01:41.000000000","message":"Done","commit_id":"dd198a176ba173b16b0e527a522050bb29f24c0c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"9eb8787ad70aea61d6d9752a71217e0466738fa8","unresolved":false,"context_lines":[{"line_number":8842,"context_line":"        n \u003d 0"},{"line_number":8843,"context_line":"        start \u003d time.time()"},{"line_number":8844,"context_line":"        is_post_copy_enabled \u003d self._is_post_copy_enabled(migration_flags)"},{"line_number":8845,"context_line":"        has_vpmem \u003d True if self._get_vpmems(instance) else False"},{"line_number":8846,"context_line":"        # vpmem does not support post copy"},{"line_number":8847,"context_line":"        is_post_copy_enabled \u0026\u003d not has_vpmem"},{"line_number":8848,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_e838633c","line":8845,"range":{"start_line":8845,"start_character":20,"end_line":8845,"end_character":65},"updated":"2020-04-07 10:47:29.000000000","message":"bool(self._get_vpmems(instance))","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"6182b523f35d9ed2fa2066c81d896014a2860346","unresolved":false,"context_lines":[{"line_number":8842,"context_line":"        n \u003d 0"},{"line_number":8843,"context_line":"        start \u003d time.time()"},{"line_number":8844,"context_line":"        is_post_copy_enabled \u003d self._is_post_copy_enabled(migration_flags)"},{"line_number":8845,"context_line":"        has_vpmem \u003d True if self._get_vpmems(instance) else False"},{"line_number":8846,"context_line":"        # vpmem does not support post copy"},{"line_number":8847,"context_line":"        is_post_copy_enabled \u0026\u003d not has_vpmem"},{"line_number":8848,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":23,"id":"df33271e_0e94af43","line":8845,"range":{"start_line":8845,"start_character":20,"end_line":8845,"end_character":65},"in_reply_to":"df33271e_e838633c","updated":"2020-04-07 13:15:10.000000000","message":"Done","commit_id":"c04e5faab1d4bf84bc063778538302d91b6b31f1"}],"nova/virt/libvirt/migration.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"5eab18354e147da85ec064e5f93b7fa6e8d0f3cf","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    return ports"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def get_updated_guest_xml(guest, migrate_data, get_volume_config,"},{"line_number":84,"context_line":"                          get_vif_config\u003dNone):"},{"line_number":85,"context_line":"    xml_doc \u003d etree.fromstring(guest.get_xml_desc(dump_migratable\u003dTrue))"},{"line_number":86,"context_line":"    xml_doc \u003d _update_graphics_xml(xml_doc, migrate_data)"},{"line_number":87,"context_line":"    xml_doc \u003d _update_serial_xml(xml_doc, migrate_data)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_b706eb20","line":84,"range":{"start_line":83,"start_character":26,"end_line":84,"end_character":45},"updated":"2019-11-14 08:47:32.000000000","message":"can we pass the ordered pmem into this method? the order vpmems are gotten by calling virtdriver._get_ordered_resources","commit_id":"f983b7e87e2d81c95fd166e5cf10e1e7ec39b97b"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"790a37b5eabd915c389d62b6699211c9f5893b6f","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    return ports"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"def get_updated_guest_xml(guest, migrate_data, get_volume_config,"},{"line_number":84,"context_line":"                          get_vif_config\u003dNone):"},{"line_number":85,"context_line":"    xml_doc \u003d etree.fromstring(guest.get_xml_desc(dump_migratable\u003dTrue))"},{"line_number":86,"context_line":"    xml_doc \u003d _update_graphics_xml(xml_doc, migrate_data)"},{"line_number":87,"context_line":"    xml_doc \u003d _update_serial_xml(xml_doc, migrate_data)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_627421d1","line":84,"range":{"start_line":83,"start_character":26,"end_line":84,"end_character":45},"in_reply_to":"3fa7e38b_b706eb20","updated":"2019-11-15 09:22:54.000000000","message":"Yeah, It should work.","commit_id":"f983b7e87e2d81c95fd166e5cf10e1e7ec39b97b"}]}
