On 21.03.2014 01:20, Wangyufei (James) wrote:
Yes, it's just a race condition here. It's not LXC, it's
just qemu-driver, and it's not using systemd for cgroup management.
(Running hypervisor: QEMU 1.5.1)
We can run these two command to clear cgroup dirctory 'machine' first:
service cgconfig restart
service cgred restart
Then we start multi VMs with 'virsh start' at the same time.
Stack 1:
#0 qemuInitCgroup (driver=0x7f13a0d01570, vm=0x7f138c0116a0, startup=true)
at qemu/qemu_cgroup.c:742
#1 0x00007f1394595b7d in qemuSetupCgroup (driver=0x7f13a0d01570,
vm=0x7f138c0116a0, nodemask=0x0) at qemu/qemu_cgroup.c:857
#2 0x00007f13945b40c5 in qemuProcessStart (conn=0x7f13a0d92870,
driver=0x7f13a0d01570, vm=0x7f138c0116a0, migrateFrom=0x0, stdin_fd=-1,
stdin_path=0x0, snapshot=0x0, vmop=VIR_NETDEV_VPORT_PROFILE_OP_CREATE,
flags=1) at qemu/qemu_process.c:3828
#3 0x00007f1394606c2c in qemuDomainObjStart (conn=0x7f13a0d92870,
driver=0x7f13a0d01570, vm=0x7f138c0116a0, flags=0)
at qemu/qemu_driver.c:5852
#4 0x00007f1394606e82 in qemuDomainCreateWithFlags (dom=0x7f138c01c490,
flags=0) at qemu/qemu_driver.c:5904
#5 0x00007f1394606f0b in qemuDomainCreate (dom=0x7f138c01c490)
at qemu/qemu_driver.c:5922
#6 0x00007f139ffc6e51 in virDomainCreate (domain=0x7f138c01c490)
at libvirt.c:9357
#7 0x00007f13a0a46ca2 in remoteDispatchDomainCreate (server=0x7f13a0cd9500,
client=0x7f138c01b060, msg=0x7f138c014920, rerr=0x7f13995d0b10,
args=0x7f138c01c4d0) at remote_dispatch.h:2931
#8 0x00007f13a0a46da4 in remoteDispatchDomainCreateHelper (
Stack 2:
#0 virCgroupMakeGroup (parent=0x7f138c01e1a0, group=0x7f138c0080f0,
create=true, flags=0) at util/vircgroup.c:751
#1 0x00007f139fec4f89 in virCgroupNewPartition (
path=0x7f138c008ee0 "/machine", create=true, controllers=-1,
group=0x7f13995d00f8) at util/vircgroup.c:1286
#2 0x00007f1394593888 in qemuInitCgroup (driver=0x7f13a0d01570,
vm=0x7f138c0116a0, startup=true) at qemu/qemu_cgroup.c:779
Thread A and Thread B start VMs at the same time.
In virCgroupMakeGroup:
if (!virFileExists(path)) {// Thread A and Thread B do the test at the same time
and both passed.
if (!create ||
mkdir(path, 0755) < 0) {//If thread A succeed here, then B will fail,
and B will do clear to remove the 'machine' directory, then A may fail to find the
dirctory removed by B.
Okay, ACKed and pushed then.
Michal