From 91479d8d5e5ee27516b32a56e2ee3ee96428183b Mon Sep 17 00:00:00 2001 From: Dan Bungert Date: Mon, 25 Sep 2023 16:41:30 -0600 Subject: [PATCH] filesystem: revamp udev handling In LP: #2009141, we are hitting kernel limits and pyudev buffer limits. We don't care about specific events, so much as getting one event, waiting for things to calm down, then reprobing. Turn off the event firehose ASAP, and drain the event queue more agressively. --- subiquity/server/controllers/filesystem.py | 24 ++++++++++++++-------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/subiquity/server/controllers/filesystem.py b/subiquity/server/controllers/filesystem.py index eb40edede0..ec68964352 100644 --- a/subiquity/server/controllers/filesystem.py +++ b/subiquity/server/controllers/filesystem.py @@ -1479,14 +1479,7 @@ def ensure_probing(self): else: log.debug("Triggered Probert run on udev event") - def _udev_event(self): - cp = run_command(["udevadm", "settle", "-t", "0"]) - if cp.returncode != 0: - log.debug("waiting 0.1 to let udev event queue settle") - self.stop_listening_udev() - loop = asyncio.get_running_loop() - loop.call_later(0.1, self.start_listening_udev) - return + def drain_udev(self): # Drain the udev events in the queue -- if we stopped listening to # allow udev to settle, it's good bet there is more than one event to # process and we don't want to kick off a full block probe for each @@ -1495,7 +1488,20 @@ def _udev_event(self): while select.select([self._monitor.fileno()], [], [], 0)[0]: action, dev = self._monitor.receive_device() log.debug("_udev_event %s %s", action, dev) - self.ensure_probing() + + def _udev_event(self): + self.stop_listening_udev() + + cp = run_command(["udevadm", "settle", "-t", "0"]) + self.drain_udev() + + if cp.returncode != 0: + log.debug("waiting 0.1 to let udev event queue settle") + loop = asyncio.get_running_loop() + loop.call_later(0.1, self._udev_event) + return + + self.start_listening_udev() def make_autoinstall(self): if self.model.dd_target is None: