Hi In my program , When libvirtd restart , the old libvirtd connection(virConnectPtr) has to reconnect, Before usr old virConnectPtr , I call virConnectIsAlive. but when I restart libvirtd , virConnectIsAlive return 1, and I continue other operate use the old virConnectPtr, program will receive signal pipe. I use libvirt event. before any api use, I call virEventRegisterDefaultImpl, and run virEventRunDefaultImpl. then use virConnectIsAlive, when I restart libvirtd, virConnectIsAlive will return 0, I want know how to use virConnectIsAlive, if virConnectIsAlive use keep alive message, what default the interval and count. Thanks
On 10/17/2017 07:51 AM, llilulu wrote:> Hi > In my program , When libvirtd restart , the old libvirtd connection(virConnectPtr) has to reconnect, Before usr old virConnectPtr , I call virConnectIsAlive. but when I restart libvirtd , virConnectIsAlive return 1, and I continue other operate use the old virConnectPtr, program will receive signal pipe. > I use libvirt event. before any api use, I call virEventRegisterDefaultImpl, and run virEventRunDefaultImpl. then use virConnectIsAlive, when I restart libvirtd, virConnectIsAlive will return 0, I want know how to use virConnectIsAlive, if virConnectIsAlive use keep alive message, what default the interval and count. > Thanks >virConnectIsAlive() will produce desired result only when event loop is used (e.g. virEventRunDefaultImpl()). However, with this API there'll always be TOCTOU [1] race. Therefore I suggest registering a disconnect callback that reconnects. At least that's how it is done in virsh. This [2] is called before every command and then this [3] is the callback. Michal 1: https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use 2: https://libvirt.org/git/?p=libvirt.git;a=blob;f=tools/virsh.c;h=d1789f03adf1e264e5444dde9276be91bfc8a440;hb=HEAD#l336 3: https://libvirt.org/git/?p=libvirt.git;a=blob;f=tools/virsh.c;h=d1789f03adf1e264e5444dde9276be91bfc8a440;hb=HEAD#l97
On Tue, Oct 17, 2017 at 01:51:57PM +0800, llilulu wrote:>Hi > In my program , When libvirtd restart , the old libvirtd connection(virConnectPtr) has to reconnect, Before usr old virConnectPtr , I call virConnectIsAlive. but when I restart libvirtd , virConnectIsAlive return 1, and I continue other operate use the old virConnectPtr, program will receive signal pipe. > I use libvirt event. before any api use, I call virEventRegisterDefaultImpl, and run virEventRunDefaultImpl. then use virConnectIsAlive, when I restart libvirtd, virConnectIsAlive will return 0, I want know how to use virConnectIsAlive, if virConnectIsAlive use keep alive message, what default the interval and count.Hi, using virConnectIsAlive without running an event loop is pointless. It only tells you about the state of virConnectPtr's internal data and this state changes after the event loop processes it: https://libvirt.org/html/libvirt-libvirt-event.html#virEventRegisterDefaultImpl By default the daemon does send keepalive messages (and the client needs to run the event loop to process them), to send keepalive messages from the client you need to call virConnectSetKeepAlive: https://libvirt.org/html/libvirt-libvirt-host.html#virConnectSetKeepAlive Jan