From: Jenkins Date: Tue, 31 Mar 2015 01:33:34 +0000 (+0000) Subject: Merge "Improve DVR scale performance" X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=827603d418e761a65695fad94c051d668767dfc0;p=openstack-build%2Fneutron-build.git Merge "Improve DVR scale performance" --- 827603d418e761a65695fad94c051d668767dfc0 diff --cc neutron/db/l3_dvr_db.py index 99b51919f,2912744bd..dcef1e3d7 --- a/neutron/db/l3_dvr_db.py +++ b/neutron/db/l3_dvr_db.py @@@ -450,10 -444,11 +446,11 @@@ class L3_NAT_with_dvr_db_mixin(l3_db.L3 interfaces = self._core_plugin.get_ports(context.elevated(), filters) LOG.debug("Return the FIP ports: %s ", interfaces) if interfaces: - self._populate_subnet_for_ports(context, interfaces) + self._populate_subnets_for_ports(context, interfaces) return interfaces - def get_sync_data(self, context, router_ids=None, active=None): + def get_dvr_sync_data(self, context, host, agent, router_ids=None, + active=None): routers, interfaces, floating_ips = self._get_router_info_list( context, router_ids=router_ids, active=active, device_owners=l3_const.ROUTER_INTERFACE_OWNERS) diff --cc neutron/db/l3_dvrscheduler_db.py index 95f31afce,5592beaf6..daf58a11a --- a/neutron/db/l3_dvrscheduler_db.py +++ b/neutron/db/l3_dvrscheduler_db.py @@@ -315,12 -315,19 +315,21 @@@ class L3_DVRsch_db_mixin(l3agent_sch_db context, router_id, chosen_agent) return chosen_agent + def _get_active_l3_agent_routers_sync_data(self, context, host, agent, + router_ids): + if n_utils.is_extension_supported(self, q_const.L3_HA_MODE_EXT_ALIAS): + return self.get_ha_sync_data_for_host(context, host, + router_ids=router_ids, + active=True) + return self.get_dvr_sync_data(context, host, agent, + router_ids=router_ids, active=True) + def _notify_l3_agent_new_port(resource, event, trigger, **kwargs): - LOG.debug('Received %s %s' % (resource, event)) - port = kwargs['port'] + LOG.debug('Received %(resource)s %(event)s', { + 'resource': resource, + 'event': event}) + port = kwargs.get('port') if not port: return diff --cc neutron/db/l3_hamode_db.py index 642e3304e,3f52e0a5e..74884d2df --- a/neutron/db/l3_hamode_db.py +++ b/neutron/db/l3_hamode_db.py @@@ -464,24 -459,15 +465,32 @@@ class L3_HA_NAT_db_mixin(l3_dvr_db.L3_N def get_ha_sync_data_for_host(self, context, host=None, router_ids=None, active=None): - sync_data = super(L3_HA_NAT_db_mixin, self).get_sync_data(context, - router_ids, - active) + if n_utils.is_extension_supported(self, + constants.L3_DISTRIBUTED_EXT_ALIAS): + # DVR has to be handled differently + agent = self._get_agent_by_type_and_host(context, + constants.AGENT_TYPE_L3, + host) + sync_data = self.get_dvr_sync_data(context, host, agent, + router_ids, active) + else: + sync_data = super(L3_HA_NAT_db_mixin, self).get_sync_data(context, + router_ids, active) return self._process_sync_ha_data(context, sync_data, host) + + @classmethod + def _set_router_states(cls, context, bindings, states): + for binding in bindings: + try: + with context.session.begin(subtransactions=True): + binding.state = states[binding.router_id] + except (orm.exc.StaleDataError, orm.exc.ObjectDeletedError): + # Take concurrently deleted routers in to account + pass + + def update_routers_states(self, context, states, host): + """Receive dict of router ID to state and update them all.""" + + bindings = self.get_ha_router_port_bindings( + context, router_ids=states.keys(), host=host) + self._set_router_states(context, bindings, states)