dmeventd hangs for minutes when started by lvm and RLIMIT_NOFILE is large
Reproduction steps:
-
Not have
dm-event.socket/dm-event.serviceenabled - Run some LVM command with large open file descriptor limit, e.g.:
sudo sh -c 'ulimit -n 1073741816; lvcreate --size 15G --snapshot --name snap0 /dev/mapper/vg0-root'
lvcreate would spawn dmeventd itself, which would daemonize, and try to close all of those billion FDs (see https://gitlab.com/lvmteam/lvm2/-/blob/28786f826abaf4b8cdbd38533fab864cc0e227c7/daemons/dmeventd/dmeventd.c#L1998-2011), consuming 100% CPU time for minutes:
<...>
close(246564837) = -1 EBADF (Bad file descriptor)
close(246564836) = -1 EBADF (Bad file descriptor)
close(246564835) = -1 EBADF (Bad file descriptor)
close(246564834) = -1 EBADF (Bad file descriptor)
close(246564833) = -1 EBADF (Bad file descriptor)
<...>
Although the reproduction case above has an explicit ulimit -n 1073741816 command, processes run in systemd service context typically have large open file limit by default.
Workaround: enable either dm-event.socket or dm-event.service. Those start dmeventd in foreground (-f), bypassing this daemonization step.