Daniel Kučera
2017-May-17 13:41 UTC
Re: [libvirt-users] Callback re-registration after libvirtd restart
Hi Daniel, I tried that but it doesn't work: func libvirt_close_callback(conn *libvirt.Connect, reason libvirt.ConnectCloseReason){ log.Printf("close callback: %+v", reason) } func event_listen() { log.Printf("event_listen %s", conf.Libvirt.LocalUrl) hv, err := libvirt.NewConnect(conf.Libvirt.LocalUrl) err = hv.RegisterCloseCallback(libvirt_close_callback) if err != nil { log.Printf("unable to register close callback") return } ... The callback fires only when I kill my app, ^CGot signal:%!(EXTRA syscall.Signal=interrupt) close callback: 0 but not when I restart libvirtd. I tried using both local and remote connect URIs: qemu+ssh://10.130.16.101/system, qemu+ssh://localhost/system, qemu+ssh:///system Thanks. D. 2017-05-17 15:24 GMT+02:00 Daniel P. Berrange <berrange@redhat.com>:> On Wed, May 17, 2017 at 03:08:23PM +0200, Daniel Kučera wrote: > > Hi all, > > > > I'm using libvirt-go and I following code to listen for lifecycle events: > > > > func event_listen() { > > log.Printf("event_listen %s", conf.Libvirt.LocalUrl) > > hv, err := libvirt.NewConnect(conf.Libvirt.LocalUrl) > > > > lifecycleCallback := func(c *libvirt.Connect, d *libvirt.Domain, > event > > *libvirt.DomainEventLifecycle) { > > event_message(c, d, "lifecycle", event) > > } > > > > _, err = hv.DomainEventLifecycleRegister(nil, lifecycleCallback) > > if err != nil { > > log.Printf("unable to register event callback") > > return > > } > > > > log.Printf("Libvirt event listener started") > > > > go func() { > > for err == nil { > > err = libvirt.EventRunDefaultImpl() > > log.Printf("EventRunDefaultImpl err: %+v", err) > > } > > time.Sleep(time.Second) > > event_listen() > > }() > > > > } > > > > It works ok until I restart libvirtd (service libvirtd restart). After > > that, the inner go func waits some time and continues without error. But > > the callback is not working anymore. > > > > My question is, how can I detect hv reconnect (I guess it's happening in > > background) so I know when to reinitialize callbacks? > > There is a separate event you can listen to that notifies when the > connection > is closed. See the RegisterCloseCallback() method on the Connect object. > > Basically register a callback there, and when it fires, unregister your > existing domain event callbacks, and close your existing Connect object > handle. Then fire a goroutine that loops once every few seconds trying > to open a new Connect object, and when that succeeds register new > domain event callbacks. > > Regards, > Daniel > -- > |: https://berrange.com -o- https://www.flickr.com/photos/ > dberrange :| > |: https://libvirt.org -o- > https://fstop138.berrange.com :| > |: https://entangle-photo.org -o- https://www.instagram.com/ > dberrange :| >
Daniel P. Berrange
2017-May-17 13:47 UTC
Re: [libvirt-users] Callback re-registration after libvirtd restart
On Wed, May 17, 2017 at 03:41:09PM +0200, Daniel Kučera wrote:> Hi Daniel, > > I tried that but it doesn't work: > > func libvirt_close_callback(conn *libvirt.Connect, reason > libvirt.ConnectCloseReason){ > log.Printf("close callback: %+v", reason) > } > > func event_listen() { > log.Printf("event_listen %s", conf.Libvirt.LocalUrl) > hv, err := libvirt.NewConnect(conf.Libvirt.LocalUrl) > > err = hv.RegisterCloseCallback(libvirt_close_callback) > if err != nil { > log.Printf("unable to register close callback") > return > } > ... > > The callback fires only when I kill my app,Looks like you are missing a call to libvirt.EventRegisterDefaultImpl(), which must be the first you do do before even connecting to libvirt. Regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
Daniel Kučera
2017-May-17 13:49 UTC
Re: [libvirt-users] Callback re-registration after libvirtd restart
No, I'm not, I'm calling it sooner: func libvirt_start() { libvirt.EventRegisterDefaultImpl() event_listen() } S pozdravom / Best regards Daniel Kucera. 2017-05-17 15:47 GMT+02:00 Daniel P. Berrange <berrange@redhat.com>:> On Wed, May 17, 2017 at 03:41:09PM +0200, Daniel Kučera wrote: > > Hi Daniel, > > > > I tried that but it doesn't work: > > > > func libvirt_close_callback(conn *libvirt.Connect, reason > > libvirt.ConnectCloseReason){ > > log.Printf("close callback: %+v", reason) > > } > > > > func event_listen() { > > log.Printf("event_listen %s", conf.Libvirt.LocalUrl) > > hv, err := libvirt.NewConnect(conf.Libvirt.LocalUrl) > > > > err = hv.RegisterCloseCallback(libvirt_close_callback) > > if err != nil { > > log.Printf("unable to register close callback") > > return > > } > > ... > > > > The callback fires only when I kill my app, > > Looks like you are missing a call to libvirt.EventRegisterDefaultImpl(), > which must be the first you do do before even connecting to libvirt. > > > Regards, > Daniel > -- > |: https://berrange.com -o- https://www.flickr.com/photos/ > dberrange :| > |: https://libvirt.org -o- > https://fstop138.berrange.com :| > |: https://entangle-photo.org -o- https://www.instagram.com/ > dberrange :| >