]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Merge "Improve DVR scale performance"
authorJenkins <jenkins@review.openstack.org>
Tue, 31 Mar 2015 01:33:34 +0000 (01:33 +0000)
committerGerrit Code Review <review@openstack.org>
Tue, 31 Mar 2015 01:33:34 +0000 (01:33 +0000)
1  2 
neutron/db/l3_dvr_db.py
neutron/db/l3_dvrscheduler_db.py
neutron/db/l3_hamode_db.py
neutron/tests/unit/db/test_l3_dvr_db.py

index 99b51919f0e936ff9ec11ca0fdb2dc816fa10fe4,2912744bd06955bf6f4a33cd4b5c802aed54b586..dcef1e3d7bc4d047ad872ff0098612586f50933f
@@@ -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)
index 95f31afcefb4cae61035f009dc8b68514b8ff5c8,5592beaf694b804612e5deb186e02dfa72da4d07..daf58a11a15a4f251a5ba09593dedd48e2063bce
@@@ -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
  
index 642e3304e997c9751220c9cd7ce2e5ff3cc9768f,3f52e0a5e7192f0086fcf5634896b52e5ce1381c..74884d2dfa15edebabd47704ba2fd057ce74f6ea
@@@ -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)