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.""" """Supervisor Hardware monitor based on udev."""
from contextlib import suppress
import logging import logging
from pathlib import Path from pathlib import Path
from pprint import pformat from pprint import pformat
@ -31,7 +30,14 @@ class HwMonitor(CoreSysAttributes):
"""Start hardware monitor.""" """Start hardware monitor."""
try: try:
self.monitor = pyudev.Monitor.from_netlink(self.context, "kernel") 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: except OSError:
self.sys_resolution.unhealthy = UnhealthyReason.PRIVILEGED self.sys_resolution.unhealthy = UnhealthyReason.PRIVILEGED
_LOGGER.critical("Not privileged to run udev monitor!") _LOGGER.critical("Not privileged to run udev monitor!")
@ -47,29 +53,20 @@ class HwMonitor(CoreSysAttributes):
self.observer.stop() self.observer.stop()
_LOGGER.info("Stopped Supervisor hardware monitor") _LOGGER.info("Stopped Supervisor hardware monitor")
def _udev_events(self, action: str, kernel: pyudev.Device): def _async_udev_events(self, 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]
):
"""Incomming events from udev into loop.""" """Incomming events from udev into loop."""
# Update device List # Update device List
if not kernel.device_node or self.sys_hardware.helper.hide_virtual_device( if not kernel.device_node or self.sys_hardware.helper.hide_virtual_device(
kernel kernel
): ):
return 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 hw_action = None
device = None device = None
@ -77,7 +74,7 @@ class HwMonitor(CoreSysAttributes):
## ##
# Remove # Remove
if ( if (
action in (UdevKernelAction.REMOVE, UdevKernelAction.UNBIND) kernel.action in (UdevKernelAction.REMOVE, UdevKernelAction.UNBIND)
and udev is None and udev is None
): ):
try: try:
@ -90,7 +87,10 @@ class HwMonitor(CoreSysAttributes):
## ##
# Add # 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( device = Device(
udev.sys_name, udev.sys_name,
Path(udev.device_node), Path(udev.device_node),