Skip to content

Commit

Permalink
port-update fails when using SELECT FOR UPDATE lock
Browse files Browse the repository at this point in the history
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
  • Loading branch information
zhhuabj committed Jul 10, 2013
1 parent d80048e commit b9900c2
Showing 1 changed file with 3 additions and 4 deletions.
7 changes: 3 additions & 4 deletions neutron/db/db_base_plugin_v2.py
Expand Up @@ -504,11 +504,10 @@ def _allocate_specific_ip(context, subnet_id, ip_address):
"""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:
Expand All @@ -527,7 +526,7 @@ def _allocate_specific_ip(context, subnet_id, ip_address):
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)
Expand Down

0 comments on commit b9900c2

Please sign in to comment.