From a815880c11f7ff0df7d4c7843028d3c724ab1f83 Mon Sep 17 00:00:00 2001 From: Armando Migliaccio Date: Thu, 31 Oct 2013 07:55:30 -0700 Subject: [PATCH] Fix query error on dhcp release port for postgresql This is achieved by disabling eager loading and hence by avoiding incurring in left outer joins that cannot be applied because of a nullable side. Closes-bug: #1246788 Change-Id: I16bcc738a43609f715c2561413c6387f443bd99c --- neutron/db/db_base_plugin_v2.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/neutron/db/db_base_plugin_v2.py b/neutron/db/db_base_plugin_v2.py index f7b0442f06..58490bca65 100644 --- a/neutron/db/db_base_plugin_v2.py +++ b/neutron/db/db_base_plugin_v2.py @@ -1404,11 +1404,16 @@ class NeutronDbPluginV2(neutron_plugin_base_v2.NeutronPluginBaseV2, def delete_ports(self, context, filters): with context.session.begin(subtransactions=True): - ports = self._get_ports_query( - context, filters=filters).with_lockmode('update') - if ports: - for port in ports: - self.delete_port(context, port['id']) + # Disable eagerloads to avoid postgresql issues with outer joins + # and SELECT FOR UPDATE. This means that only filters for columns + # on the Port model will be effective, which is fine in nearly all + # the cases where filters are used + query = context.session.query( + models_v2.Port).enable_eagerloads(False) + ports = self._apply_filters_to_query( + query, models_v2.Port, filters).with_lockmode('update').all() + for port in ports: + self.delete_port(context, port['id']) def _delete_port(self, context, id): port = self._get_port(context, id)