Skip to content

Commit

Permalink
filesystem: revamp udev handling
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
dbungert committed Sep 25, 2023
1 parent aaaf873 commit 91479d8
Showing 1 changed file with 15 additions and 9 deletions.
24 changes: 15 additions & 9 deletions subiquity/server/controllers/filesystem.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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:
Expand Down

0 comments on commit 91479d8

Please sign in to comment.