From e43c5c1ea6441ad7d36e25bd283a5a580bf5cb09 Mon Sep 17 00:00:00 2001 From: Eugene Nikanorov Date: Thu, 22 Aug 2013 19:08:34 +0400 Subject: [PATCH] Fix port creation issue appeared with postgresql backend IPAllocationPool has relation to IPAvailabilityRange which is setup to load eagerly. Eager loading is implemented with left outer join which is incompatible with with_lockmode('update') on postgresql. The fix redefines eager loading with options(joinedload) making it use inner join. fixes bug 1215350 Change-Id: I148d37f2a1c2a340327d36c240eb8173aee9219a --- neutron/db/db_base_plugin_v2.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index b9ae77d146..1db6464de9 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -312,9 +312,11 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, subnet. """ # Grab all allocation pools for the subnet - pool_qry = context.session.query( - models_v2.IPAllocationPool).with_lockmode('update') - allocation_pools = pool_qry.filter_by(subnet_id=subnet_id) + allocation_pools = (context.session.query( + models_v2.IPAllocationPool).filter_by(subnet_id=subnet_id). + options(orm.joinedload('available_ranges', innerjoin=True)). + with_lockmode('update')) + # Find the allocation pool for the IP to recycle pool_id = None for allocation_pool in allocation_pools: