LVM poll daemon overview ======================== (last updated: 2015-05-09) LVM poll daemon (lvmpolld) is the alternative for lvm2 classical polling mechanisms. The motivation behind new lvmpolld was to create persistent system service that would be more durable and transparent. It's suited particularly for any systemd enabled distribution. Before lvmpolld any background polling process originating in a lvm2 command initiated inside cgroup of a systemd service could get killed if the main process (service) exited in such cgroup. That could lead to premature termination of such lvm2 polling process. Also without lvmpolld there were no means to detect a particular polling process suited for monitoring of specific operation is already in-progress and therefore it's not desirable to start next one with exactly same task. lvmpolld is able to detect such duplicate requests and not spawn such redundant process. lvmpolld is primarily targeted for systems with systemd as init process. For systems without systemd there's no need to install lvmpolld because there is no issue with observation described in second paragraph. You can still benefit from avoiding duplicate polling process being spawned, but without systemd lvmpolld can't easily be run on-demand (activated by a socket maintained by systemd). lvmpolld implement shutdown on idle and can shutdown automatically when idle for requested time. 60 second is recommended default here. This behaviour can be turned off if found useless. Data structures --------------- a) Logical Volume (struct lvmpolld_lv) Each operation is identified by LV. Internal identifier within lvmpolld is full LV uuid (vg_uuid+lv_uuid) prefixed with LVM_SYSTEM_DIR if set by client. such full identifier may look like: "/etc/lvm/lvm.confWFd2dU67S8Av29IcJCnYzqQirdfElnxzhCdzEh7EJrfCn9R1TIQjIj58weUZDre4" or without LVM_SYSTEM_DIR being set explicitly: "WFd2dU67S8Av29IcJCnYzqQirdfElnxzhCdzEh7EJrfCn9R1TIQjIj58weUZDre4" LV carries various metadata about polling operation. The most significant are: VG name LV name polling interval (usually --interval passed to lvm2 command or default from lvm2 configuration) operation type (one of: pvmove, convert, merge, thin_merge) LVM_SYSTEM_DIR (if set, this is also passed among environment variables of lvpoll command spawned by lvmpolld) b) LV stores (struct lvmpolld_store) lvmpolld uses two stores for Logical volumes (struct lvmpolld_lv). One store for polling operations in-progress. These operations are as of now: PV move, mirror up-conversion, classical snapshot merge, thin snapshot merge. The second store is suited only for pvmove --abort operations in-progress. Both stores are independent and identical LVs (pvmove /dev/sda3 and pvmove --abort /dev/sda3) can be run concurently from lvmpolld point of view (on lvm2 side the consistency is guaranteed by lvm2 locking mechanism). Locking order ------------- There are two types of locks in lvmpolld. Each store has own store lock and each LV has own lv lock. Locking order is: 1) store lock 2) LV lock Each LV has to be inside a store. When daemon requires to take both locks it has to take a store lock first and LV lock has to be taken afterwards (after the appropriate store lock where the LV is being stored :))