From 9211ab6296dcea6765c8554caf255c44c0bb9a6c Mon Sep 17 00:00:00 2001 From: Afonne-CID Date: Mon, 26 May 2025 17:38:05 +0100 Subject: [PATCH] Replace eventlet usage in `pxe_filter` Drop the last eventlet usage in pxe filter script for the native threading equivalent. Behavior "should" be identical. Change-Id: I2b490a78288ad477131dbe60ea64d7ea905953ec --- ironic/pxe_filter/service.py | 24 ++++++++++++++------ ironic/tests/unit/pxe_filter/test_service.py | 6 +++-- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/ironic/pxe_filter/service.py b/ironic/pxe_filter/service.py index 64e127b00c..50280e6fcb 100644 --- a/ironic/pxe_filter/service.py +++ b/ironic/pxe_filter/service.py @@ -13,9 +13,8 @@ import os import time -import eventlet -from eventlet import event from oslo_log import log +import threading from ironic.common.i18n import _ from ironic.common import metrics_utils @@ -52,14 +51,25 @@ class PXEFilterManager: raise RuntimeError(_('Attempt to start an already running ' 'PXE filter manager')) - self._shutdown = event.Event() - self._thread = eventlet.spawn_after(_START_DELAY, self._periodic_sync) + self._shutdown = threading.Event() + + # Delay startup by ``_START_DELAY`` seconds to mimic the former + # ``eventlet.spawn_after`` behaviour. + def _delayed_start(): + time.sleep(_START_DELAY) + self._periodic_sync() + + self._thread = threading.Thread( + target=_delayed_start, name="pxe-sync", + daemon=True) + + self._thread.start() self._started = True def del_host(self): - self._shutdown.send(True) - eventlet.sleep(0) - self._thread.wait() + self._shutdown.set() + time.sleep(0) + self._thread.join() self._started = False def _periodic_sync(self): diff --git a/ironic/tests/unit/pxe_filter/test_service.py b/ironic/tests/unit/pxe_filter/test_service.py index 33ef3d3d1c..2ad589c50a 100644 --- a/ironic/tests/unit/pxe_filter/test_service.py +++ b/ironic/tests/unit/pxe_filter/test_service.py @@ -111,8 +111,10 @@ class TestSync(test_base.DbTestCase): class TestManager(test_base.DbTestCase): - @mock.patch('eventlet.spawn_after', lambda delay, func: func()) - @mock.patch('eventlet.event.Event', autospec=True) + @mock.patch('time.sleep', lambda _: None) + @mock.patch('threading.Thread.start', + lambda self: self._target(*self._args, **self._kwargs)) + @mock.patch('threading.Event', autospec=True) @mock.patch.object(pxe_filter_service.PXEFilterManager, '_sync', autospec=True) def test_init_and_run(self, mock_sync, mock_event):