where can i find the sourcecode from virDomainDestroy ?

Laine Stump laine at redhat.com
Fri Oct 16 16:34:30 UTC 2020

On 10/16/20 11:37 AM, Lentes, Bernd wrote:
> Hi,
> i have some questions concerning the destroying of domains, and i hope i'm right here. If not sorry for the disturbance.
> I'm running a two node HA cluster with pacemaker and KVM domains as resources.
> >From time to time when i try to stop a domain with the cluster manager that does not work, so the domain is destroyed.
> That's ok.
> But seldom and irregular also destroy does not work, so the node this domain is running on is fenced.
> That's ugly. Fencing is the worst which can happen to a cluster and i try to avoid it.
> Maybe destroy does not work because of heavy load, i'm currently examing that.
> I installed the source package from libvirt-4.0.0, i have a SLES 12 SP4.

The first thing to try, if there is any possibility, is to upgrade your 
libvirt version. 4.0.0 is nearly 3 years out of date at this time, and 
*a lot* has changed since then. If you actually are experiencing a 
libvirt bug, then it's very likely it was identified and fixed during 
this time. (Even though you are running and older version of SLES, it's 
likely someone somewhere has built a newer version and has a pre-built 
package available)

> I found a virsh-domain.c which i assume is responsible for the domains. Right ?

virsh-domain.c contains the functions that correspond to domain-related 
commands of the virsh utility. They gather input from the commandline, 
then call libvirt's public API. So you won't find much there.

> I found a function called "virDomainDestroy", which i believe has the purpose to destroy the domain. Right ?

That is the top-level public API (what is called by user programs like 
virsh or virt-manager). It looks into the virConnect object that was 
previously opened by said user program, and calls the domainDestroy() 
function for whichever hypervisor driver you're using. So for example, 
if you are using the QEMU driver, it will end up calling 
qemuDomainDestroy(), or if you're using xen (libxl), it will call 
libxlDomainDestroy() (you can get a list of all these functions by 
searching for "domainDestroy" in the source - each hypervisor will 
initialize the .domainDestroy member of its virHypervisorDriver object 
with a pointer to its domainDestroy function.)

 From there, you can search for the appropriate function for the 
hypervisor you're using. For example, qemuDomainDestroy is in 
src/qemu/qemu_driver.c, and libxlDomainDestroy is in 

> But i don't find the source for that function. I greped the whole source code for it, but didn't find it.

If you grep'ed all the source you have for virDomainDestroy and didn't 
find it, then either you don't have all the source, or there was a 
mistake in your grep command :-). virDomainDestroy is in 
src/libvirt-domain.c (but as I detailed above, that's not actually the 
function you're looking for, only a switch-point in the long linkage of 
the journey from application to hypervisor driver).

In the end, while I don't want to discourage looking into the source in 
general, since it's always enlightening and leads to a better 
understanding, this may not be the most efficient path to a solution; 
you may get better, faster results by upgrading to as new a version of 
libvirt as possible, then if the error continues, come back to the list 
with a detailed description of the error (or if you think direct 
interaction could lead to a quicker resolution, point an IRC client at 
irc.oftc.net, join the #virt channel, and ask away - several libvirt 
developers are there during weekday normal worktime (mostly in Europe, 
plus a few in the U.S.), and we try our best to be helpful and polite :-)

Good luck!

> I'd like to know what this function returns in success or failure.
> Could you please help me ?
> Thanks.
> Bernd

More information about the libvir-list mailing list