From b9900c2334abf5e4b1ad09ee24ed88184c085349 Mon Sep 17 00:00:00 2001 From: zhhuabj Date: Wed, 10 Jul 2013 17:49:01 +0800 Subject: [PATCH] port-update fails when using SELECT FOR UPDATE lock MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit In Postgresql, it will throw the bellow exception when using SELECT FOR UPDATE lock combined with outer join. "SELECT FOR UPDATE/SHARE cannot be applied to the nullable side of an outer join" The reason can refer http://www.postgresql.org/ \ message-id/21634.1160151923@sss.pgh.pa.us for this issue, I don't think outer join is necessary, so I change it to use inner join. Fixes bug #1191653 Change-Id: Ifc9ecad91324ce28399431ea77fe0865b6d8e523 --- neutron/db/db_base_plugin_v2.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index 7378c951f..d3998355f 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -504,11 +504,10 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, """Allocate a specific IP address on the subnet.""" ip = int(netaddr.IPAddress(ip_address)) range_qry = context.session.query( - models_v2.IPAvailabilityRange, - models_v2.IPAllocationPool).join( + models_v2.IPAvailabilityRange).join( models_v2.IPAllocationPool).with_lockmode('update') results = range_qry.filter_by(subnet_id=subnet_id) - for (range, pool) in results: + for range in results: first = int(netaddr.IPAddress(range['first_ip'])) last = int(netaddr.IPAddress(range['last_ip'])) if first <= ip <= last: @@ -527,7 +526,7 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, new_last = range['last_ip'] range['last_ip'] = str(netaddr.IPAddress(ip_address) - 1) ip_range = models_v2.IPAvailabilityRange( - allocation_pool_id=pool['id'], + allocation_pool_id=range['allocation_pool_id'], first_ip=new_first, last_ip=new_last) context.session.add(ip_range) -- 2.45.2