
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