diff options
author | Rodolfo Alonso Hernandez <ralonsoh@redhat.com> | 2022-04-13 23:38:04 +0000 |
---|---|---|
committer | Rodolfo Alonso Hernandez <ralonsoh@redhat.com> | 2022-04-14 21:28:50 +0000 |
commit | a5e2c1540b407685f51c15b494002b0991775616 (patch) | |
tree | 4919c714c1a4dd1a70a64e4ca0263c383a9bf24f | |
parent | dced5f17922411f7b059bfe8f8e5b95d1a1f223d (diff) | |
download | neutron-a5e2c1540b407685f51c15b494002b0991775616.tar.gz |
[DHCP] Break reference chain to any Exception object when resync
In the DHCP agent, if an exception is raised during the driver call,
"DhcpAgent.schedule_resync" is called. Before this patch, the
exception instance was passed instead of a string. This instance
reference was stored in the dictionary "needs_resync_reasons" and
used in "_periodic_resync_helper" to resync the DHCP agent
information.
The call to "sync_state" passed the dictionary ".keys()" method. In
python2.7 when that was implemented, this method was creating a list
with the dictionary keys. In python3, this method is a generator
that holds the dictionary content.
This patch breaks this reference chain in two points (actually only
one is needed):
- "sync_state" now passes a list created from the mentioned generator.
- The dictionary "needs_resync_reasons" now stores the exception
strings only, instead of the exception instance.
Closes-Bug: #1969270
Change-Id: I07e9818021283d321fc32066be7e0f8e2b81e639
(cherry picked from commit e3b3ec930967305e5fce314c0a4cf74151ad711c)
-rw-r--r-- | neutron/agent/dhcp/agent.py | 4 | ||||
-rw-r--r-- | neutron/tests/unit/agent/dhcp/test_agent.py | 4 |
2 files changed, 4 insertions, 4 deletions
diff --git a/neutron/agent/dhcp/agent.py b/neutron/agent/dhcp/agent.py index e3becaa1ed..028845465a 100644 --- a/neutron/agent/dhcp/agent.py +++ b/neutron/agent/dhcp/agent.py @@ -208,7 +208,7 @@ class DhcpAgent(manager.Manager): # allocation failure. When the subnet is updated with a new # allocation pool or a port is deleted to free up an IP, this # will automatically be retried on the notification - self.schedule_resync(e, network.id) + self.schedule_resync(str(e), network.id) if (isinstance(e, oslo_messaging.RemoteError) and e.exc_type == 'NetworkNotFound' or isinstance(e, exceptions.NetworkNotFound)): @@ -333,7 +333,7 @@ class DhcpAgent(manager.Manager): net = "*" LOG.debug("resync (%(network)s): %(reason)s", {"reason": r, "network": net}) - self.sync_state(reasons.keys()) + self.sync_state(list(reasons.keys())) def periodic_resync(self): """Spawn a thread to periodically resync the dhcp state.""" diff --git a/neutron/tests/unit/agent/dhcp/test_agent.py b/neutron/tests/unit/agent/dhcp/test_agent.py index d109ba25ed..86e9a131d1 100644 --- a/neutron/tests/unit/agent/dhcp/test_agent.py +++ b/neutron/tests/unit/agent/dhcp/test_agent.py @@ -605,7 +605,7 @@ class TestDhcpAgent(base.BaseTestCase): sync_state.side_effect = RuntimeError with testtools.ExpectedException(RuntimeError): dhcp._periodic_resync_helper() - sync_state.assert_called_once_with(resync_reasons.keys()) + sync_state.assert_called_once_with(list(resync_reasons.keys())) self.assertEqual(0, len(dhcp.needs_resync_reasons)) def test_periodic_resync_helper_with_event(self): @@ -613,7 +613,7 @@ class TestDhcpAgent(base.BaseTestCase): dhcp = dhcp_agent.DhcpAgent(HOSTNAME) dhcp.schedule_resync('reason1', 'a') dhcp.schedule_resync('reason1', 'b') - reasons = dhcp.needs_resync_reasons.keys() + reasons = list(dhcp.needs_resync_reasons.keys()) with mock.patch.object(dhcp, 'sync_state') as sync_state: sync_state.side_effect = RuntimeError with testtools.ExpectedException(RuntimeError): |