Udev - move away form depricated callback / increase buffer (#2502)

* Use new callback from udev / only forward

* minimize loop

* Udev - move away form depricated callback / increase buffer

* code cleanup
This commit is contained in:
Pascal Vizeli 2021-02-01 17:33:53 +01:00 committed by GitHub
parent a3555c74e8
commit 184eeb7f49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,5 +1,4 @@
"""Supervisor Hardware monitor based on udev."""
from contextlib import suppress
import logging
from pathlib import Path
from pprint import pformat
@ -31,7 +30,14 @@ class HwMonitor(CoreSysAttributes):
"""Start hardware monitor."""
try:
self.monitor = pyudev.Monitor.from_netlink(self.context, "kernel")
self.observer = pyudev.MonitorObserver(self.monitor, self._udev_events)
self.monitor.set_receive_buffer_size(32 * 1024 * 1024)
self.observer = pyudev.MonitorObserver(
self.monitor,
callback=lambda x: self.sys_loop.call_soon_threadsafe(
self._async_udev_events, x
),
)
except OSError:
self.sys_resolution.unhealthy = UnhealthyReason.PRIVILEGED
_LOGGER.critical("Not privileged to run udev monitor!")
@ -47,29 +53,20 @@ class HwMonitor(CoreSysAttributes):
self.observer.stop()
_LOGGER.info("Stopped Supervisor hardware monitor")
def _udev_events(self, action: str, kernel: pyudev.Device):
"""Incomming events from udev.
This is inside a observe thread and need pass into our eventloop.
"""
_LOGGER.debug("Hardware monitor: %s - %s", action, pformat(kernel))
udev = None
with suppress(pyudev.DeviceNotFoundAtPathError):
udev = pyudev.Devices.from_sys_path(self.context, kernel.sys_path)
self.sys_loop.call_soon_threadsafe(
self._async_udev_events, action, kernel, udev
)
def _async_udev_events(
self, action: str, kernel: pyudev.Device, udev: Optional[pyudev.Device]
):
def _async_udev_events(self, kernel: pyudev.Device):
"""Incomming events from udev into loop."""
# Update device List
if not kernel.device_node or self.sys_hardware.helper.hide_virtual_device(
kernel
):
return
_LOGGER.debug("Hardware monitor: %s - %s", kernel.action, pformat(kernel))
# Lookup udev device data
try:
udev = pyudev.Devices.from_sys_path(self.context, kernel.sys_path)
except pyudev.DeviceNotFoundAtPathError:
udev = None
hw_action = None
device = None
@ -77,7 +74,7 @@ class HwMonitor(CoreSysAttributes):
##
# Remove
if (
action in (UdevKernelAction.REMOVE, UdevKernelAction.UNBIND)
kernel.action in (UdevKernelAction.REMOVE, UdevKernelAction.UNBIND)
and udev is None
):
try:
@ -90,7 +87,10 @@ class HwMonitor(CoreSysAttributes):
##
# Add
if action in (UdevKernelAction.ADD, UdevKernelAction.BIND) and udev is not None:
if (
kernel.action in (UdevKernelAction.ADD, UdevKernelAction.BIND)
and udev is not None
):
device = Device(
udev.sys_name,
Path(udev.device_node),