Re-propose spec for refresh-quotas-usage
This was approved for Liberty and Mitaka but code was never submitted. This was something that many operators expressed interest in before so it seems valuable and straight-forward to try again on this in Newton. There are two changes from the original Liberty spec: 1. --user is optional with the quota_usage_refresh command. 2. The testing section is updated to point out that unit and functional tests would be provided. Previously-approved: Mitaka Spec for blueprint refresh-quotas-usage Originally authored by: Romain Hardouin <romain.hardouin@cloudwatt.com> Change-Id: Ie71cc6836b1a291c07df3db913ea8655420819ba
This commit is contained in:
322
specs/newton/approved/refresh-quotas-usage.rst
Normal file
322
specs/newton/approved/refresh-quotas-usage.rst
Normal file
@@ -0,0 +1,322 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
==========================================
|
||||
Refresh quotas usage
|
||||
==========================================
|
||||
|
||||
https://blueprints.launchpad.net/nova/+spec/refresh-quotas-usage
|
||||
|
||||
For some reasons [*]_, the quotas usage can be out of sync.
|
||||
When a quota is wrongfully reached, a user cannot launch new VMs anymore.
|
||||
This "refresh" feature allows operators to quickly unblock users without
|
||||
manually running queries against the database or temporarily increase the
|
||||
quota.
|
||||
|
||||
.. [*] It seems that there are several root causes and there is no procedure
|
||||
to reproduce bugs. Although these root causes will eventually be
|
||||
identified, we cannot guarantee that some bugs will not occur again.
|
||||
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Quotas usage can be out of sync in quota_usages table.
|
||||
The number of used resources may not reflect the actual use.
|
||||
For instance we can see 7 cores used while the actual use is only 4.
|
||||
|
||||
Use Cases
|
||||
----------
|
||||
|
||||
An end user can be blocked if a quota is wrongfully reached for a resource
|
||||
type.
|
||||
|
||||
If a refresh quotas usage feature is implemented in Nova an operator can
|
||||
correct the usage without running a SQL query directly on the database.
|
||||
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
Currently, the "refresh quotas usage" feature is hidden inside SQLAlchemy
|
||||
implementation.
|
||||
As described in "Alternatives" paragraph, the function
|
||||
``nova.db.sqlalchemy.api.quota_reserve()`` can refresh the database under
|
||||
some circumstances.
|
||||
|
||||
The change consists to:
|
||||
|
||||
* Create a function in the DB API to refresh quotas usage:
|
||||
``nova.db.api.quota_usage_refresh()``
|
||||
|
||||
* Do an "extract function" refactoring on
|
||||
``nova.db.sqlalchemy.api.quota_reserve()`` to implement the aforementioned
|
||||
``quota_usage_refresh()`` DB API. That is:
|
||||
``nova.db.sqlalchemy.api.quota_usage_refresh()``.
|
||||
|
||||
* Expose the ``nova.db.api.quota_usage_refresh()`` feature through a
|
||||
nova-manage command.
|
||||
|
||||
|
||||
The nova-manage command would look like:
|
||||
|
||||
::
|
||||
|
||||
$ nova-manage project quota_usage_refresh --project <Project name>
|
||||
[--user <User name>] [--key <Quota key>]
|
||||
|
||||
If ``--key`` is omitted, all quota resources are refreshed.
|
||||
|
||||
Specifying ``--user`` is optional since some resources are per-project quotas,
|
||||
like fixed_ips, floating_ips and networks. Similarly, the ``nova quota-update``
|
||||
command takes an optional user.
|
||||
|
||||
Example:
|
||||
|
||||
::
|
||||
|
||||
$ nova-manage project quota_usage_refresh --project demo --user john_doe
|
||||
--key cores
|
||||
|
||||
$ nova-manage project quota_usage_refresh
|
||||
--project f85aa788e8ee48fca3da27e0579d3597
|
||||
--key cores
|
||||
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
Another nova-manage command
|
||||
"""""""""""""""""""""""""""
|
||||
|
||||
Another nova-manage command can use the already implemented
|
||||
``nova.quota.usage_reset()`` function.
|
||||
|
||||
Here is the docstring of this function, note the "for a particular user":
|
||||
|
||||
::
|
||||
|
||||
Reset the usage records for a particular user on a list of
|
||||
resources. This will force that user's usage records to be
|
||||
refreshed the next time a reservation is made.
|
||||
|
||||
Note: this does not affect the currently outstanding
|
||||
reservations the user has; those reservations must be
|
||||
committed or rolled back (or expired).
|
||||
|
||||
:param context: The request context, for access checks.
|
||||
:param resources: A list of the resource names for which the
|
||||
usage must be reset.
|
||||
|
||||
|
||||
"Reset" means "set to -1 in database".
|
||||
|
||||
The resulting command would be:
|
||||
|
||||
::
|
||||
|
||||
$ nova-manage project quota_usage_reset --project <Project name>
|
||||
--user <User name> [--key <Quota key>]
|
||||
|
||||
If ``--key`` is omitted, all quota resources are reset.
|
||||
|
||||
Pros
|
||||
""""
|
||||
|
||||
Only ``nova/cmd/manage.py`` is modified.
|
||||
Unlike quota_usage_refresh, no changes are required at the database API level.
|
||||
|
||||
|
||||
Cons
|
||||
""""
|
||||
|
||||
The main difference with quota_usage_refresh is that the user won't see actual
|
||||
quota usages until the next reservation.
|
||||
|
||||
|
||||
Credits: This command is proposed by Joe Gordon (cf. patch set 2)
|
||||
|
||||
|
||||
Configure Nova
|
||||
""""""""""""""
|
||||
|
||||
We can enable quotas "auto refresh" in nova.conf thanks to:
|
||||
|
||||
* until_refresh (IntOpt) Count of reservations until usage is refreshed
|
||||
* max_age (IntOpt) Number of seconds between subsequent usage refreshes
|
||||
|
||||
These two settings (disabled by default) allow to refresh quotas usage but only
|
||||
during a quota reservation. The algorithm is:
|
||||
|
||||
1. Check quota
|
||||
2. until_refresh or max_age threshold reached?
|
||||
3. If yes: refresh
|
||||
|
||||
Let's take an example: a quota of 10 instances is set on a tenant.
|
||||
|
||||
The quota is wrongfully reached:
|
||||
|
||||
* nova absolute-limits shows totalInstancesUsed = 10
|
||||
* nova quota-show shows instances = 10
|
||||
|
||||
The actual instances number is 9.
|
||||
|
||||
When a user runs a ``nova boot`` he will get an error: "Quota exceeded".
|
||||
Many users will stop here and contact their support. Actually, a second
|
||||
``nova boot`` might succeed if the first one has refreshed the quotas usage
|
||||
(depending on until_refresh or max_age threshold).
|
||||
We would need to improve this behavior but it's off topic here.
|
||||
|
||||
Note that on Horizon a user will not able to spawn an instance (corresponding
|
||||
to the first ``nova boot``) because the button is disabled when a quota is
|
||||
reached.
|
||||
|
||||
To conclude:
|
||||
|
||||
* until_refresh or max_age need to be enabled but a cloud operator
|
||||
may not want to enable them if only few tenants encounter a bug on quotas
|
||||
usage.
|
||||
|
||||
* Even with these two settings enabled, we can't force a refresh.
|
||||
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
None
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
Policy changes
|
||||
--------------
|
||||
|
||||
None
|
||||
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
None
|
||||
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
The feature hits the table quota_usages the same way
|
||||
``nova.db.sqlalchemy.api.quota_reserve()`` does when triggering a refresh.
|
||||
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
None
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
Other implementations of ``nova.db.api`` should implement
|
||||
``nova.db.api.quota_usage_refresh()``.
|
||||
|
||||
Handle nested projects?
|
||||
https://blueprints.launchpad.net/nova/+spec/nested-quota-driver-api
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
Chuck Carmack <carmack@us.ibm.com>
|
||||
|
||||
Other contributors:
|
||||
Romain Hardouin <romain.hardouin@cloudwatt.com>
|
||||
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
Not a big change, this BP can be submitted as a whole.
|
||||
|
||||
Two subtasks:
|
||||
|
||||
* Change the DB API
|
||||
* Implement the nova-manage command
|
||||
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
None
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
In-tree unit and functional testing should be sufficient.
|
||||
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
Document the new nova-manage command.
|
||||
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
* "nova quota statistics can be incorrect":
|
||||
https://bugs.launchpad.net/nova/+bug/1284424
|
||||
|
||||
* "Test job failes with FixedIpLimitExceeded with nova network":
|
||||
https://bugs.launchpad.net/nova/+bug/1353962
|
||||
|
||||
* "How to reset incorrect quota count?":
|
||||
https://ask.openstack.org/en/question/494/how-to-reset-incorrect-quota-count/
|
||||
|
||||
* "nova 'absolute-limits': [...] (they are wrong)"
|
||||
http://lists.openstack.org/pipermail/openstack/2014-November/010250.html
|
||||
|
||||
* "[...] usage now out-of-sync":
|
||||
https://ask.openstack.org/en/question/11943/deleted-vms-still-showing-in-nova-dashboard-usage-now-out-of-sync/
|
||||
|
||||
For information, on Horizon side:
|
||||
|
||||
* "absolute-limits sometimes returns negative value" :
|
||||
https://bugs.launchpad.net/nova/+bug/1370867
|
||||
|
||||
|
||||
History
|
||||
=======
|
||||
|
||||
.. list-table:: Revisions
|
||||
:header-rows: 1
|
||||
|
||||
* - Release Name
|
||||
- Description
|
||||
* - Newton
|
||||
- Re-proposed with No changes
|
||||
* - Mitaka
|
||||
- Re-proposed with 2 changes
|
||||
|
||||
1. --user is optional with the quota_usage_refresh command.
|
||||
2. The testing section is updated to point out that unit and functional tests
|
||||
|
||||
* - Liberty
|
||||
- Introduced
|
||||
Reference in New Issue
Block a user