From 05f6e3a42877c836a4ba4f43efcd8d4d372e8d74 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 cbff0ed0db..06ec0723c3 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: