Hi: I detected this problem too. The main problem we have in Neutron is that the "neutron-vif-plugged" event is sent in many situations: when a port is provisioned by the DHCP agent, when the port is bound by the L2 agent or when the port passes from status DOWN to ACTIVE. For example, when a port is detected by a OVS agent, it binds it to this host and the sends to the server (via RPC) a "update_device_list". The Neutron server receives this list and updates the port status, calling "update_device_up". That calls "update_port_status_to_active" [1] that triggers the port provisioning. This is catched by [2] that updates the port status to ACTIVE. That triggers the Nova notification. When the port is live migrated, since [3] (live migration with multiple portbinding), the port can has two port bonding definitions: the source host (SOURCE) and the destination host (DEST). The SOURCE is, until the migration finishes, active. In the profile (a dictionary field), a new key is added: "migration_to", with the name of DEST host. The DEST is disabled. Is activated when the SOURCE binding is deleted from the port. A) EXPLANATION OF THE CONNECTIVITY BREAKDOWN Now, the DEST port is bound to the host when the DEST binding is enabled (as defined in [3]). The problem is that this moment is too late. Nova has already set the ofport of the port (in case of hybrid_plugin=False) because has unpaused the MV in DEST. That means during the time the VM is unpaused and the OVS agent binds the port to the host (sets the OpenFlow rules in OVS), there is B) EXPLANATION OF THE EVENTS RACE CONDITION As commented, we are sending the "neutron-vif-plugged" event in many occasions. But this Nova event, at least during the live-migration, is meant to be sent only when the DEST port is bound to the host. That means when the OVS agent in DEST creates the OpenFlow rules and leaves the port ready to be used. **This happens now by pure chance**: when the port is migrated, the port bindings are first deleted and then updated [4]. That means the port is set to DOWN and then activated again (--> that triggers the first "network-vif-plugged" event). Nova reads this event and unpauses the VM in DEST. So just the opposite as it should be. There are also other triggers that can send the "network-vif-plugged" event, in any other. 1) When the port binding is updated (with the two hosts, SOURCE and DEST), the port is provisioned again by the DHCP agent. This can send this event. 2) When the port binding is updated (first clear and then set again), the SOURCE OVS agent can read both changes in different polling cycles. That will unbind first the port, seinding an update to the server, that will send a "network-vif-unplugged" event. Then, the port is bound again, that will trigger a "network-vif-plugged" event. During the live-migration: 1) We need to catch those events not generated by the OVS SOURCE agent and dismiss them. 2) We need to bind the port to SOURCE **before** the port activation (please read B). Nova is activating the port because other processes are sending the plugged event, but should be the SOURCE binding process the only one sending it. I'm pushing https://review.opendev.org/c/openstack/neutron/+/766277 to try to fix this. Regards. [1]https://github.com/openstack/neutron/blob/85d0d9e0d87f63da3726e3f7f58c2c9f983378ee/neutron/plugins/ml2/rpc.py#L312 [2]https://github.com/openstack/neutron/blob/85d0d9e0d87f63da3726e3f7f58c2c9f983378ee/neutron/plugins/ml2/plugin.py#L287 [3]https://review.opendev.org/q/topic:%22bp%252Flive-migration-portbinding%22+(status:open%20OR%20status:merged) [4]https://github.com/openstack/neutron/blob/8d6c301301e33697fd4eb4d6de53f680b909a04d/neutron/plugins/ml2/plugin.py#L490