]> review.fuel-infra Code Review - openstack-build/neutron-build.git/commitdiff
Reservations: Don't count usage if resource is unlimited
authorSalvatore Orlando <salv.orlando@gmail.com>
Fri, 28 Aug 2015 15:55:42 +0000 (08:55 -0700)
committerSalvatore Orlando <salv.orlando@gmail.com>
Fri, 11 Sep 2015 21:44:21 +0000 (14:44 -0700)
If a resource is unlimited (ie: limit<0) then there is no need
to verify headroom for it. This also means that there no need for
counting it; therefore it is possible to save some DB operations
by skipping the count phase.

Change-Id: Ibe9ca8a1c29fb8ba12df187c25f8f9515968a54d
Related-blueprint: better-quotas

neutron/db/quota/driver.py

index 5358960be9fff3ccdeed679f70e9f59d9ae209e5..c9249950fce6de42701af736addaafeaf6901b54 100644 (file)
@@ -153,6 +153,20 @@ class DbQuotaDriver(object):
         # to a single node will be avaialable.
         requested_resources = deltas.keys()
         with db_api.autonested_transaction(context.session):
+            # get_tenant_quotes needs in input a dictionary mapping resource
+            # name to BaseResosurce instances so that the default quota can be
+            # retrieved
+            current_limits = self.get_tenant_quotas(
+                context, resources, tenant_id)
+            unlimited_resources = set([resource for (resource, limit) in
+                                       current_limits.items() if limit < 0])
+            # Do not even bother counting resources and calculating headroom
+            # for resources with unlimited quota
+            LOG.debug(("Resources %s have unlimited quota limit. It is not "
+                       "required to calculated headroom "),
+                      ",".join(unlimited_resources))
+            requested_resources = (set(requested_resources) -
+                                   unlimited_resources)
             # Gather current usage information
             # TODO(salv-orlando): calling count() for every resource triggers
             # multiple queries on quota usage. This should be improved, however
@@ -164,11 +178,6 @@ class DbQuotaDriver(object):
                 (resource, resources[resource].count(
                     context, plugin, tenant_id, resync_usage=False)) for
                 resource in requested_resources)
-            # get_tenant_quotes needs in inout a dictionary mapping resource
-            # name to BaseResosurce instances so that the default quota can be
-            # retrieved
-            current_limits = self.get_tenant_quotas(
-                context, resources, tenant_id)
             # Adjust for expired reservations. Apparently it is cheaper than
             # querying everytime for active reservations and counting overall
             # quantity of resources reserved
@@ -179,13 +188,6 @@ class DbQuotaDriver(object):
             for resource in requested_resources:
                 expired_reservations = expired_deltas.get(resource, 0)
                 total_usage = current_usages[resource] - expired_reservations
-                # A negative quota limit means infinite
-                if current_limits[resource] < 0:
-                    LOG.debug(("Resource %(resource)s has unlimited quota "
-                               "limit. It is possible to allocate %(delta)s "
-                               "items."), {'resource': resource,
-                                           'delta': deltas[resource]})
-                    continue
                 res_headroom = current_limits[resource] - total_usage
                 LOG.debug(("Attempting to reserve %(delta)d items for "
                            "resource %(resource)s. Total usage: %(total)d; "