On Fri, 14 Feb 2025 13:59:20 +0000 Daniel P. Berrangé <berra...@redhat.com> wrote:
> On Fri, Feb 14, 2025 at 11:18:55AM +0100, Laurent Vivier wrote: > > On 14/02/2025 11:06, Markus Armbruster wrote: > > > Laurent Vivier <lviv...@redhat.com> writes: > > > > > > > The netdev reports NETDEV_VHOST_USER_CONNECTED event when > > > > the chardev is connected, and NETDEV_VHOST_USER_DISCONNECTED > > > > when it is disconnected. > > > > > > > > The NETDEV_VHOST_USER_CONNECTED event includes the ChardevInfo > > > > (label, filename and frontend_open). > > > > > > > > This allows a system manager like libvirt to detect when the server > > > > fails. > > > > > > > > For instance with passt: > > > > > > > > { 'execute': 'qmp_capabilities' } > > > > { "return": { } } > > > > > > > > [killing passt here] > > > > > > > > { "timestamp": { "seconds": 1739517243, "microseconds": 115081 }, > > > > "event": "NETDEV_VHOST_USER_DISCONNECTED", > > > > "data": { "netdev-id": "netdev0" } } > > > > > > > > [automatic reconnection with reconnect-ms] > > > > > > > > { "timestamp": { "seconds": 1739517290, "microseconds": 343777 }, > > > > "event": "NETDEV_VHOST_USER_CONNECTED", > > > > "data": { "netdev-id": "netdev0", > > > > "info": { "frontend-open": true, > > > > "filename": "unix:", > > > > "label": "chr0" } } } > > > > > > > > Signed-off-by: Laurent Vivier <lviv...@redhat.com> > > > > > > Standard question for events: if a management application misses an > > > event, say because it restarts and reconnects, is there a way to obtain > > > the missed information with a query command? > > > > > > > query-chardev could help but it doesn't provide the netdev id. > > It doesn't have to IMHO. The application that created the NIC should know > what ID it assigned to both the netdev and chardev, and thus should be > able to use query-chardev to identify the chardev it previously > associated with the netdev. It does (of course?), see processNetdevStreamDisconnectedEvent() in libvirt, src/qemu/qemu_driver.c: static void processNetdevStreamDisconnectedEvent(virDomainObj *vm, const char *netdevId) { [...] const char *devAlias = STRSKIP(netdevId, "host"); /* The event sends us the "netdev-id", but we don't store the * netdev-id in the NetDef and thus can't use it to find the * correct NetDef. We *do* keep the device alias in the NetDef, * and by convention the netdev-id is always "host" + devAlias, so * we just need to remove "host" from the front of netdev-id to * get the alias, which we can then use to find the proper NetDef. */ [...] if (virDomainDefFindDevice(vm->def, devAlias, &dev, true) < 0) { VIR_WARN("NETDEV_STREAM_DISCONNECTED event received for non-existent device %s in domain %s", devAlias, vm->def->name); goto endjob; } [...] -- Stefano