The issue about adding multipath device's targets into qemu-pr-helper's namespace

Lin Ma lma at suse.de
Mon Jul 20 14:36:02 UTC 2020


On 2020-07-17 07:05, Michal Prívozník wrote:
> On 7/15/20 5:35 AM, Lin Ma wrote:
>> On 2020-07-14 14:38, Michal Privoznik wrote:
>>> On 7/14/20 3:41 PM, Lin Ma wrote:
>>>> Hi all,
>>>> 
>>>> I have a namespace question about passthrough disk(multipath 
>>>> device).
>>>> In case of enabling namespace and cgroups in qemu.conf, The 
>>>> target(s) of the
>>>> multipath device won't be added into qemu-pr-helper's namespace 
>>>> under certain
>>>> situation, It causes the PERSISTENT RESERVE command failure in 
>>>> guest.
>>>> 
>>> 
>>> Yeah, this is expected. I mean, the failure is expected if not all
>>> devices are added to the namespace.
>>> 
>>>> While user starts a vm,
>>>> To build namespace, The qemuDomainSetupDisk() will be invoked via 
>>>> threadA(this
>>>> thread id will be the qemu's pid),
>>>> To build cgroup, The qemuSetupImagePathCgroup() will be invoked via 
>>>> threadB.
>>>> 
>>>> Both of the functions invoke the virDevMapperGetTargets() trying to 
>>>> parse a
>>>> multipath device to target paths string, Then fill the 
>>>> targetPaths[].
>>>> 
>>>> The issue I experienced is:
>>>> After libvirtd started, Everything works well for the first booted 
>>>> vm which has
>>>> the passthrough multipath device.
>>>> But If I shut it down & start it again, OR keep it running & start 
>>>> another vm
>>>> which has other passthrough multipath device, Then the target(s) of 
>>>> the fresh
>>>> started vm won't be added into the related qemu-pr-helper's 
>>>> namespace and it
>>>> causes PERSISTENT RESERVE command failure in the corresponding 
>>>> guest.
>>>> I digged into code, In this situation, The targetPaths[] in 
>>>> qemuDomainSetupDisk()
>>>> won't be filled, it keeps NULL after virDevMapperGetTargets() 
>>>> returns.
>>>> The virDevMapperGetTargets doesn't fill targetPaths[] because the 
>>>> dm_task_run()
>>>> of libdevmapper returns 0 with errno 9(Bad file descriptor).
>>>> So far, I don't understand why the dm_task_run() return 0 in this 
>>>> situation.
>>>> BTW, The virDevMapperGetTargets() can always successfully fill the 
>>>> targetPaths[]
>>>> in qemuSetupImagePathCgroup().
>>> 
>>> What is your libvirt version? I've merged a fix for something similar
>>> not a long ago: v6.5.0-rc1~190
>>> 
>>> Can you please check v6.5.0?
>> 
>> The libvirt version I used in the tests is git master.
>> The sure thing is that the multipath devices I used are valid and 
>> functional.
>> 
>> In the test A or the test B, Everytime we restart libvirtd, The issue 
>> won't happen for
>> the first booted vm.
>> 
>> In other words, The target of multipath device can be parsed & added 
>> to qemu-pr-helper's
>> namespace for the first booted vm.
>> 
>> As long as libvirtd once invoked 
>> qemuSetupImagePathCgroup()->virDevMapperGetTargetsImpl()
>> to successfully parse any valid multipath device,
>>  From then on, The 
>> qemuDomainSetupDisk()->virDevMapperGetTargetsImpl()->dm_task_run()
>> returns 0 with errno=9 when parsing any valid multipath device.
> 
> At this point I'm wondering whether we are using the API correctly.
> If you disable namespaces, then CGroups still need to know the targets
> and will query dm. Does that work?
Only disable namespaces or only disable CGroups, The process of querying 
dm deps works well.

> The aim is to do what 'dmsetup deps' does. Once you reach the error
> state - does that command work?
'dmsetup deps' works well while I hit the error state.

> 
> errno=9 is EBADF so maybe this is a dm issue after all?
Emm...So far I lean towards to an issue in libvirt code, rather than in 
dm.


> BTW:
> 
> Maybe we will need to merge the following patch to log error messages 
> from dm?
> 
> https://gitlab.com/MichalPrivoznik/libvirt/-/commit/ed3a7ae5d0cd3f492fe219dbd6b4820dde55841f
After merged this commit, I pasted part of log outputs here:

* libvirtd log:
2020-07-20 08:19:27.970+0000: 4621: info : libvirt version: 6.6.0
2020-07-20 08:19:27.970+0000: 4621: info : hostname: tw
......
2020-07-20 08:19:27.970+0000: 4636: debug : virThreadJobSetWorker:75 : 
Thread 4636 is running worker prio-rpc-worker
2020-07-20 08:19:27.971+0000: 4631: debug : virThreadJobSetWorker:75 : 
Thread 4631 is running worker rpc-worker
2020-07-20 08:19:27.971+0000: 4637: debug : virThreadJobSetWorker:75 : 
Thread 4637 is running worker prio-rpc-worker
2020-07-20 08:19:27.971+0000: 4635: debug : virThreadJobSetWorker:75 : 
Thread 4635 is running worker rpc-worker
2020-07-20 08:19:27.971+0000: 4634: debug : virThreadJobSetWorker:75 : 
Thread 4634 is running worker rpc-worker
2020-07-20 08:19:27.971+0000: 4639: debug : virThreadJobSetWorker:75 : 
Thread 4639 is running worker prio-rpc-worker
2020-07-20 08:19:27.971+0000: 4638: debug : virThreadJobSetWorker:75 : 
Thread 4638 is running worker prio-rpc-worker
......
2020-07-20 08:19:27.971+0000: 4632: debug : virThreadJobSetWorker:75 : 
Thread 4632 is running worker rpc-worker
......
2020-07-20 08:19:33.293+0000: 4632: debug : qemuSetupImagePathCgroup:73 
: Allow path /opt/vms/guest01/disk0.qcow2, perms: rw
2020-07-20 08:19:33.293+0000: 4632: debug : qemuSetupImagePathCgroup:73 
: Allow path /dev/mapper/control, perms: rw
2020-07-20 08:19:33.293+0000: 4632: debug : virCgroupSetValueRaw:454 : 
Set value 
'/sys/fs/cgroup/devices/machine.slice/machine-qemu\x2d1\x2dguest01.scope/devices.allow' 
to 'c 10:236 rw'
2020-07-20 08:19:33.293+0000: 4632: debug : virFileClose:134 : Closed fd 
28
2020-07-20 08:19:33.293+0000: 4632: debug : qemuSetupImagePathCgroup:73 
: Allow path /dev/mapper/vm1-data, perms: rw
2020-07-20 08:19:33.293+0000: 4632: debug : virCgroupSetValueRaw:454 : 
Set value 
'/sys/fs/cgroup/devices/machine.slice/machine-qemu\x2d1\x2dguest01.scope/devices.allow' 
to 'b 254:11 rw'
2020-07-20 08:19:33.293+0000: 4632: debug : virFileClose:134 : Closed fd 
28
2020-07-20 08:19:33.293+0000: 4632: debug : virDevMapperDummyLogger:57 : 
dm log: level=7 file=ioctl/libdm-iface.c:1863 errno=4 : dm version   [ 
opencount flush ]   [16384] (*1)
2020-07-20 08:19:33.293+0000: 4632: debug : virDevMapperDummyLogger:57 : 
dm log: level=7 file=ioctl/libdm-iface.c:1863 errno=4 : dm deps vm1-data 
  [ noopencount flush ]   [16384] (*1)
2020-07-20 08:19:33.293+0000: 4632: debug : virCgroupSetValueRaw:454 : 
Set value 
'/sys/fs/cgroup/devices/machine.slice/machine-qemu\x2d1\x2dguest01.scope/devices.allow' 
to 'b 8:48 rw'
2020-07-20 08:19:33.293+0000: 4632: debug : virFileClose:134 : Closed fd 
30
2020-07-20 08:19:33.293+0000: 4632: debug : virCgroupSetValueRaw:454 : 
Set value 
'/sys/fs/cgroup/devices/machine.slice/machine-qemu\x2d1\x2dguest01.scope/devices.allow' 
to 'c 136:* rw'
2020-07-20 08:19:33.293+0000: 4632: debug : virFileClose:134 : Closed fd 
30
......
2020-07-20 08:19:33.293+0000: 4632: debug : virCgroupSetValueRaw:454 : 
Set value 
'/sys/fs/cgroup/devices/machine.slice/machine-qemu\x2d1\x2dguest01.scope/devices.allow' 
to 'c 10:232 rw'
2020-07-20 08:19:33.293+0000: 4632: debug : virFileClose:134 : Closed fd 
30
2020-07-20 08:19:33.293+0000: 4632: debug : qemuSetupRNGCgroup:659 : 
Setting Cgroup ACL for RNG device
......
......
2020-07-20 08:19:58.825+0000: 4635: debug : qemuSetupImagePathCgroup:73 
: Allow path /opt/vms/guest02/disk0.qcow2, perms: rw
2020-07-20 08:19:58.825+0000: 4635: debug : qemuSetupImagePathCgroup:73 
: Allow path /dev/mapper/control, perms: rw
2020-07-20 08:19:58.825+0000: 4635: debug : virCgroupSetValueRaw:454 : 
Set value 
'/sys/fs/cgroup/devices/machine.slice/machine-qemu\x2d2\x2dguest02.scope/devices.allow' 
to 'c 10:236 rw'
2020-07-20 08:19:58.825+0000: 4635: debug : virFileClose:134 : Closed fd 
32
2020-07-20 08:19:58.825+0000: 4635: debug : qemuSetupImagePathCgroup:73 
: Allow path /dev/mapper/vm2-data, perms: rw
2020-07-20 08:19:58.825+0000: 4635: debug : virCgroupSetValueRaw:454 : 
Set value 
'/sys/fs/cgroup/devices/machine.slice/machine-qemu\x2d2\x2dguest02.scope/devices.allow' 
to 'b 254:8 rw'
2020-07-20 08:19:58.825+0000: 4635: debug : virFileClose:134 : Closed fd 
32
2020-07-20 08:19:58.825+0000: 4635: debug : virDevMapperDummyLogger:57 : 
dm log: level=7 file=ioctl/libdm-iface.c:1863 errno=4 : dm deps vm2-data 
  [ noopencount flush ]   [16384] (*1)
2020-07-20 08:19:58.825+0000: 4635: debug : virCgroupSetValueRaw:454 : 
Set value 
'/sys/fs/cgroup/devices/machine.slice/machine-qemu\x2d2\x2dguest02.scope/devices.allow' 
to 'b 8:64 rw'
2020-07-20 08:19:58.825+0000: 4635: debug : virFileClose:134 : Closed fd 
32
2020-07-20 08:19:58.825+0000: 4635: debug : virCgroupSetValueRaw:454 : 
Set value 
'/sys/fs/cgroup/devices/machine.slice/machine-qemu\x2d2\x2dguest02.scope/devices.allow' 
to 'c 136:* rw'
2020-07-20 08:19:58.825+0000: 4635: debug : virFileClose:134 : Closed fd 
32
......
2020-07-20 08:19:58.825+0000: 4635: debug : virCgroupSetValueRaw:454 : 
Set value 
'/sys/fs/cgroup/devices/machine.slice/machine-qemu\x2d2\x2dguest02.scope/devices.allow' 
to 'c 10:232 rw'
2020-07-20 08:19:58.825+0000: 4635: debug : virFileClose:134 : Closed fd 
32
2020-07-20 08:19:58.825+0000: 4635: debug : qemuSetupRNGCgroup:659 : 
Setting Cgroup ACL for RNG device
......


* /var/log/libvirt/qemu/guest01.log:
qemu-system-x86_64 pid: 4752
qemu-pr-helper pid: 4762

2020-07-20 08:19:33.251+0000: 4752: debug : 
qemuDomainSetupAllDisks:10180 : Setting up disks
2020-07-20 08:19:33.251+0000: 4752: debug : virFileMakeParentPath:3100 : 
path=/var/run/libvirt/qemu/1-guest01.dev/mapper/vm1-data
2020-07-20 08:19:33.251+0000: 4752: debug : virFileMakePathHelper:3037 : 
path=/var/run/libvirt/qemu/1-guest01.dev/mapper mode=0777
2020-07-20 08:19:33.251+0000: 4752: debug : virFileMakePathHelper:3037 : 
path=/var/run/libvirt/qemu/1-guest01.dev mode=0777
2020-07-20 08:19:33.251+0000: 4752: debug : 
qemuDomainCreateDeviceRecursive:9893 : Creating dev /dev/mapper/vm1-data
2020-07-20 08:19:33.251+0000: 4752: debug : virFileMakeParentPath:3100 : 
path=/var/run/libvirt/qemu/1-guest01.dev/mapper/../dm-11
2020-07-20 08:19:33.251+0000: 4752: debug : virFileMakePathHelper:3037 : 
path=/var/run/libvirt/qemu/1-guest01.dev/mapper/.. mode=0777
2020-07-20 08:19:33.251+0000: 4752: debug : 
qemuDomainCreateDeviceRecursive:9893 : Creating dev /dev/mapper/../dm-11
2020-07-20 08:19:33.251+0000: 4752: debug : virDevMapperDummyLogger:57 : 
dm log: level=7 file=ioctl/libdm-iface.c:1863 errno=4 : dm version   [ 
opencount flush ]   [16384] (*1)
2020-07-20 08:19:33.251+0000: 4752: debug : virDevMapperDummyLogger:57 : 
dm log: level=7 file=ioctl/libdm-iface.c:1863 errno=4 : dm deps vm1-data 
  [ noopencount flush ]   [16384] (*1)
2020-07-20 08:19:33.251+0000: 4752: debug : virFileMakeParentPath:3100 : 
path=/var/run/libvirt/qemu/1-guest01.dev/block/8:48
2020-07-20 08:19:33.251+0000: 4752: debug : virFileMakePathHelper:3037 : 
path=/var/run/libvirt/qemu/1-guest01.dev/block mode=0777
2020-07-20 08:19:33.251+0000: 4752: debug : virFileMakePathHelper:3037 : 
path=/var/run/libvirt/qemu/1-guest01.dev mode=0777
2020-07-20 08:19:33.251+0000: 4752: debug : 
qemuDomainCreateDeviceRecursive:9893 : Creating dev /dev/block/8:48
2020-07-20 08:19:33.251+0000: 4752: debug : virFileMakeParentPath:3100 : 
path=/var/run/libvirt/qemu/1-guest01.dev/block/../sdd
2020-07-20 08:19:33.251+0000: 4752: debug : virFileMakePathHelper:3037 : 
path=/var/run/libvirt/qemu/1-guest01.dev/block/.. mode=0777
2020-07-20 08:19:33.251+0000: 4752: debug : 
qemuDomainCreateDeviceRecursive:9893 : Creating dev /dev/block/../sdd
2020-07-20 08:19:33.251+0000: 4752: debug : virFileMakeParentPath:3100 : 
path=/var/run/libvirt/qemu/1-guest01.dev/mapper/control
2020-07-20 08:19:33.251+0000: 4752: debug : virFileMakePathHelper:3037 : 
path=/var/run/libvirt/qemu/1-guest01.dev/mapper mode=0777
2020-07-20 08:19:33.251+0000: 4752: debug : 
qemuDomainCreateDeviceRecursive:9893 : Creating dev /dev/mapper/control
2020-07-20 08:19:33.251+0000: 4752: debug : 
qemuDomainSetupAllDisks:10189 : Setup all disks


* /var/log/libvirt/qemu/guest02.log:
qemu-system-x86_64 pid: 4847
qemu-pr-helper pid: 4873

2020-07-20 08:19:58.768+0000: 4847: debug : 
qemuDomainSetupAllDisks:10180 : Setting up disks
2020-07-20 08:19:58.768+0000: 4847: debug : virFileMakeParentPath:3100 : 
path=/var/run/libvirt/qemu/2-guest02.dev/mapper/vm2-data
2020-07-20 08:19:58.768+0000: 4847: debug : virFileMakePathHelper:3037 : 
path=/var/run/libvirt/qemu/2-guest02.dev/mapper mode=0777
2020-07-20 08:19:58.768+0000: 4847: debug : virFileMakePathHelper:3037 : 
path=/var/run/libvirt/qemu/2-guest02.dev mode=0777
2020-07-20 08:19:58.768+0000: 4847: debug : 
qemuDomainCreateDeviceRecursive:9893 : Creating dev /dev/mapper/vm2-data
2020-07-20 08:19:58.768+0000: 4847: debug : virFileMakeParentPath:3100 : 
path=/var/run/libvirt/qemu/2-guest02.dev/mapper/../dm-8
2020-07-20 08:19:58.768+0000: 4847: debug : virFileMakePathHelper:3037 : 
path=/var/run/libvirt/qemu/2-guest02.dev/mapper/.. mode=0777
2020-07-20 08:19:58.768+0000: 4847: debug : 
qemuDomainCreateDeviceRecursive:9893 : Creating dev /dev/mapper/../dm-8
2020-07-20 08:19:58.768+0000: 4847: debug : virDevMapperDummyLogger:57 : 
dm log: level=7 file=ioctl/libdm-iface.c:1863 errno=4 : dm deps vm2-data 
  [ noopencount flush ]   [16384] (*1)
2020-07-20 08:19:58.768+0000: 4847: debug : virDevMapperDummyLogger:57 : 
dm log: level=3 file=ioctl/libdm-iface.c:1913 errno=-1 : device-mapper: 
deps ioctl on vm2-data  failed: Bad file descriptor
2020-07-20 08:19:58.768+0000: 4847: debug : virFileMakeParentPath:3100 : 
path=/var/run/libvirt/qemu/2-guest02.dev/mapper/control
2020-07-20 08:19:58.768+0000: 4847: debug : virFileMakePathHelper:3037 : 
path=/var/run/libvirt/qemu/2-guest02.dev/mapper mode=0777
2020-07-20 08:19:58.768+0000: 4847: debug : 
qemuDomainCreateDeviceRecursive:9893 : Creating dev /dev/mapper/control
2020-07-20 08:19:58.768+0000: 4847: debug : 
qemuDomainSetupAllDisks:10189 : Setup all disks

Thanks,
Lin





More information about the libvir-list mailing list