From 3c3e6eef90c87440c87803dba3325e7cc8c79a17 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 f7b0442f0..58490bca6 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) -- 2.45.2