'nova list' does not work when #ports*#instances is big number
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
OpenStack Compute (nova) |
Confirmed
|
Low
|
Unassigned |
Bug Description
I have OpenStack Icehouse and I got this error:
[root@fed-cloud09 ~(keystone_admin)]# nova list
ERROR: The server has either erred or is incapable of performing the requested operation. (HTTP 500) (Request-ID: req-3b8fc3e4-
And in /var/log/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack Traceback (most recent call last):
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack return req.get_
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack application, catch_exc_
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack app_iter = application(
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack return resp(environ, start_response)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack return self.app(env, start_response)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack return resp(environ, start_response)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack return resp(environ, start_response)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack response = self.app(environ, start_response)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack return resp(environ, start_response)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack resp = self.call_func(req, *args, **self.kwargs)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack return self.func(req, *args, **kwargs)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack content_type, body, accept)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack request, action_args)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack **action_args)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack self._extend_
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack servers))
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack ports = self._get_
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack ports.extend(
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack ret = self.function(
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack **_params)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack for r in self._paginatio
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack res = self.get(path, params=params)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack headers=headers, params=params)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack headers=headers, params=params)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack self._handle_
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack exception_
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack File "/usr/lib/
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack message=message)
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack NeutronClientEx
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack Your browser sent an invalid request.
2015-04-13 13:47:22.065 18123 TRACE nova.api.openstack </body></html>
After some investigation I find that the problem seems to be in
self.
when I debug do_request() of Client class. I found that the it tries to do:
/v2.0/
Which is likely too long.
Steps to reproduce:
1. Have 11 security groups
2. spin up 200 instances (both numbers are for one tenant)
3. try to do "nova list" on command line
This way the GET request have aprox. 9400 bytes, which exceed usual implementation of 8K.
I assume that correct way would be to send this query via POST.
affects: | nova → python-novaclient |
affects: | python-novaclient → nova |
Changed in nova: | |
assignee: | jichenjc (jichenjc) → nobody |
Guessing it's because neutron is use eventlet wsgi server and its max URI size is MAX_REQUEST_LINE = 8192
so yes, it's a bug , but not sure a POST can be used since it's using neutron API (still search whether neutron has this kind of API)
this is a log in nova says following
39 # NOTE: Neutron client has a max URL length of 8192, so we have
40 # to limit the number of IDs we include in any single search. Really
41 # doesn't seem to be any point in making this a config value.