Do not fail if the agent load is not bumped

When a new network and its first subnet is created, the DHCP agent
bumps the "load" parameter to reflect the number of networks handled.
This "load" parameter is modified when:
- As commented, when the first subnet of a network is created. The
  "load" value is bumped.
- When periodically the DHCP agent sends the status, informing about
  the current number of networks handled.

If during the subnet creation this "load" value is not updated, it will
be in the next periodic update of the agent.

This "load" value is used by the scheduler to equally distribute the
objects to be managed by any agent type (DHCP agents manage networks).

The bug refers to DHCP but is valid for any other agent.

Conflicts:
      neutron/common/utils.py

Change-Id: Ief402048d99d40b64d81fcf58eb2e39b1ba7ebbb
Closes-Bug: #1939432
(cherry picked from commit 668b1cc652)
(cherry picked from commit 816aca60b9)
changes/69/806569/1
Rodolfo Alonso Hernandez 1 year ago
parent f97e745617
commit 1eb6b8926a
  1. 22
      neutron/common/utils.py
  2. 4
      neutron/scheduler/base_resource_filter.py
  3. 22
      neutron/tests/unit/common/test_utils.py

@ -965,3 +965,25 @@ def with_metaclass(meta, *bases):
return meta(name, bases, d)
return metaclass('temporary_class', None, {})
def skip_exceptions(exceptions):
"""Decorator to catch and hide any provided exception in the argument"""
# NOTE(ralonsoh): could be rehomed to neutron-lib.
if not isinstance(exceptions, list):
exceptions = [exceptions]
def decorator(function):
@functools.wraps(function)
def wrapper(*args, **kwargs):
try:
return function(*args, **kwargs)
except Exception as exc:
with excutils.save_and_reraise_exception() as ctx:
if issubclass(type(exc), tuple(exceptions)):
LOG.info('Skipped exception %s when calling method %s',
ctx.value.__repr__(), function.__repr__())
ctx.reraise = False
return wrapper
return decorator

@ -16,6 +16,9 @@
import abc
from neutron_lib.db import api as db_api
from oslo_db import exception as db_exc
from neutron.common import utils as n_utils
class BaseResourceFilter(object, metaclass=abc.ABCMeta):
@ -24,6 +27,7 @@ class BaseResourceFilter(object, metaclass=abc.ABCMeta):
def filter_agents(self, plugin, context, resource):
"""Return the agents that can host the resource."""
@n_utils.skip_exceptions(db_exc.DBError)
def bind(self, context, agents, resource_id, force_scheduling=False):
"""Bind the resource to the agents."""
with db_api.CONTEXT_WRITER.using(context):

@ -603,3 +603,25 @@ class SingletonDecoratorTestCase(base.BaseTestCase):
instance_2 = _TestSingletonClass()
self.assertEqual(instance_1.__hash__(), instance_2.__hash__())
self.assertEqual('value1', instance_2.variable)
class SkipDecoratorTestCase(base.BaseTestCase):
def test_skip_exception(self):
@utils.skip_exceptions(AttributeError)
def raise_attribute_error_single_exception():
raise AttributeError()
@utils.skip_exceptions([AttributeError, IndexError])
def raise_attribute_error_exception_list():
raise AttributeError()
raise_attribute_error_single_exception()
raise_attribute_error_exception_list()
def test_skip_exception_fail(self):
@utils.skip_exceptions(IndexError)
def raise_attribute_error():
raise AttributeError()
self.assertRaises(AttributeError, raise_attribute_error)

Loading…
Cancel
Save