diff --git a/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py b/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py index ecdb845ec35..50fddb6f25b 100644 --- a/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py +++ b/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py @@ -2071,6 +2071,9 @@ class OVSNeutronAgent(l2population_rpc.L2populationRpcCallBackTunnelMixin, self.setup_tunnel_br() self.setup_tunnel_br_flows() self.agent_state['start_flag'] = True + # Force state report to avoid race condition + # with l2pop fdb entries update + self._report_state() if self.enable_distributed_routing: self.dvr_agent.reset_ovs_parameters(self.int_br, self.tun_br, diff --git a/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py b/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py index 5083d1647e6..e6875151a03 100644 --- a/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py +++ b/neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/test_ovs_neutron_agent.py @@ -2049,7 +2049,9 @@ class TestOvsNeutronAgent(object): mock.patch.object( self.mod_agent.OVSNeutronAgent, '_reset_tunnel_ofports') as reset_tunnel_ofports, \ - mock.patch.object(self.agent.ovs.ovsdb, 'idl_monitor'): + mock.patch.object(self.agent.ovs.ovsdb, 'idl_monitor'),\ + mock.patch.object(self.agent.state_rpc, + 'report_state') as report_st: log_exception.side_effect = Exception( 'Fake exception to get out of the loop') devices_not_ready = set() @@ -2097,7 +2099,9 @@ class TestOvsNeutronAgent(object): self.assertTrue(setup_tunnel_br_flows.called) self.assertTrue(setup_tunnel_br.called) if self.agent.enable_tunneling: - self.assertTrue(self.agent.agent_state.get('start_flag')) + self.agent.agent_state['start_flag'] = True + report_st.assert_called_once_with( + self.agent.context, self.agent.agent_state, True) def test_ovs_status(self): self._test_ovs_status(constants.OVS_NORMAL,