** Also affects: neutron/kilo
   Importance: Undecided
       Status: New

-- 
You received this bug notification because you are a member of Yahoo!
Engineering Team, which is subscribed to neutron.
https://bugs.launchpad.net/bugs/1451558

Title:
  subnetpool allocation not working with postgresql

Status in neutron:
  Fix Released
Status in neutron kilo series:
  New

Bug description:
  The following is working with mysql but not with postgresql

  
  #$ neutron subnetpool-create pool --pool-prefix 10.0.0.0/8 
--default-prefixlen 24
  #$ neutron net-create net
  #$ neutron subnet-create net --name subnet --subnetpool pool

  
  The last command raises a 501 with postgresql with the stacktrace[2] in 
neutron-server, because _get_allocated_cidrs[1] performs a SELECT FOR UPDATE 
with a JOIN on an empty select! (allowed with mysql, not postgresql).



  [1]: 
https://github.com/openstack/neutron/blob/5962d825a6c98225c51bc6dd304b5c1ac89035ef/neutron/ipam/subnet_alloc.py#L40-L44
    query = session.query(models_v2.Subnet).with_lockmode('update')
    subnets = query.filter_by(subnetpool_id=self._subnetpool['id'])

  
  [2]: neutron-server stacktrace
  2015-05-04 21:47:01.939 ERROR neutron.api.v2.resource 
[req-a6c14f61-bdb2-4273-a231-df0a85fb33d8 demo 
b532b7a9302c45b18f06f68b41869ffa] create failed
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource Traceback (most recent 
call last):
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/opt/stack/neutron/neutron/api/v2/resource.py", line 83, in resource
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     result = 
method(request=request, **args)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/opt/stack/neutron/neutron/api/v2/base.py", line 461, in create
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     obj = 
obj_creator(request.context, **kwargs)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/opt/stack/neutron/neutron/plugins/ml2/plugin.py", line 804, in create_subnet
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     result, 
mech_context = self._create_subnet_db(context, subnet)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/opt/stack/neutron/neutron/plugins/ml2/plugin.py", line 795, in 
_create_subnet_db
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     result = 
super(Ml2Plugin, self).create_subnet(context, subnet)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/opt/stack/neutron/neutron/db/db_base_plugin_v2.py", line 1389, in 
create_subnet
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     subnetpool_id)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/usr/local/lib/python2.7/dist-packages/oslo_db/api.py", line 131, in wrapper
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     return f(*args, 
**kwargs)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/opt/stack/neutron/neutron/db/db_base_plugin_v2.py", line 1283, in 
_create_subnet_from_pool
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     ipam_subnet = 
allocator.allocate_subnet(context.session, req)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/opt/stack/neutron/neutron/ipam/subnet_alloc.py", line 141, in allocate_subnet
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     return 
self._allocate_any_subnet(session, request)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/opt/stack/neutron/neutron/ipam/subnet_alloc.py", line 93, in 
_allocate_any_subnet
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     prefix_pool = 
self._get_available_prefix_list(session)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/opt/stack/neutron/neutron/ipam/subnet_alloc.py", line 48, in 
_get_available_prefix_list
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     allocations = 
self._get_allocated_cidrs(session)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/opt/stack/neutron/neutron/ipam/subnet_alloc.py", line 44, in 
_get_allocated_cidrs
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     return (x.cidr for 
x in subnets)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2441, in 
__iter__
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     return 
self._execute_and_instances(context)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/usr/local/lib/python2.7/dist-packages/sqlalchemy/orm/query.py", line 2456, in 
_execute_and_instances
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     result = 
conn.execute(querycontext.statement, self._params)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 841, 
in execute
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     return meth(self, 
multiparams, params)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/usr/local/lib/python2.7/dist-packages/sqlalchemy/sql/elements.py", line 322, 
in _execute_on_connection
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     return 
connection._execute_clauseelement(self, multiparams, params)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 938, 
in _execute_clauseelement
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     compiled_sql, 
distilled_params
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1070, 
in _execute_context
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     context)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/usr/local/lib/python2.7/dist-packages/oslo_db/sqlalchemy/compat/handle_error.py",
 line 261, in _handle_dbapi_exception
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     e, statement, 
parameters, cursor, context)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1267, 
in _handle_dbapi_exception
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     
util.raise_from_cause(newraise, exc_info)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/usr/local/lib/python2.7/dist-packages/sqlalchemy/util/compat.py", line 199, 
in raise_from_cause
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     
reraise(type(exception), exception, tb=exc_tb)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/base.py", line 1063, 
in _execute_context
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     context)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource   File 
"/usr/local/lib/python2.7/dist-packages/sqlalchemy/engine/default.py", line 
442, in do_execute
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource     
cursor.execute(statement, parameters)
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource DBError: 
(NotSupportedError) FOR UPDATE cannot be applied to the nullable side of an 
outer join
  2015-05-04 21:47:01.939 TRACE neutron.api.v2.resource  'SELECT 
subnets.tenant_id AS subnets_tenant_id, subnets.id AS subnets_id, subnets.name 
AS subnets_name, subnets.network_id AS subnets_network_id, 
subnets.subnetpool_id AS subnets_subnetpool_id, subnets.ip_version AS 
subnets_ip_version, subnets.cidr AS subnets_cidr, subnets.gateway_ip AS 
subnets_gateway_ip, subnets.enable_dhcp AS subnets_enable_dhcp, subnets.shared 
AS subnets_shared, subnets.ipv6_ra_mode AS subnets_ipv6_ra_mode, 
subnets.ipv6_address_mode AS subnets_ipv6_address_mode, ipallocationpools_1.id 
AS ipallocationpools_1_id, ipallocationpools_1.subnet_id AS 
ipallocationpools_1_subnet_id, ipallocationpools_1.first_ip AS 
ipallocationpools_1_first_ip, ipallocationpools_1.last_ip AS 
ipallocationpools_1_last_ip, dnsnameservers_1.address AS 
dnsnameservers_1_address, dnsnameservers_1.subnet_id AS 
dnsnameservers_1_subnet_id, subnetroutes_1.destination AS 
subnetroutes_1_destination, subnetroutes_1.nexthop AS subnetroutes_1_nextho
 p, subnetroutes_1.subnet_id AS subnetroutes_1_subnet_id \nFROM subnets LEFT 
OUTER JOIN ipallocationpools AS ipallocationpools_1 ON subnets.id = 
ipallocationpools_1.subnet_id LEFT OUTER JOIN dnsnameservers AS 
dnsnameservers_1 ON subnets.id = dnsnameservers_1.subnet_id LEFT OUTER JOIN 
subnetroutes AS subnetroutes_1 ON subnets.id = subnetroutes_1.subnet_id \nWHERE 
subnets.subnetpool_id = %(subnetpool_id_1)s FOR UPDATE' {'subnetpool_id_1': 
u'2ee02a0f-863a-41d6-a5cb-7c629395b9da'}

To manage notifications about this bug go to:
https://bugs.launchpad.net/neutron/+bug/1451558/+subscriptions

-- 
Mailing list: https://launchpad.net/~yahoo-eng-team
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~yahoo-eng-team
More help   : https://help.launchpad.net/ListHelp

Reply via email to