From: Kevin Benton Date: Thu, 20 Mar 2014 07:24:50 +0000 (-0700) Subject: Get rid of additional db contention on fetching VIP X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=fe961d14c5821bcad6b0b7ae0e072269c1b1e516;p=openstack-build%2Fneutron-build.git Get rid of additional db contention on fetching VIP This fix gets rid of fetching related record from ports table that could potentially be blocked by concurrent operation This is to prevent it from updating the vip table while a port SQL lock is in place, which vip entries have a reference to. Partial-Bug: 1283522 Change-Id: Ic64cc268ff4817a31971734a44671c744047231b --- diff --git a/neutron/db/loadbalancer/loadbalancer_db.py b/neutron/db/loadbalancer/loadbalancer_db.py index cbff0ed0d..06ec0723c 100644 --- a/neutron/db/loadbalancer/loadbalancer_db.py +++ b/neutron/db/loadbalancer/loadbalancer_db.py @@ -192,7 +192,16 @@ class LoadBalancerPluginDb(LoadBalancerPluginBase, def update_status(self, context, model, id, status, status_description=None): with context.session.begin(subtransactions=True): - v_db = self._get_resource(context, model, id) + if issubclass(model, Vip): + try: + v_db = (self._model_query(context, model). + filter(model.id == id). + options(orm.noload('port')). + one()) + except exc.NoResultFound: + raise loadbalancer.VipNotFound(vip_id=id) + else: + v_db = self._get_resource(context, model, id) if v_db.status != status: v_db.status = status # update status_description in two cases: