From fe961d14c5821bcad6b0b7ae0e072269c1b1e516 Mon Sep 17 00:00:00 2001 From: Kevin Benton Date: Thu, 20 Mar 2014 00:24:50 -0700 Subject: [PATCH] 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 --- neutron/db/loadbalancer/loadbalancer_db.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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: -- 2.45.2