)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8c6d04f4c41605c69f5627efc41da66581b76b3a","unresolved":false,"context_lines":[{"line_number":16,"context_line":"exist, so we need to introduce a way of creating it."},{"line_number":17,"context_line":"This script should be executed while upgrading to Stein release."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"[1] https://review.openstack.org/#/c/591607"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: Ic26d4ce3d071691a621d3c925dc5cd436b2005f1"},{"line_number":22,"context_line":"Related-Bug: 1751923"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"1f769fc5_472599c1","line":19,"updated":"2019-01-02 18:31:54.000000000","message":"The order in which these patches have been produced is incorrect. This patch containing the data migration should be a dependency for the other one -- in other words, you should do a git rebase -i and re-order the patches in reverse.","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cd2a07cffab9330aa90ead073c1e77e3aff46cc1","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In change [1] we modified _heal_instance_info_cache periodic task"},{"line_number":10,"context_line":"to use Neutron point of view while rebuilding InstanceInfoCache"},{"line_number":11,"context_line":"objets."},{"line_number":12,"context_line":"The crucial point was how we know the previous order of ports, if"},{"line_number":13,"context_line":"the cache was broken. We decided to use VirtualInterfaceList objects"},{"line_number":14,"context_line":"as source of port order."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"bfdaf3ff_0e96c0f1","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":6},"updated":"2019-01-16 15:40:24.000000000","message":"objects","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"8b14ddbcd709edc6ffcfca41d8587626016b2302","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"In change [1] we modified _heal_instance_info_cache periodic task"},{"line_number":10,"context_line":"to use Neutron point of view while rebuilding InstanceInfoCache"},{"line_number":11,"context_line":"objets."},{"line_number":12,"context_line":"The crucial point was how we know the previous order of ports, if"},{"line_number":13,"context_line":"the cache was broken. We decided to use VirtualInterfaceList objects"},{"line_number":14,"context_line":"as source of port order."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"bfdaf3ff_a009b12c","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":6},"in_reply_to":"bfdaf3ff_0e96c0f1","updated":"2019-01-17 06:43:36.000000000","message":"good catch!","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"}],"nova/cmd/manage.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ae2574c56f1cffd56ba1fc81da0122c7c4e87e98","unresolved":false,"context_lines":[{"line_number":417,"context_line":"        instance_mapping_obj.populate_queued_for_delete,"},{"line_number":418,"context_line":"        # Added in Stein"},{"line_number":419,"context_line":"        compute_node_obj.migrate_empty_ratio,"},{"line_number":420,"context_line":"        virtual_interface_obj.fill_virtual_interface_list,"},{"line_number":421,"context_line":"    )"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"bfdaf3ff_64e20b32","line":420,"updated":"2019-01-16 16:31:05.000000000","message":"nit: Add the \"Added in Stein\" comment.","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"8b14ddbcd709edc6ffcfca41d8587626016b2302","unresolved":false,"context_lines":[{"line_number":417,"context_line":"        instance_mapping_obj.populate_queued_for_delete,"},{"line_number":418,"context_line":"        # Added in Stein"},{"line_number":419,"context_line":"        compute_node_obj.migrate_empty_ratio,"},{"line_number":420,"context_line":"        virtual_interface_obj.fill_virtual_interface_list,"},{"line_number":421,"context_line":"    )"},{"line_number":422,"context_line":""},{"line_number":423,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"bfdaf3ff_3d03aa11","line":420,"in_reply_to":"bfdaf3ff_64e20b32","updated":"2019-01-17 06:43:36.000000000","message":"Ah, okey! That needs to be for every entry, even the previous one also relates to the same release. I\u0027ll do that thanks :)!","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"}],"nova/objects/virtual_interface.py":[{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"e91032492bc7e1181b04235d9ddec0d602345ad7","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            vif_obj.address \u003d port.get(\u0027address\u0027)"},{"line_number":169,"context_line":"            vif_obj.instance_uuid \u003d instance.get(\u0027uuid\u0027)"},{"line_number":170,"context_line":"            # Find tag from previous VirtualInterface object if exist."},{"line_number":171,"context_line":"            old_vif \u003d filter(lambda x: x.uuid\u003d\u003dport.get(\u0027id\u0027), old_vif_list)"},{"line_number":172,"context_line":"            vif_obj.tag \u003d old_vif[0].tag if len(old_vif) \u003e 0 else None"},{"line_number":173,"context_line":"            vif_obj.create()"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_74fc480b","line":171,"range":{"start_line":171,"start_character":22,"end_line":171,"end_character":76},"updated":"2018-10-30 10:56:49.000000000","message":"list comprehension?\n\n  [x for x in old_vif_list if x.uuid \u003d\u003d port.get(\u0027id\u0027)]","commit_id":"57637821a5a9b064ebe999a138d14256da961429"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"069dd37888e41ec776b51ffd06132fdebe336a27","unresolved":false,"context_lines":[{"line_number":168,"context_line":"            vif_obj.address \u003d port.get(\u0027address\u0027)"},{"line_number":169,"context_line":"            vif_obj.instance_uuid \u003d instance.get(\u0027uuid\u0027)"},{"line_number":170,"context_line":"            # Find tag from previous VirtualInterface object if exist."},{"line_number":171,"context_line":"            old_vif \u003d filter(lambda x: x.uuid\u003d\u003dport.get(\u0027id\u0027), old_vif_list)"},{"line_number":172,"context_line":"            vif_obj.tag \u003d old_vif[0].tag if len(old_vif) \u003e 0 else None"},{"line_number":173,"context_line":"            vif_obj.create()"},{"line_number":174,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_1bb83176","line":171,"range":{"start_line":171,"start_character":22,"end_line":171,"end_character":76},"in_reply_to":"3f79a3b5_74fc480b","updated":"2018-11-05 16:06:55.000000000","message":"Ok, I\u0027ll change that.","commit_id":"57637821a5a9b064ebe999a138d14256da961429"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8c6d04f4c41605c69f5627efc41da66581b76b3a","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            vif.destroy()"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        # Generate list based on current cache:"},{"line_number":166,"context_line":"        for port in nw_info:"},{"line_number":167,"context_line":"            vif_obj \u003d objects.VirtualInterface(cctxt)"},{"line_number":168,"context_line":"            vif_obj.uuid \u003d port.get(\u0027id\u0027)"},{"line_number":169,"context_line":"            vif_obj.address \u003d \"%s/%s\" % (port.get(\u0027address\u0027), port.get(\u0027id\u0027))"}],"source_content_type":"text/x-python","patch_set":9,"id":"1f769fc5_3a22f053","line":166,"range":{"start_line":166,"start_character":12,"end_line":166,"end_character":16},"updated":"2019-01-02 18:31:54.000000000","message":"the NetworkInfo is a list of VIFs, not ports...","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"c892e01913f687c3a3fa4f9182652a1fddb28367","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            vif.destroy()"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        # Generate list based on current cache:"},{"line_number":166,"context_line":"        for port in nw_info:"},{"line_number":167,"context_line":"            vif_obj \u003d objects.VirtualInterface(cctxt)"},{"line_number":168,"context_line":"            vif_obj.uuid \u003d port.get(\u0027id\u0027)"},{"line_number":169,"context_line":"            vif_obj.address \u003d \"%s/%s\" % (port.get(\u0027address\u0027), port.get(\u0027id\u0027))"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffd0ebdf_ac1a7f14","line":166,"range":{"start_line":166,"start_character":12,"end_line":166,"end_character":16},"in_reply_to":"1f769fc5_3a22f053","updated":"2019-01-03 13:29:28.000000000","message":"You\u0027re right :)","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8c6d04f4c41605c69f5627efc41da66581b76b3a","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        # Generate list based on current cache:"},{"line_number":166,"context_line":"        for port in nw_info:"},{"line_number":167,"context_line":"            vif_obj \u003d objects.VirtualInterface(cctxt)"},{"line_number":168,"context_line":"            vif_obj.uuid \u003d port.get(\u0027id\u0027)"},{"line_number":169,"context_line":"            vif_obj.address \u003d \"%s/%s\" % (port.get(\u0027address\u0027), port.get(\u0027id\u0027))"},{"line_number":170,"context_line":"            vif_obj.instance_uuid \u003d instance.get(\u0027uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1f769fc5_baffe0ff","line":167,"range":{"start_line":167,"start_character":47,"end_line":167,"end_character":52},"updated":"2019-01-02 18:31:54.000000000","message":"this should be \"context\" not \"cctxt\".","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"c892e01913f687c3a3fa4f9182652a1fddb28367","unresolved":false,"context_lines":[{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        # Generate list based on current cache:"},{"line_number":166,"context_line":"        for port in nw_info:"},{"line_number":167,"context_line":"            vif_obj \u003d objects.VirtualInterface(cctxt)"},{"line_number":168,"context_line":"            vif_obj.uuid \u003d port.get(\u0027id\u0027)"},{"line_number":169,"context_line":"            vif_obj.address \u003d \"%s/%s\" % (port.get(\u0027address\u0027), port.get(\u0027id\u0027))"},{"line_number":170,"context_line":"            vif_obj.instance_uuid \u003d instance.get(\u0027uuid\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffd0ebdf_cc17c3ed","line":167,"range":{"start_line":167,"start_character":47,"end_line":167,"end_character":52},"in_reply_to":"1f769fc5_baffe0ff","updated":"2019-01-03 13:29:28.000000000","message":"Good catch! Thanks!!!","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8c6d04f4c41605c69f5627efc41da66581b76b3a","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        # Generate list based on current cache:"},{"line_number":166,"context_line":"        for port in nw_info:"},{"line_number":167,"context_line":"            vif_obj \u003d objects.VirtualInterface(cctxt)"},{"line_number":168,"context_line":"            vif_obj.uuid \u003d port.get(\u0027id\u0027)"},{"line_number":169,"context_line":"            vif_obj.address \u003d \"%s/%s\" % (port.get(\u0027address\u0027), port.get(\u0027id\u0027))"},{"line_number":170,"context_line":"            vif_obj.instance_uuid \u003d instance.get(\u0027uuid\u0027)"},{"line_number":171,"context_line":"            # Find tag from previous VirtualInterface object if exist."}],"source_content_type":"text/x-python","patch_set":9,"id":"1f769fc5_9a5a2428","line":168,"range":{"start_line":168,"start_character":27,"end_line":168,"end_character":41},"updated":"2019-01-02 18:31:54.000000000","message":"here and throughout, use port[\u0027id\u0027] if the field in the dict is expected to exist. The way that get() is used here and throughout will essentially hide data corruption errors.","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"c892e01913f687c3a3fa4f9182652a1fddb28367","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        # Generate list based on current cache:"},{"line_number":166,"context_line":"        for port in nw_info:"},{"line_number":167,"context_line":"            vif_obj \u003d objects.VirtualInterface(cctxt)"},{"line_number":168,"context_line":"            vif_obj.uuid \u003d port.get(\u0027id\u0027)"},{"line_number":169,"context_line":"            vif_obj.address \u003d \"%s/%s\" % (port.get(\u0027address\u0027), port.get(\u0027id\u0027))"},{"line_number":170,"context_line":"            vif_obj.instance_uuid \u003d instance.get(\u0027uuid\u0027)"},{"line_number":171,"context_line":"            # Find tag from previous VirtualInterface object if exist."}],"source_content_type":"text/x-python","patch_set":9,"id":"ffd0ebdf_2cdc4f45","line":168,"range":{"start_line":168,"start_character":27,"end_line":168,"end_character":41},"in_reply_to":"1f769fc5_9a5a2428","updated":"2019-01-03 13:29:28.000000000","message":"Ok, I\u0027ll do the same with uuid of instance in vif object.","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8c6d04f4c41605c69f5627efc41da66581b76b3a","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                if instance.uuid \u003d\u003d FAKE_UUID:"},{"line_number":192,"context_line":"                    continue"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"                instance_info_caches \u003d objects.InstanceInfoCache.\\"},{"line_number":195,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"                vif_list \u003d VirtualInterfaceList.\\"}],"source_content_type":"text/x-python","patch_set":9,"id":"1f769fc5_da873c61","line":194,"range":{"start_line":194,"start_character":16,"end_line":194,"end_character":36},"updated":"2019-01-02 18:31:54.000000000","message":"it is a singular object, not plural. Just call it info_cache, not instance_info_caches...","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"c892e01913f687c3a3fa4f9182652a1fddb28367","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                if instance.uuid \u003d\u003d FAKE_UUID:"},{"line_number":192,"context_line":"                    continue"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"                instance_info_caches \u003d objects.InstanceInfoCache.\\"},{"line_number":195,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"                vif_list \u003d VirtualInterfaceList.\\"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffd0ebdf_acefdfe7","line":194,"range":{"start_line":194,"start_character":16,"end_line":194,"end_character":36},"in_reply_to":"1f769fc5_da873c61","updated":"2019-01-03 13:29:28.000000000","message":"yhm, right, thanks","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8c6d04f4c41605c69f5627efc41da66581b76b3a","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                    continue"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"                instance_info_caches \u003d objects.InstanceInfoCache.\\"},{"line_number":195,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"                vif_list \u003d VirtualInterfaceList.\\"},{"line_number":198,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"}],"source_content_type":"text/x-python","patch_set":9,"id":"1f769fc5_fab8f82a","line":195,"updated":"2019-01-02 18:31:54.000000000","message":"you are not properly handling InstanceInfoCacheNotFound:\n\nhttps://github.com/openstack/nova/blob/357b8b38e88300948bb2e07d1bbaabd1e9d7b60e/nova/objects/instance_info_cache.py#L70","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"c892e01913f687c3a3fa4f9182652a1fddb28367","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                    continue"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"                instance_info_caches \u003d objects.InstanceInfoCache.\\"},{"line_number":195,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"                vif_list \u003d VirtualInterfaceList.\\"},{"line_number":198,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"}],"source_content_type":"text/x-python","patch_set":9,"id":"ffd0ebdf_5cf702f7","line":195,"in_reply_to":"1f769fc5_fab8f82a","updated":"2019-01-03 13:29:28.000000000","message":"Yep, you\u0027re right. I fixed that. I also checked VirtualInterfaceList.get_by_instance_uuid and in case of empty VirtualInterfaceList in the db it returns [] so we\u0027re ok there.","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8c6d04f4c41605c69f5627efc41da66581b76b3a","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"                # This should be list with proper order of ports,"},{"line_number":205,"context_line":"                # but we\u0027re not sure about that."},{"line_number":206,"context_line":"                port_ids \u003d [nw.get(\u0027id\u0027) for nw in nw_info]"},{"line_number":207,"context_line":"                # This is ordered list"},{"line_number":208,"context_line":"                vif_ids \u003d [vif.uuid for vif in vif_list]"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1f769fc5_7a0f08e1","line":206,"range":{"start_line":206,"start_character":16,"end_line":206,"end_character":59},"updated":"2019-01-02 18:31:54.000000000","message":"NetworkInfo is a list of VIFs, not ports.\n\nThis really should be:\n\n nw_info \u003d info_cache.network_info\n cached_vif_ids \u003d [vif[\u0027id\u0027] for vif in nw_info]\n db_vif_ids \u003d [vif.uuid for vif in vif_list]\n\n if cached_vif_ids \u003d\u003d db_vif_ids:\n     continue\n ...","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"c892e01913f687c3a3fa4f9182652a1fddb28367","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"                # This should be list with proper order of ports,"},{"line_number":205,"context_line":"                # but we\u0027re not sure about that."},{"line_number":206,"context_line":"                port_ids \u003d [nw.get(\u0027id\u0027) for nw in nw_info]"},{"line_number":207,"context_line":"                # This is ordered list"},{"line_number":208,"context_line":"                vif_ids \u003d [vif.uuid for vif in vif_list]"},{"line_number":209,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"ffd0ebdf_d9c1c430","line":206,"range":{"start_line":206,"start_character":16,"end_line":206,"end_character":59},"in_reply_to":"1f769fc5_7a0f08e1","updated":"2019-01-03 13:29:28.000000000","message":"Ok, will be clear.","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8c6d04f4c41605c69f5627efc41da66581b76b3a","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                elif len(vif_ids) \u003e len(port_ids):"},{"line_number":226,"context_line":"                    # Seems vif list is inconsistent with cache."},{"line_number":227,"context_line":"                    # it could be a broken cache or interface"},{"line_number":228,"context_line":"                    # during attach. Do nothing."},{"line_number":229,"context_line":"                    continue"},{"line_number":230,"context_line":"                else:"},{"line_number":231,"context_line":"                    # The order is different between lists."}],"source_content_type":"text/x-python","patch_set":9,"id":"1f769fc5_ba2e0041","line":228,"updated":"2019-01-02 18:31:54.000000000","message":"How about logging a message here saying you got an unexpected number of VIF records in the database compared to what was stored in the instance_info_caches table?","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"c892e01913f687c3a3fa4f9182652a1fddb28367","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                elif len(vif_ids) \u003e len(port_ids):"},{"line_number":226,"context_line":"                    # Seems vif list is inconsistent with cache."},{"line_number":227,"context_line":"                    # it could be a broken cache or interface"},{"line_number":228,"context_line":"                    # during attach. Do nothing."},{"line_number":229,"context_line":"                    continue"},{"line_number":230,"context_line":"                else:"},{"line_number":231,"context_line":"                    # The order is different between lists."}],"source_content_type":"text/x-python","patch_set":9,"id":"ffd0ebdf_b9c40042","line":228,"in_reply_to":"1f769fc5_ba2e0041","updated":"2019-01-03 13:29:28.000000000","message":"Good idea. Done","commit_id":"131c4649f7057dc3c47d354659319b6527d05167"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"19861072f3da19333e1ab39b44189cdfa8d408f5","unresolved":false,"context_lines":[{"line_number":201,"context_line":"                                 \u0027NetworkInfo field. \u0027"},{"line_number":202,"context_line":"                                 \u0027Skipping build of VirtualInterfaceList.\u0027)"},{"line_number":203,"context_line":"                        continue"},{"line_number":204,"context_line":"                except exception.InstanceInfoCacheNotFound:"},{"line_number":205,"context_line":"                    LOG.info(\u0027Instance has no InstanceInfoCache object.\u0027"},{"line_number":206,"context_line":"                             \u0027Skipping build of VirtualInterfaceList for it.\u0027)"},{"line_number":207,"context_line":"                    continue"}],"source_content_type":"text/x-python","patch_set":13,"id":"dfd5e7cf_0f76f807","line":204,"updated":"2019-01-08 14:33:40.000000000","message":"✔","commit_id":"f72f5c52d152852dcecabbf592194addad185c74"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"19861072f3da19333e1ab39b44189cdfa8d408f5","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                    _regenerate_vif_list_base_on_cache(cctxt,"},{"line_number":251,"context_line":"                                                       instance,"},{"line_number":252,"context_line":"                                                       vif_list,"},{"line_number":253,"context_line":"                                                       nw_info)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"            # Set marker to point last checked instance."},{"line_number":256,"context_line":"            if instances:"}],"source_content_type":"text/x-python","patch_set":13,"id":"dfd5e7cf_0f9278f7","line":253,"updated":"2019-01-08 14:33:40.000000000","message":"relatively small nit: since the code on lines 229-234 and 248-253 is identical, it would have been fine to remove lines 224-234 entirely since the else: block would handle it.\n\nThat said, if you wanted to put some sort of LOG message in the conditional block in line 224-234 that differentiated the situation where len(db_vif_ids) \u003c len(cached_vif_ids), then the duplicate block of code would be more reasonable...","commit_id":"f72f5c52d152852dcecabbf592194addad185c74"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"ffd8b4c0db38dc885dd988d962d2e232b7e87225","unresolved":false,"context_lines":[{"line_number":250,"context_line":"                    _regenerate_vif_list_base_on_cache(cctxt,"},{"line_number":251,"context_line":"                                                       instance,"},{"line_number":252,"context_line":"                                                       vif_list,"},{"line_number":253,"context_line":"                                                       nw_info)"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"            # Set marker to point last checked instance."},{"line_number":256,"context_line":"            if instances:"}],"source_content_type":"text/x-python","patch_set":13,"id":"dfd5e7cf_5b8842c5","line":253,"in_reply_to":"dfd5e7cf_0f9278f7","updated":"2019-01-08 16:39:53.000000000","message":"After test on backup taken from my prod infra I feel good with adding at least uuid of instance to those logs.\nCool is also to have info that VirtualInterfaceList for particular instance has been touched. So going to add this.","commit_id":"f72f5c52d152852dcecabbf592194addad185c74"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"c90b2482fcd17e36f553c30b4b8b3cca987fdb72","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                                 \u0027Skipping build of VirtualInterfaceList.\u0027)"},{"line_number":203,"context_line":"                        continue"},{"line_number":204,"context_line":"                except exception.InstanceInfoCacheNotFound:"},{"line_number":205,"context_line":"                    LOG.info(\u0027Instance has no InstanceInfoCache object.\u0027"},{"line_number":206,"context_line":"                             \u0027Skipping build of VirtualInterfaceList for it.\u0027)"},{"line_number":207,"context_line":"                    continue"},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"dfd5e7cf_878f23cb","line":205,"range":{"start_line":205,"start_character":70,"end_line":205,"end_character":72},"updated":"2019-01-09 01:47:15.000000000","message":"nit: Add white space","commit_id":"9cd315ef07bacc3c70fc6db4efdbbd3048747f19"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"8c937782612da0a8a2a29b90732c8e9b8e06eb59","unresolved":false,"context_lines":[{"line_number":202,"context_line":"                                 \u0027Skipping build of VirtualInterfaceList.\u0027)"},{"line_number":203,"context_line":"                        continue"},{"line_number":204,"context_line":"                except exception.InstanceInfoCacheNotFound:"},{"line_number":205,"context_line":"                    LOG.info(\u0027Instance has no InstanceInfoCache object.\u0027"},{"line_number":206,"context_line":"                             \u0027Skipping build of VirtualInterfaceList for it.\u0027)"},{"line_number":207,"context_line":"                    continue"},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"dfd5e7cf_c9769907","line":205,"range":{"start_line":205,"start_character":70,"end_line":205,"end_character":72},"in_reply_to":"dfd5e7cf_878f23cb","updated":"2019-01-09 09:36:41.000000000","message":"eagle eye! thanks!","commit_id":"9cd315ef07bacc3c70fc6db4efdbbd3048747f19"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"8c937782612da0a8a2a29b90732c8e9b8e06eb59","unresolved":false,"context_lines":[{"line_number":220,"context_line":"                if cached_vif_ids \u003d\u003d db_vif_ids:"},{"line_number":221,"context_line":"                    # The list of vifs and its order in cache and in"},{"line_number":222,"context_line":"                    # virtual_interfaces is the same. So we could end here."},{"line_number":223,"context_line":"                    continue"},{"line_number":224,"context_line":"                elif len(db_vif_ids) \u003c len(cached_vif_ids):"},{"line_number":225,"context_line":"                    # Seems to be an instance from release older than"},{"line_number":226,"context_line":"                    # Newton and we don\u0027t have full VirtualInterfaceList for"}],"source_content_type":"text/x-python","patch_set":14,"id":"dfd5e7cf_69bbed71","line":223,"updated":"2019-01-09 09:36:41.000000000","message":"Meh meh.. Counter needs to be updated here. Otherwise if in batch of 50 instances there will be no migration the nova-manage will not try with next batch.","commit_id":"9cd315ef07bacc3c70fc6db4efdbbd3048747f19"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"c90b2482fcd17e36f553c30b4b8b3cca987fdb72","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                    # Seems vif list is inconsistent with cache."},{"line_number":241,"context_line":"                    # it could be a broken cache or interface"},{"line_number":242,"context_line":"                    # during attach. Do nothing."},{"line_number":243,"context_line":"                    LOG.info(\u0027Got an unexpected number of VIF records in the\u0027"},{"line_number":244,"context_line":"                             \u0027database compared to what was stored in the \u0027"},{"line_number":245,"context_line":"                             \u0027instance_info_caches table for instance %s. \u0027"},{"line_number":246,"context_line":"                             \u0027Perhaps it is an instance during interface \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"dfd5e7cf_279517e5","line":243,"range":{"start_line":243,"start_character":76,"end_line":243,"end_character":77},"updated":"2019-01-09 01:47:15.000000000","message":"nit: Add white space","commit_id":"9cd315ef07bacc3c70fc6db4efdbbd3048747f19"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"8c937782612da0a8a2a29b90732c8e9b8e06eb59","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                    # Seems vif list is inconsistent with cache."},{"line_number":241,"context_line":"                    # it could be a broken cache or interface"},{"line_number":242,"context_line":"                    # during attach. Do nothing."},{"line_number":243,"context_line":"                    LOG.info(\u0027Got an unexpected number of VIF records in the\u0027"},{"line_number":244,"context_line":"                             \u0027database compared to what was stored in the \u0027"},{"line_number":245,"context_line":"                             \u0027instance_info_caches table for instance %s. \u0027"},{"line_number":246,"context_line":"                             \u0027Perhaps it is an instance during interface \u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"dfd5e7cf_8962d13d","line":243,"range":{"start_line":243,"start_character":76,"end_line":243,"end_character":77},"in_reply_to":"dfd5e7cf_279517e5","updated":"2019-01-09 09:36:41.000000000","message":"eagle eye, thanks!","commit_id":"9cd315ef07bacc3c70fc6db4efdbbd3048747f19"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ae2574c56f1cffd56ba1fc81da0122c7c4e87e98","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            vif_obj.tag \u003d old_vif[0].tag if len(old_vif) \u003e 0 else None"},{"line_number":176,"context_line":"            vif_obj.create()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    cells \u003d objects.CellMappingList.get_all(context)"},{"line_number":179,"context_line":"    for cell in cells:"},{"line_number":180,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":181,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"}],"source_content_type":"text/x-python","patch_set":16,"id":"bfdaf3ff_84f92fc9","line":178,"range":{"start_line":178,"start_character":4,"end_line":178,"end_character":52},"updated":"2019-01-16 16:31:05.000000000","message":"This would fail if running this online data migration from a cell where [api_database]/connection is not configured, but I\u0027m assuming that operators are running the online data migrations with a fully populated nova.conf that has access to the at least the API DB, and if running from a cell they would also have [database]/connection set (we seem to be pretty fuzzy about this in our online data migrations).","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"8b14ddbcd709edc6ffcfca41d8587626016b2302","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            vif_obj.tag \u003d old_vif[0].tag if len(old_vif) \u003e 0 else None"},{"line_number":176,"context_line":"            vif_obj.create()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    cells \u003d objects.CellMappingList.get_all(context)"},{"line_number":179,"context_line":"    for cell in cells:"},{"line_number":180,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":181,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"}],"source_content_type":"text/x-python","patch_set":16,"id":"bfdaf3ff_5d0eae3b","line":178,"range":{"start_line":178,"start_character":4,"end_line":178,"end_character":52},"in_reply_to":"bfdaf3ff_04153f9c","updated":"2019-01-17 06:43:36.000000000","message":"We\u0027re assuming that operators runs the online_data_migrations on fully populated config. Maybe we could do a *big warning* in documentation about this?","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dca1418a64b5bd6e8e2b701ad99eee39b639dc79","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            vif_obj.tag \u003d old_vif[0].tag if len(old_vif) \u003e 0 else None"},{"line_number":176,"context_line":"            vif_obj.create()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    cells \u003d objects.CellMappingList.get_all(context)"},{"line_number":179,"context_line":"    for cell in cells:"},{"line_number":180,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":181,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"}],"source_content_type":"text/x-python","patch_set":16,"id":"bfdaf3ff_04153f9c","line":178,"range":{"start_line":178,"start_character":4,"end_line":178,"end_character":52},"in_reply_to":"bfdaf3ff_84f92fc9","updated":"2019-01-16 16:44:49.000000000","message":"For example, service_uuids_online_data_migration, migration_migrate_to_uuid, block_device_obj.BlockDeviceMapping.populate_uuids - none of those are multi-cell aware and have to be run per-cell database configuration. But populate_missing_availability_zones must be run per-cell and have API DB configuration since it hits the aggregates table. And the populate_queued_for_delete migration hits the API DB and cells, so we\u0027re kind of all over the board on what we do for online data migrations.","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ae2574c56f1cffd56ba1fc81da0122c7c4e87e98","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                sort_key\u003d\u0027created_at\u0027,"},{"line_number":187,"context_line":"                sort_dir\u003d\u0027asc\u0027,"},{"line_number":188,"context_line":"                marker\u003dmarker,"},{"line_number":189,"context_line":"                limit\u003dmax_count)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            for instance in instances:"},{"line_number":192,"context_line":"                # We don\u0027t want to fill vif for FAKE instance."}],"source_content_type":"text/x-python","patch_set":16,"id":"bfdaf3ff_8474cf69","line":189,"range":{"start_line":189,"start_character":22,"end_line":189,"end_character":31},"updated":"2019-01-16 16:31:05.000000000","message":"This is never decremented, which means you\u0027re going to process $max_limit instances from each cell, which could be more than the actual limit the user specified.","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"18b4c3f6bb3d3c527a27f2277cc3a425f521490b","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                sort_key\u003d\u0027created_at\u0027,"},{"line_number":187,"context_line":"                sort_dir\u003d\u0027asc\u0027,"},{"line_number":188,"context_line":"                marker\u003dmarker,"},{"line_number":189,"context_line":"                limit\u003dmax_count)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            for instance in instances:"},{"line_number":192,"context_line":"                # We don\u0027t want to fill vif for FAKE instance."}],"source_content_type":"text/x-python","patch_set":16,"id":"bfdaf3ff_02fe7d36","line":189,"range":{"start_line":189,"start_character":22,"end_line":189,"end_character":31},"in_reply_to":"bfdaf3ff_800eed2f","updated":"2019-01-17 13:21:10.000000000","message":"Hm. What if there is more instances to migrate than max_count? Those instances which are beyond max_count would not be migrated, and moreover, marker which is used here to mark last migrated instance would be used in… another cell :/","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"e5e3bf992a887293525d7591c9fa04ca8f5ed110","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                sort_key\u003d\u0027created_at\u0027,"},{"line_number":187,"context_line":"                sort_dir\u003d\u0027asc\u0027,"},{"line_number":188,"context_line":"                marker\u003dmarker,"},{"line_number":189,"context_line":"                limit\u003dmax_count)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            for instance in instances:"},{"line_number":192,"context_line":"                # We don\u0027t want to fill vif for FAKE instance."}],"source_content_type":"text/x-python","patch_set":16,"id":"bfdaf3ff_82b82d76","line":189,"range":{"start_line":189,"start_character":22,"end_line":189,"end_character":31},"in_reply_to":"bfdaf3ff_800eed2f","updated":"2019-01-17 13:22:34.000000000","message":"I need to decrease max_count and implement breakpoint to not step into next cell while on first I migrated max_count.\n\nhttps://github.com/openstack/nova/blob/master/nova/cmd/manage.py#L2076\n\nWithout this I will migrate:\nn instances from cell1\nn instances from cell2\nand at the end make a maker to point last migrated instance - so instance from cell2, that means it will no longer migrate instances that are left on cell1.\nVery good catch!!! thanks a lot!","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9671359387fa1d244057ae457266a53e556e2e56","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                sort_key\u003d\u0027created_at\u0027,"},{"line_number":187,"context_line":"                sort_dir\u003d\u0027asc\u0027,"},{"line_number":188,"context_line":"                marker\u003dmarker,"},{"line_number":189,"context_line":"                limit\u003dmax_count)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            for instance in instances:"},{"line_number":192,"context_line":"                # We don\u0027t want to fill vif for FAKE instance."}],"source_content_type":"text/x-python","patch_set":16,"id":"bfdaf3ff_2675d232","line":189,"range":{"start_line":189,"start_character":22,"end_line":189,"end_character":31},"in_reply_to":"bfdaf3ff_82b82d76","updated":"2019-01-17 15:15:48.000000000","message":"Yeah, this is maybe why a lot of the online data migrations don\u0027t deal with the complexity of trying to be mmulti-cell aware, and therefore are required to be run on a per-cell database basis, and therefore don\u0027t use the complicated marker logic, but the marker is sometimes necessary depending on the type of migration (generally when a record is missing, like request spec and vif here, but less useful in migrations that add missing uuids to services/compute_nodes/migrations records since those are just a simple query on *existing* records).\n\nSo the marker is probably important here as you\u0027re chugging through instances to find which are missing VIFs, but one could argue that making this multi-cell aware is unnecessary complexity. If it works properly, cool. The other downside though is anyone that runs online data migrations per cell with a lot of cells (cern) would end up running this on the first cell and completing it for all cells, and then run it again for every other cell even though everything has already been completed (but maybe the marker makes that essentially a noop?).","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5dd24d686bfee1a944f2b68bf66c88957da1de11","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                sort_key\u003d\u0027created_at\u0027,"},{"line_number":187,"context_line":"                sort_dir\u003d\u0027asc\u0027,"},{"line_number":188,"context_line":"                marker\u003dmarker,"},{"line_number":189,"context_line":"                limit\u003dmax_count)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            for instance in instances:"},{"line_number":192,"context_line":"                # We don\u0027t want to fill vif for FAKE instance."}],"source_content_type":"text/x-python","patch_set":16,"id":"bfdaf3ff_bf6f9c90","line":189,"range":{"start_line":189,"start_character":22,"end_line":189,"end_character":31},"in_reply_to":"bfdaf3ff_8474cf69","updated":"2019-01-16 17:12:53.000000000","message":"That\u0027s a good spot. I missed that","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"8b14ddbcd709edc6ffcfca41d8587626016b2302","unresolved":false,"context_lines":[{"line_number":186,"context_line":"                sort_key\u003d\u0027created_at\u0027,"},{"line_number":187,"context_line":"                sort_dir\u003d\u0027asc\u0027,"},{"line_number":188,"context_line":"                marker\u003dmarker,"},{"line_number":189,"context_line":"                limit\u003dmax_count)"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"            for instance in instances:"},{"line_number":192,"context_line":"                # We don\u0027t want to fill vif for FAKE instance."}],"source_content_type":"text/x-python","patch_set":16,"id":"bfdaf3ff_800eed2f","line":189,"range":{"start_line":189,"start_character":22,"end_line":189,"end_character":31},"in_reply_to":"bfdaf3ff_bf6f9c90","updated":"2019-01-17 06:43:36.000000000","message":"Ok, I\u0027ll check that!","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c0159db650b8e3cea539c635fbf5ff1012192fab","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            # We reached the limit of migrated instances per"},{"line_number":182,"context_line":"            # this function run."},{"line_number":183,"context_line":"            # Stop, do not go to other cell."},{"line_number":184,"context_line":"            break"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":187,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_26fb9247","line":184,"updated":"2019-01-17 15:26:46.000000000","message":"I don\u0027t see any new test coverage for this, which we should probably have given this was missed in the initial review. A simple way to test this would be to populate 2 cells with let\u0027s say 2 old instances, for a total of 4, and run the migration with max_count\u003d2 and assert that we only migrated the 2 instances from the first cell processed, and then run it again with the default max_count(50) and assert that only 2 more were migrated.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bb9932b3b7e1fe4839ee492df938e873f85be955","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            # We reached the limit of migrated instances per"},{"line_number":182,"context_line":"            # this function run."},{"line_number":183,"context_line":"            # Stop, do not go to other cell."},{"line_number":184,"context_line":"            break"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":187,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_86b03e8c","line":184,"in_reply_to":"bfdaf3ff_26fb9247","updated":"2019-01-17 15:28:21.000000000","message":"Note that by default the tests have 2 cells created (see TestCase.cell_mappings) one for cell0 and one for cell1, so you can create instances on a per-cell basis by targeting the instance creation specifically into those cell mappings. I can probably help write the test if needed.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"511f81c53a741ff9aca25b51ca895cc708a0f8cd","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            # We reached the limit of migrated instances per"},{"line_number":182,"context_line":"            # this function run."},{"line_number":183,"context_line":"            # Stop, do not go to other cell."},{"line_number":184,"context_line":"            break"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":187,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_a95755ca","line":184,"in_reply_to":"bfdaf3ff_26fb9247","updated":"2019-01-17 15:44:17.000000000","message":"Yes, this is missing. I\u0027ll add this test to cover that.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"511f81c53a741ff9aca25b51ca895cc708a0f8cd","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            # We reached the limit of migrated instances per"},{"line_number":182,"context_line":"            # this function run."},{"line_number":183,"context_line":"            # Stop, do not go to other cell."},{"line_number":184,"context_line":"            break"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":187,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_c9117906","line":184,"in_reply_to":"bfdaf3ff_86b03e8c","updated":"2019-01-17 15:44:17.000000000","message":"I can try this to force create in cell0 and cell1. In case of issues I\u0027ll msg you, thanks ;)","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0b87ac6a45ea972b2f9b9204e7d308cc6329b2ed","unresolved":false,"context_lines":[{"line_number":181,"context_line":"            # We reached the limit of migrated instances per"},{"line_number":182,"context_line":"            # this function run."},{"line_number":183,"context_line":"            # Stop, do not go to other cell."},{"line_number":184,"context_line":"            break"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":187,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_c9489988","line":184,"in_reply_to":"bfdaf3ff_c9117906","updated":"2019-01-17 16:01:31.000000000","message":"Here is an example of a test that creates an instance in a specific cell:\n\nhttps://github.com/openstack/nova/blob/968033d9da35d1f83ed9c7864cc8ff6d60614452/nova/tests/unit/test_fixtures.py#L519\n\nSimilar:\n\nhttps://github.com/openstack/nova/blob/4f5cb30a2f88965772bcbff0a19a1dcfcd3836c6/nova/tests/functional/compute/test_instance_list.py#L25","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"511f81c53a741ff9aca25b51ca895cc708a0f8cd","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":187,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"},{"line_number":188,"context_line":"            filters \u003d {\u0027deleted\u0027: False}"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"            # Adjust the limit of migrated instances."},{"line_number":191,"context_line":"            # If user wants to process a total of 100 instances"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_c92ad92a","line":188,"range":{"start_line":188,"start_character":12,"end_line":188,"end_character":19},"updated":"2019-01-17 15:44:17.000000000","message":"So this is also not needed, due cctxt does the job.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"7d0060c185c23321adc231cfde04a61949796c68","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":187,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"},{"line_number":188,"context_line":"            filters \u003d {\u0027deleted\u0027: False}"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"            # Adjust the limit of migrated instances."},{"line_number":191,"context_line":"            # If user wants to process a total of 100 instances"}],"source_content_type":"text/x-python","patch_set":17,"id":"9fdfeff1_6d21d0b4","line":188,"range":{"start_line":188,"start_character":12,"end_line":188,"end_character":19},"in_reply_to":"bfdaf3ff_54175c46","updated":"2019-01-23 14:04:56.000000000","message":"You\u0027re right. I need to filter out deleted instances explicity. I added a test to cover that.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0b87ac6a45ea972b2f9b9204e7d308cc6329b2ed","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":187,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"},{"line_number":188,"context_line":"            filters \u003d {\u0027deleted\u0027: False}"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"            # Adjust the limit of migrated instances."},{"line_number":191,"context_line":"            # If user wants to process a total of 100 instances"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_54175c46","line":188,"range":{"start_line":188,"start_character":12,"end_line":188,"end_character":19},"in_reply_to":"bfdaf3ff_c92ad92a","updated":"2019-01-17 16:01:31.000000000","message":"Well, InstanceList.get_by_filters is special....\n\nhttps://github.com/openstack/nova/blob/4f5cb30a2f88965772bcbff0a19a1dcfcd3836c6/nova/db/sqlalchemy/api.py#L2042\n\nIf you want to be sure, add a deleted instance to one of your tests to assert it\u0027s filtered out (make it old so we don\u0027t try to migrate it) - that should be pretty easy, just create an old instance and then delete it.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dbd104906589618cf32bd1d4e63b63693274458a","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"                vif_list \u003d VirtualInterfaceList.\\"},{"line_number":223,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"},{"line_number":224,"context_line":"                vif_list \u003d [x for x in vif_list if not x.deleted]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"                nw_info \u003d info_cache.network_info"},{"line_number":227,"context_line":"                # This should be list with proper order of vifs,"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_696badb6","line":224,"range":{"start_line":224,"start_character":48,"end_line":224,"end_character":64},"updated":"2019-01-17 15:38:58.000000000","message":"I\u0027m not sure this is necessary - the query above won\u0027t return deleted instances unless cctxt has read_deleted\u003d\u0027yes\u0027.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"52b789eaef31ff12e04a41dce929ffd48d793bca","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"                vif_list \u003d VirtualInterfaceList.\\"},{"line_number":223,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"},{"line_number":224,"context_line":"                vif_list \u003d [x for x in vif_list if not x.deleted]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"                nw_info \u003d info_cache.network_info"},{"line_number":227,"context_line":"                # This should be list with proper order of vifs,"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_545e7c12","line":224,"range":{"start_line":224,"start_character":48,"end_line":224,"end_character":64},"in_reply_to":"bfdaf3ff_29a92523","updated":"2019-01-17 16:03:21.000000000","message":"Also, the DB API hard-codes the read_deleted when querying VIFs by instance uuid:\n\nhttps://github.com/openstack/nova/blob/4f5cb30a2f88965772bcbff0a19a1dcfcd3836c6/nova/db/sqlalchemy/api.py#L1542\n\nWhich is dumb, but I\u0027ve seen a lot of that in the older DB APIs.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"7d0060c185c23321adc231cfde04a61949796c68","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"                vif_list \u003d VirtualInterfaceList.\\"},{"line_number":223,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"},{"line_number":224,"context_line":"                vif_list \u003d [x for x in vif_list if not x.deleted]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"                nw_info \u003d info_cache.network_info"},{"line_number":227,"context_line":"                # This should be list with proper order of vifs,"}],"source_content_type":"text/x-python","patch_set":17,"id":"9fdfeff1_f6725649","line":224,"range":{"start_line":224,"start_character":48,"end_line":224,"end_character":64},"in_reply_to":"bfdaf3ff_545e7c12","updated":"2019-01-23 14:04:56.000000000","message":"hmm, I\u0027ll leave a note about that and drop this filtering here.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"511f81c53a741ff9aca25b51ca895cc708a0f8cd","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"                vif_list \u003d VirtualInterfaceList.\\"},{"line_number":223,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"},{"line_number":224,"context_line":"                vif_list \u003d [x for x in vif_list if not x.deleted]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"                nw_info \u003d info_cache.network_info"},{"line_number":227,"context_line":"                # This should be list with proper order of vifs,"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_69facdbd","line":224,"range":{"start_line":224,"start_character":48,"end_line":224,"end_character":64},"in_reply_to":"bfdaf3ff_696badb6","updated":"2019-01-17 15:44:17.000000000","message":"Ah, thats cool. So no need to add this filtering here.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"8a8a3f574b19293fee866c2b37a0e8b9fe48a882","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"                vif_list \u003d VirtualInterfaceList.\\"},{"line_number":223,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"},{"line_number":224,"context_line":"                vif_list \u003d [x for x in vif_list if not x.deleted]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"                nw_info \u003d info_cache.network_info"},{"line_number":227,"context_line":"                # This should be list with proper order of vifs,"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_e9bd5dd8","line":224,"range":{"start_line":224,"start_character":48,"end_line":224,"end_character":64},"in_reply_to":"bfdaf3ff_69facdbd","updated":"2019-01-17 15:45:21.000000000","message":"I would keep it, since the whole read_deleted thing is hidden within the RequestContext and isn\u0027t obvious.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"a60df442eb3ff8ef09cbc47aa605f3343f2938a3","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"                vif_list \u003d VirtualInterfaceList.\\"},{"line_number":223,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"},{"line_number":224,"context_line":"                vif_list \u003d [x for x in vif_list if not x.deleted]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"                nw_info \u003d info_cache.network_info"},{"line_number":227,"context_line":"                # This should be list with proper order of vifs,"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_e9c8fd22","line":224,"range":{"start_line":224,"start_character":48,"end_line":224,"end_character":64},"in_reply_to":"bfdaf3ff_a9fd156f","updated":"2019-01-17 15:55:28.000000000","message":"It might deserve a note though…","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"0934cdc23628cc9f54351204b452365e9c42157d","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"                vif_list \u003d VirtualInterfaceList.\\"},{"line_number":223,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"},{"line_number":224,"context_line":"                vif_list \u003d [x for x in vif_list if not x.deleted]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"                nw_info \u003d info_cache.network_info"},{"line_number":227,"context_line":"                # This should be list with proper order of vifs,"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_c9adf99b","line":224,"range":{"start_line":224,"start_character":48,"end_line":224,"end_character":64},"in_reply_to":"bfdaf3ff_e9bd5dd8","updated":"2019-01-17 15:49:02.000000000","message":"Hmm, you\u0027re also right :D","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"79ea9196667d23353e26e9938f94df31daa08e26","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"                vif_list \u003d VirtualInterfaceList.\\"},{"line_number":223,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"},{"line_number":224,"context_line":"                vif_list \u003d [x for x in vif_list if not x.deleted]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"                nw_info \u003d info_cache.network_info"},{"line_number":227,"context_line":"                # This should be list with proper order of vifs,"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_a9fd156f","line":224,"range":{"start_line":224,"start_character":48,"end_line":224,"end_character":64},"in_reply_to":"bfdaf3ff_e9bd5dd8","updated":"2019-01-17 15:51:44.000000000","message":"I would remove it. I can\u0027t see a reason why we have to keep a double/triple check for something which isn\u0027t here for the beginning.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0b87ac6a45ea972b2f9b9204e7d308cc6329b2ed","unresolved":false,"context_lines":[{"line_number":221,"context_line":""},{"line_number":222,"context_line":"                vif_list \u003d VirtualInterfaceList.\\"},{"line_number":223,"context_line":"                    get_by_instance_uuid(cctxt, instance.get(\u0027uuid\u0027))"},{"line_number":224,"context_line":"                vif_list \u003d [x for x in vif_list if not x.deleted]"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"                nw_info \u003d info_cache.network_info"},{"line_number":227,"context_line":"                # This should be list with proper order of vifs,"}],"source_content_type":"text/x-python","patch_set":17,"id":"bfdaf3ff_29a92523","line":224,"range":{"start_line":224,"start_character":48,"end_line":224,"end_character":64},"in_reply_to":"bfdaf3ff_e9c8fd22","updated":"2019-01-17 16:01:31.000000000","message":"read_deleted isn\u0027t obvious, that\u0027s true, but one should be able to reasonably assume that if you\u0027re querying the database for records, you\u0027re not getting back deleted things unless you\u0027re specifically looking for them.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f5b4069897e291f48c98c2c7abf4227d441662fd","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    cells \u003d objects.CellMappingList.get_all(context)"},{"line_number":179,"context_line":"    for cell in cells:"},{"line_number":180,"context_line":"        if count_all \u003d\u003d max_count:"},{"line_number":181,"context_line":"            # We reached the limit of checked instances per"},{"line_number":182,"context_line":"            # this function run."},{"line_number":183,"context_line":"            # Stop, do not go to other cell."},{"line_number":184,"context_line":"            break"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":187,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9fdfeff1_38de6911","line":184,"range":{"start_line":180,"start_character":0,"end_line":184,"end_character":17},"updated":"2019-01-24 22:51:18.000000000","message":"Hmm, I commented this out, ran the tests and nothing failed.","commit_id":"fc962b62d4202d76f2c04166c97ace9d31c21e18"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"99ba07baf6d1823db11b960a0dee5f8a6057a5fa","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    cells \u003d objects.CellMappingList.get_all(context)"},{"line_number":179,"context_line":"    for cell in cells:"},{"line_number":180,"context_line":"        if count_all \u003d\u003d max_count:"},{"line_number":181,"context_line":"            # We reached the limit of checked instances per"},{"line_number":182,"context_line":"            # this function run."},{"line_number":183,"context_line":"            # Stop, do not go to other cell."},{"line_number":184,"context_line":"            break"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":187,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9fdfeff1_31c2ffea","line":184,"range":{"start_line":180,"start_character":0,"end_line":184,"end_character":17},"in_reply_to":"9fdfeff1_38de6911","updated":"2019-01-25 08:55:51.000000000","message":"Isn\u0027t that an early exit from the loop, just to skip all the instance query stuff in that condition?","commit_id":"fc962b62d4202d76f2c04166c97ace9d31c21e18"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"96d3a06f1054e79badd4fc471c6319d07bccd006","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    cells \u003d objects.CellMappingList.get_all(context)"},{"line_number":179,"context_line":"    for cell in cells:"},{"line_number":180,"context_line":"        if count_all \u003d\u003d max_count:"},{"line_number":181,"context_line":"            # We reached the limit of checked instances per"},{"line_number":182,"context_line":"            # this function run."},{"line_number":183,"context_line":"            # Stop, do not go to other cell."},{"line_number":184,"context_line":"            break"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        with nova_context.target_cell(context, cell) as cctxt:"},{"line_number":187,"context_line":"            marker \u003d _get_marker_for_migrate_instances(cctxt)"}],"source_content_type":"text/x-python","patch_set":18,"id":"9fdfeff1_516ea395","line":184,"range":{"start_line":180,"start_character":0,"end_line":184,"end_character":17},"in_reply_to":"9fdfeff1_38de6911","updated":"2019-01-25 08:56:10.000000000","message":"Ok, so a few things:\n\n1) I added test_migration_verify_max_count to verify if max_count is respected,\n\n2) With this code removed the test_migration_verify_max_count will still pass due limiting in L194 (adjusted_limit).\nBut it is worth to leave it as it is because if max_count will be reached this if will prevent from looping over other cells and getting instance list with adjusted_limit\u003d0.","commit_id":"fc962b62d4202d76f2c04166c97ace9d31c21e18"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"96d3a06f1054e79badd4fc471c6319d07bccd006","unresolved":false,"context_lines":[{"line_number":289,"context_line":"# Please notice that because of virtual_interfaces_instance_uuid_fkey"},{"line_number":290,"context_line":"# we need to have FAKE_UUID instance object, even deleted one."},{"line_number":291,"context_line":"@db_api.pick_context_manager_writer"},{"line_number":292,"context_line":"def _set_or_delete_marker_for_migrate_instances(context, marker\u003dNone):"},{"line_number":293,"context_line":"    context.session.query(models.VirtualInterface).filter_by("},{"line_number":294,"context_line":"        instance_uuid\u003dFAKE_UUID).delete()"},{"line_number":295,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9fdfeff1_91d08b21","line":292,"updated":"2019-01-25 08:56:10.000000000","message":"I\u0027m lucky due this set marker per context, So if select other cell it will automatically create per-cell marker ;)","commit_id":"fc962b62d4202d76f2c04166c97ace9d31c21e18"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"f0b8b191b2e22367edc856dd7e1221f5c7be42c1","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    cells \u003d objects.CellMappingList.get_all(context)"},{"line_number":179,"context_line":"    for cell in cells:"},{"line_number":180,"context_line":"        if count_all \u003d\u003d max_count:"},{"line_number":181,"context_line":"            # We reached the limit of checked instances per"},{"line_number":182,"context_line":"            # this function run."},{"line_number":183,"context_line":"            # Stop, do not go to other cell."}],"source_content_type":"text/x-python","patch_set":19,"id":"9fdfeff1_7ea4b8a6","line":180,"updated":"2019-01-28 07:17:57.000000000","message":"This is used to not step info next cell. Without this if we\u0027ll reach max_count the adjusted_limit (L194) will be 0 and we\u0027re going to list instances with\nobjects.InstanceList.get_by_filters() using limit\u003d0.\n\nTo prevent it this condition is written here.","commit_id":"fd7e28f3bd85c13c0d9a93892767b4b37f1cbeaf"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"f0b8b191b2e22367edc856dd7e1221f5c7be42c1","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            # If user wants to process a total of 100 instances"},{"line_number":192,"context_line":"            # and we did a 75 in cell1, then we only need to"},{"line_number":193,"context_line":"            # verify 25 more in cell2, no more."},{"line_number":194,"context_line":"            adjusted_limit \u003d max_count - count_all"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"            instances \u003d objects.InstanceList.get_by_filters("},{"line_number":197,"context_line":"                cctxt,"}],"source_content_type":"text/x-python","patch_set":19,"id":"9fdfeff1_9fdac348","line":194,"updated":"2019-01-28 07:17:57.000000000","message":"The test didn\u0027t fail because of this adjusted_limit.","commit_id":"fd7e28f3bd85c13c0d9a93892767b4b37f1cbeaf"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"f7b8a1e1b9a8fd6a95e64ee38682c7bf2e7782e1","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            vif_obj.tag \u003d old_vif[0].tag if len(old_vif) \u003e 0 else None"},{"line_number":176,"context_line":"            vif_obj.create()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    cells \u003d objects.CellMappingList.get_all(context)"},{"line_number":179,"context_line":"    for cell in cells:"},{"line_number":180,"context_line":"        if count_all \u003d\u003d max_count:"},{"line_number":181,"context_line":"            # We reached the limit of checked instances per"}],"source_content_type":"text/x-python","patch_set":20,"id":"9fdfeff1_172bdc82","line":178,"range":{"start_line":178,"start_character":36,"end_line":178,"end_character":43},"updated":"2019-01-30 16:57:40.000000000","message":"should we care about cell0?","commit_id":"3534471c578eda6236e79f43153788c4725a5634"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9a35ffa0efbe7361f0bc6664c19e1757fabad493","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            vif_obj.tag \u003d old_vif[0].tag if len(old_vif) \u003e 0 else None"},{"line_number":176,"context_line":"            vif_obj.create()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    cells \u003d objects.CellMappingList.get_all(context)"},{"line_number":179,"context_line":"    for cell in cells:"},{"line_number":180,"context_line":"        if count_all \u003d\u003d max_count:"},{"line_number":181,"context_line":"            # We reached the limit of checked instances per"}],"source_content_type":"text/x-python","patch_set":20,"id":"9fdfeff1_262b5083","line":178,"range":{"start_line":178,"start_character":36,"end_line":178,"end_character":43},"in_reply_to":"9fdfeff1_172bdc82","updated":"2019-01-30 22:56:03.000000000","message":"No because the _heal_instance_info_cache periodic runs in the nova-compute service and we shouldn\u0027t have any real instances (or compute services) in cell0. Cell0 is only for instances that actually spawned on a host.","commit_id":"3534471c578eda6236e79f43153788c4725a5634"},{"author":{"_account_id":26936,"name":"Surya Seetharaman","email":"suryaseetharaman.9@gmail.com","username":"tssurya"},"change_message_id":"3043c89bb3e817b834a81f0b31da91be26f6f0fa","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            vif_obj.tag \u003d old_vif[0].tag if len(old_vif) \u003e 0 else None"},{"line_number":176,"context_line":"            vif_obj.create()"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    cells \u003d objects.CellMappingList.get_all(context)"},{"line_number":179,"context_line":"    for cell in cells:"},{"line_number":180,"context_line":"        if count_all \u003d\u003d max_count:"},{"line_number":181,"context_line":"            # We reached the limit of checked instances per"}],"source_content_type":"text/x-python","patch_set":20,"id":"9fdfeff1_2fcebcb3","line":178,"range":{"start_line":178,"start_character":36,"end_line":178,"end_character":43},"in_reply_to":"9fdfeff1_262b5083","updated":"2019-01-31 09:20:02.000000000","message":"cool, so we need not include that.","commit_id":"3534471c578eda6236e79f43153788c4725a5634"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a5521e69bc037f7a99909d2c04a46f367c32a5ed","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    cells \u003d objects.CellMappingList.get_all(context)"},{"line_number":179,"context_line":"    for cell in cells:"},{"line_number":180,"context_line":"        if count_all \u003d\u003d max_count:"},{"line_number":181,"context_line":"            # We reached the limit of checked instances per"},{"line_number":182,"context_line":"            # this function run."},{"line_number":183,"context_line":"            # Stop, do not go to other cell."}],"source_content_type":"text/x-python","patch_set":20,"id":"9fdfeff1_eaa9947b","line":180,"updated":"2019-01-30 14:37:55.000000000","message":"I removed this and now the new test fails\n\nCaptured traceback:\n~~~~~~~~~~~~~~~~~~~\n    b\u0027Traceback (most recent call last):\u0027\n    b\u0027  File \"/home/osboxes/git/nova/nova/tests/functional/db/test_virtual_interface.py\", line 179, in test_migration_do_not_step_to_next_cell\u0027\n    b\u0027    self.assertEqual(2, match)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/functional-py35/lib/python3.5/site-packages/testtools/testcase.py\", line 411, in assertEqual\u0027\n    b\u0027    self.assertThat(observed, matcher, message)\u0027\n    b\u0027  File \"/home/osboxes/git/nova/.tox/functional-py35/lib/python3.5/site-packages/testtools/testcase.py\", line 498, in assertThat\u0027\n    b\u0027    raise mismatch_error\u0027\n    b\u0027testtools.matchers._impl.MismatchError: 2 !\u003d 4\u0027\n    b\u0027\u0027","commit_id":"3534471c578eda6236e79f43153788c4725a5634"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"0d28b475de1aa0932310e8777e2bf55678b8133a","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    cells \u003d objects.CellMappingList.get_all(context)"},{"line_number":179,"context_line":"    for cell in cells:"},{"line_number":180,"context_line":"        if count_all \u003d\u003d max_count:"},{"line_number":181,"context_line":"            # We reached the limit of checked instances per"},{"line_number":182,"context_line":"            # this function run."},{"line_number":183,"context_line":"            # Stop, do not go to other cell."}],"source_content_type":"text/x-python","patch_set":20,"id":"9fdfeff1_ca7ff0dd","line":180,"in_reply_to":"9fdfeff1_eaa9947b","updated":"2019-01-30 14:45:26.000000000","message":"good. ++","commit_id":"3534471c578eda6236e79f43153788c4725a5634"}],"nova/tests/functional/db/test_virtual_interface.py":[{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"19861072f3da19333e1ab39b44189cdfa8d408f5","unresolved":false,"context_lines":[{"line_number":210,"context_line":"        match, done \u003d virtual_interface.fill_virtual_interface_list("},{"line_number":211,"context_line":"            self.context, 5)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        # Cache is corrupted, so must be rewrited"},{"line_number":214,"context_line":"        self.assertEqual(1, match)"},{"line_number":215,"context_line":"        self.assertEqual(1, done)"}],"source_content_type":"text/x-python","patch_set":13,"id":"dfd5e7cf_6f5c644b","line":213,"range":{"start_line":213,"start_character":41,"end_line":213,"end_character":49},"updated":"2019-01-08 14:33:40.000000000","message":"rewritten :)","commit_id":"f72f5c52d152852dcecabbf592194addad185c74"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c09b705a1b440d143f9b89dd54e71490fe566a0a","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class VirtualInterfaceListMigrationTestCase("},{"line_number":57,"context_line":"    integrated_helpers._IntegratedTestBase,"},{"line_number":58,"context_line":"    integrated_helpers.InstanceHelperMixin):"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    ADMIN_API \u003d True"}],"source_content_type":"text/x-python","patch_set":18,"id":"9fdfeff1_d8cb9d6f","line":57,"range":{"start_line":57,"start_character":23,"end_line":57,"end_character":42},"updated":"2019-01-24 22:42:44.000000000","message":"OK this creates the first compute service in cell1 which is why you have compute2 in cell0 below (which isn\u0027t really something that would happen [computes in cell0] but is convenient for your test).","commit_id":"fc962b62d4202d76f2c04166c97ace9d31c21e18"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"96d3a06f1054e79badd4fc471c6319d07bccd006","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"class VirtualInterfaceListMigrationTestCase("},{"line_number":57,"context_line":"    integrated_helpers._IntegratedTestBase,"},{"line_number":58,"context_line":"    integrated_helpers.InstanceHelperMixin):"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    ADMIN_API \u003d True"}],"source_content_type":"text/x-python","patch_set":18,"id":"9fdfeff1_d1285335","line":57,"range":{"start_line":57,"start_character":23,"end_line":57,"end_character":42},"in_reply_to":"9fdfeff1_d8cb9d6f","updated":"2019-01-25 08:56:10.000000000","message":"Yes, I used the cell0 to avoid creating another cell. But for test purpose it should be fine.","commit_id":"fc962b62d4202d76f2c04166c97ace9d31c21e18"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c09b705a1b440d143f9b89dd54e71490fe566a0a","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    def _create_instances(self, pre_newton\u003d2, deleted\u003d0, total\u003d5,"},{"line_number":80,"context_line":"                          target_cell\u003dNone):"},{"line_number":81,"context_line":"        if not target_cell:"},{"line_number":82,"context_line":"            target_cell \u003d self.cells[1]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        instances \u003d []"},{"line_number":85,"context_line":"        with context.target_cell(self.context, target_cell) as cctxt:"}],"source_content_type":"text/x-python","patch_set":18,"id":"9fdfeff1_388bc91f","line":82,"range":{"start_line":82,"start_character":36,"end_line":82,"end_character":39},"updated":"2019-01-24 22:42:44.000000000","message":"I believe this is safe because of the \"ORDER BY ID ASC\" in CellMappingList.get_all and cell0 is created first in the test setup.","commit_id":"fc962b62d4202d76f2c04166c97ace9d31c21e18"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"96d3a06f1054e79badd4fc471c6319d07bccd006","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    def _create_instances(self, pre_newton\u003d2, deleted\u003d0, total\u003d5,"},{"line_number":80,"context_line":"                          target_cell\u003dNone):"},{"line_number":81,"context_line":"        if not target_cell:"},{"line_number":82,"context_line":"            target_cell \u003d self.cells[1]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"        instances \u003d []"},{"line_number":85,"context_line":"        with context.target_cell(self.context, target_cell) as cctxt:"}],"source_content_type":"text/x-python","patch_set":18,"id":"9fdfeff1_b11d8f10","line":82,"range":{"start_line":82,"start_character":36,"end_line":82,"end_character":39},"in_reply_to":"9fdfeff1_388bc91f","updated":"2019-01-25 08:56:10.000000000","message":"Yep, in setup I always fill this list with two cells.","commit_id":"fc962b62d4202d76f2c04166c97ace9d31c21e18"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c09b705a1b440d143f9b89dd54e71490fe566a0a","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        if deleted:"},{"line_number":131,"context_line":"            # Delete from the end of active instances list"},{"line_number":132,"context_line":"            for i in range(total - deleted, total):"},{"line_number":133,"context_line":"                instances[i].deleted \u003d instances[i].id"},{"line_number":134,"context_line":"                instances[i].deleted_at \u003d timeutils.utcnow()"},{"line_number":135,"context_line":"                instances[i].save()"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        self.instances +\u003d instances"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9fdfeff1_58932d50","line":135,"range":{"start_line":133,"start_character":16,"end_line":135,"end_character":35},"updated":"2019-01-24 22:42:44.000000000","message":"You could just do:\n\n  instances[i].destroy()","commit_id":"fc962b62d4202d76f2c04166c97ace9d31c21e18"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"96d3a06f1054e79badd4fc471c6319d07bccd006","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        if deleted:"},{"line_number":131,"context_line":"            # Delete from the end of active instances list"},{"line_number":132,"context_line":"            for i in range(total - deleted, total):"},{"line_number":133,"context_line":"                instances[i].deleted \u003d instances[i].id"},{"line_number":134,"context_line":"                instances[i].deleted_at \u003d timeutils.utcnow()"},{"line_number":135,"context_line":"                instances[i].save()"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        self.instances +\u003d instances"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"9fdfeff1_91e72b13","line":135,"range":{"start_line":133,"start_character":16,"end_line":135,"end_character":35},"in_reply_to":"9fdfeff1_58932d50","updated":"2019-01-25 08:56:10.000000000","message":"Yes, it worked, thanks!","commit_id":"fc962b62d4202d76f2c04166c97ace9d31c21e18"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fcac3f69b448fe3796be66a902b8ed3a702dccc0","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        self.assertEqual(5, match)"},{"line_number":146,"context_line":"        self.assertEqual(0, done)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_migration_verify_max_count(self):"},{"line_number":149,"context_line":"        \"\"\"This verifies if max_count is respected to avoid migration"},{"line_number":150,"context_line":"           of bigger set of data, than user specified."},{"line_number":151,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"9fdfeff1_cae095fd","line":148,"range":{"start_line":148,"start_character":8,"end_line":148,"end_character":39},"updated":"2019-01-25 16:33:55.000000000","message":"I removed the condition in the code again and this didn\u0027t fail...","commit_id":"fd7e28f3bd85c13c0d9a93892767b4b37f1cbeaf"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"991d8bf254421230eeb76dbad87b0f095b6fb7c0","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        self.assertEqual(5, match)"},{"line_number":146,"context_line":"        self.assertEqual(0, done)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_migration_verify_max_count(self):"},{"line_number":149,"context_line":"        \"\"\"This verifies if max_count is respected to avoid migration"},{"line_number":150,"context_line":"           of bigger set of data, than user specified."},{"line_number":151,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"9fdfeff1_a2489a86","line":148,"range":{"start_line":148,"start_character":8,"end_line":148,"end_character":39},"in_reply_to":"9fdfeff1_25a378b4","updated":"2019-01-30 10:08:57.000000000","message":", I added next test that has mocked objects.InstanceList.get_by_filters(). This think that\u0027s okey to leave test_migration_verify_max_count() untouched.","commit_id":"fd7e28f3bd85c13c0d9a93892767b4b37f1cbeaf"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"96976b30a9326f1db20e3c1625dc36f1c487c72a","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        self.assertEqual(5, match)"},{"line_number":146,"context_line":"        self.assertEqual(0, done)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_migration_verify_max_count(self):"},{"line_number":149,"context_line":"        \"\"\"This verifies if max_count is respected to avoid migration"},{"line_number":150,"context_line":"           of bigger set of data, than user specified."},{"line_number":151,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"9fdfeff1_25a378b4","line":148,"range":{"start_line":148,"start_character":8,"end_line":148,"end_character":39},"in_reply_to":"9fdfeff1_3eaab070","updated":"2019-01-28 16:19:41.000000000","message":"\u003e If you want I can mock objects.InstanceList.get_by_filters() and verify if it was executed once.\n\nIs there any way we can exercise that limit check without mocking code? Ultimately I want to make sure we have test coverage for that code so we know it\u0027s doing it\u0027s job, but if the minimum we can do is mock objects.InstanceList.get_by_filters and assert it\u0027s call count then I guess that\u0027s OK (the mock would have to use a side_effect and pass through to the original method for the test to still work).","commit_id":"fd7e28f3bd85c13c0d9a93892767b4b37f1cbeaf"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"f0b8b191b2e22367edc856dd7e1221f5c7be42c1","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        self.assertEqual(5, match)"},{"line_number":146,"context_line":"        self.assertEqual(0, done)"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def test_migration_verify_max_count(self):"},{"line_number":149,"context_line":"        \"\"\"This verifies if max_count is respected to avoid migration"},{"line_number":150,"context_line":"           of bigger set of data, than user specified."},{"line_number":151,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":19,"id":"9fdfeff1_3eaab070","line":148,"range":{"start_line":148,"start_character":8,"end_line":148,"end_character":39},"in_reply_to":"9fdfeff1_cae095fd","updated":"2019-01-28 07:17:57.000000000","message":"This test didn\u0027t fail because of ``adjusted_limit`` variable that is passed to ``objects.InstanceList.get_by_filters()``.\n\nIf you want I can mock objects.InstanceList.get_by_filters() and verify if it was executed once.","commit_id":"fd7e28f3bd85c13c0d9a93892767b4b37f1cbeaf"}],"releasenotes/notes/fill_virtual_interface_list-1ec5bcccde2ebd22.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"cd2a07cffab9330aa90ead073c1e77e3aff46cc1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - The nova-manage db online_data_migrations command will now fill missing"},{"line_number":4,"context_line":"    VirtualInterfaceObjects for instances older than Newton release."}],"source_content_type":"text/x-yaml","patch_set":16,"id":"bfdaf3ff_ae20d4b1","line":3,"range":{"start_line":3,"start_character":8,"end_line":3,"end_character":45},"updated":"2019-01-16 15:40:24.000000000","message":"``literal``","commit_id":"127104732e6c25b97f9547f3368e8e66cd04e27a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7571ea74cbd819458362f3214277ab3693d7b1f5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - The ``nova-manage db online_data_migrations`` command will now fill missing"},{"line_number":4,"context_line":"    VirtualInterfaceObjects for instances older than Newton release."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"bfdaf3ff_a925155e","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":27},"updated":"2019-01-17 15:43:56.000000000","message":"This isn\u0027t a real thing, but I\u0027m not sure it means much to someone reading this without context either.\n\nI\u0027d probably replace \"VirtualInterfaceObjects\" with:\n\n\"will now fill missing ``virtual_interfaces`` records for instances created before the Newton release. This is related to a fix for https://launchpad.net/bugs/1751923 which makes the _heal_instance_info_cache periodic task in the ``nova-compute`` service regenerate an instance network info cache from the current neutron port list, and the VIFs from the database are needed to maintain the port order for the instance.\"","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"},{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"0934cdc23628cc9f54351204b452365e9c42157d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - The ``nova-manage db online_data_migrations`` command will now fill missing"},{"line_number":4,"context_line":"    VirtualInterfaceObjects for instances older than Newton release."}],"source_content_type":"text/x-yaml","patch_set":17,"id":"bfdaf3ff_89ce1180","line":4,"range":{"start_line":4,"start_character":4,"end_line":4,"end_character":27},"in_reply_to":"bfdaf3ff_a925155e","updated":"2019-01-17 15:49:02.000000000","message":"Ok, better to understand.","commit_id":"03948731eb6b10818e9d8842d3b51c2378e708c2"}]}
