[libvirt] [RFC PATCH v1 1/7] call virstateCleanup to do the cleanup before libvirtd exits

Hu Tao hutao at cn.fujitsu.com
Wed Jan 23 10:11:58 UTC 2013


On Thu, Jan 17, 2013 at 05:28:28PM +0000, Daniel P. Berrange wrote:
> On Wed, Jan 16, 2013 at 10:53:03AM +0800, Hu Tao wrote:
> > ---
> >  daemon/libvirtd.c | 2 ++
> >  1 file changed, 2 insertions(+)
> > 
> > diff --git a/daemon/libvirtd.c b/daemon/libvirtd.c
> > index 9cdf4d9..7cb99b1 100644
> > --- a/daemon/libvirtd.c
> > +++ b/daemon/libvirtd.c
> > @@ -1500,5 +1500,7 @@ cleanup:
> >  
> >      daemonConfigFree(config);
> >  
> > +    virStateCleanup();
> > +
> >      return ret;
> >  }
> 
> Unfortunately this causes libvirtd to segv, if you Ctrl-C the daemon
> shortly after startup. The problem is that virStateCleanup is running
> before virStateInitialize has finished its work. We probably need to
> put a mutex in the virStateInitialize+virStateCleanup functions to
> make sure they serialize

Another problem about lockup is revealed by the method(Ctrl-C shortly after
the daemon startup), as below:

(gdb) bt
#0  0x000000336500ddcd in __lll_lock_wait () from /lib64/libpthread.so.0
#1  0x0000003365009c56 in _L_lock_840 () from /lib64/libpthread.so.0
#2  0x0000003365009b58 in pthread_mutex_lock () from /lib64/libpthread.so.0
#3  0x00007f2d21c2dbbd in virMutexLock (m=<optimized out>) at util/virthreadpthread.c:85
#4  0x00007f2d153e776d in qemuDriverLock (driver=<optimized out>) at qemu/qemu_conf.c:65
#5  0x00007f2d154180ee in qemuShutdown () at qemu/qemu_driver.c:1098
#6  0x00007f2d21c9fdaf in virStateCleanup () at libvirt.c:846
#7  0x000000000040c129 in main (argc=<optimized out>, argv=<optimized out>) at libvirtd.c:1517
(gdb) thread 2
[Switching to thread 2 (Thread 0x7f2d14f43700 (LWP 20335))]
#0  0x000000336500b595 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
(gdb) bt
#0  0x000000336500b595 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x00007f2d21c2dcea in virCondWait (c=c at entry=0x7f2d10059668, m=m at entry=0x7f2d10059640)
    at util/virthreadpthread.c:117
#2  0x00007f2d153fd9cc in qemuMonitorSend (mon=mon at entry=0x7f2d10059630, 
    msg=msg at entry=0x7f2d14f41f30) at qemu/qemu_monitor.c:889
#3  0x00007f2d1540e913 in qemuMonitorJSONCommandWithFd (mon=mon at entry=0x7f2d10059630, 
    cmd=cmd at entry=0x7f2d10014360, scm_fd=scm_fd at entry=-1, reply=reply at entry=0x7f2d14f41fb0)
    at qemu/qemu_monitor_json.c:265
#4  0x00007f2d1540ea95 in qemuMonitorJSONCommand (mon=mon at entry=0x7f2d10059630, 
    cmd=cmd at entry=0x7f2d10014360, reply=reply at entry=0x7f2d14f41fb0) at qemu/qemu_monitor_json.c:294
#5  0x00007f2d15410027 in qemuMonitorJSONSetCapabilities (mon=mon at entry=0x7f2d10059630)
    at qemu/qemu_monitor_json.c:991
#6  0x00007f2d153fea3d in qemuMonitorSetCapabilities (mon=mon at entry=0x7f2d10059630)
    at qemu/qemu_monitor.c:1153
#7  0x00007f2d153bef70 in qemuCapsInitQMP (runGid=0, runUid=0, runDir=<optimized out>, 
    libDir=0x7f2d10066310 "/var/lib/libvirt/qemu", caps=0x7f2d100567f0)
    at qemu/qemu_capabilities.c:2381
#8  qemuCapsNewForBinary (binary=binary at entry=0x7f2d1005f300 "/usr/local/bin/qemu-system-x86_64", 
    libDir=0x7f2d10066310 "/var/lib/libvirt/qemu", runDir=<optimized out>, runUid=0, runGid=0)
    at qemu/qemu_capabilities.c:2505
#9  0x00007f2d153c058e in qemuCapsCacheLookup (cache=cache at entry=0x7f2d10002420, 
    binary=0x7f2d1005f300 "/usr/local/bin/qemu-system-x86_64") at qemu/qemu_capabilities.c:2597
#10 0x00007f2d153c08c1 in qemuCapsInitGuest (guestarch=VIR_ARCH_I686, hostarch=VIR_ARCH_X86_64, 
    cache=0x7f2d10002420, caps=0x7f2d100653f0) at qemu/qemu_capabilities.c:685
#11 qemuCapsInit (cache=0x7f2d10002420) at qemu/qemu_capabilities.c:920
#12 0x00007f2d15418436 in qemuCreateCapabilities (driver=driver at entry=0x7f2d100269b0)
    at qemu/qemu_driver.c:424
#13 0x00007f2d15418d37 in qemuStartup (privileged=<optimized out>, callback=<optimized out>, 
    opaque=<optimized out>) at qemu/qemu_driver.c:874
#14 0x00007f2d21c9fcc0 in virStateInitialize (privileged=true, 
    callback=callback at entry=0x40d480 <daemonInhibitCallback>, opaque=opaque at entry=0x1ea2b40)
    at libvirt.c:822
#15 0x000000000040d5d5 in daemonRunStateInit (opaque=opaque at entry=0x1ea2b40) at libvirtd.c:877
#16 0x00007f2d21c2d986 in virThreadHelper (data=<optimized out>) at util/virthreadpthread.c:161
#17 0x0000003365007d14 in start_thread () from /lib64/libpthread.so.0
#18 0x0000003364cf167d in clone () from /lib64/libc.so.6
(gdb) 


-- 
Thanks,
Hu Tao




More information about the libvir-list mailing list