]> xenbits.xensource.com Git - libvirt.git/commitdiff
network: fix connection usage counts after restart
authorDaniel P. Berrangé <berrange@redhat.com>
Fri, 13 Sep 2019 14:54:18 +0000 (15:54 +0100)
committerDaniel P. Berrangé <berrange@redhat.com>
Fri, 13 Sep 2019 16:33:58 +0000 (17:33 +0100)
Since the introduction of the virNetworkPort object, the network driver
has a persistent record of ports that have been created against the
networks. Thus the hypervisor drivers no longer communicate to the
network driver during libvirtd restart.

This change, however, meant that the connection usage counts were
no longer re-initialized during a libvirtd restart. To deal with this we
must iterate over all virNetworkPortDefPtr objects we have and invoke
the notify callback to record the connection usage count.

Reviewed-by: Laine Stump <laine@laine.org>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/conf/virnetworkobj.c
src/conf/virnetworkobj.h
src/libvirt_private.syms
src/network/bridge_driver.c

index d63ead7fac60d21e3f47769ea59c67baa8866bf1..ca1d598cf9fb4399709b3806643ec55e2e1e3f94 100644 (file)
@@ -1844,6 +1844,39 @@ virNetworkObjPortListExport(virNetworkPtr net,
 }
 
 
+typedef struct _virNetworkObjPortListForEachData virNetworkObjPortListForEachData;
+struct _virNetworkObjPortListForEachData {
+    virNetworkPortListIter iter;
+    void *opaque;
+    bool err;
+};
+
+static int
+virNetworkObjPortForEachCallback(void *payload,
+                                 const void *name ATTRIBUTE_UNUSED,
+                                 void *opaque)
+{
+    virNetworkObjPortListForEachData *data = opaque;
+
+    if (!data->iter(payload, data->opaque))
+        data->err = true;
+
+    return 0;
+}
+
+int
+virNetworkObjPortForEach(virNetworkObjPtr obj,
+                         virNetworkPortListIter iter,
+                         void *opaque)
+{
+    virNetworkObjPortListForEachData data = { iter, opaque, false };
+    virHashForEach(obj->ports, virNetworkObjPortForEachCallback, &data);
+    if (data.err)
+        return -1;
+    return 0;
+}
+
+
 static int
 virNetworkObjLoadAllPorts(virNetworkObjPtr net,
                           const char *stateDir)
index 1c28f0888c3fda12e92ef7a3aa5cfb5d288989ad..a91b4304c6a2587c34e94b042c1f520ad41db37d 100644 (file)
@@ -190,6 +190,15 @@ virNetworkObjPortListExport(virNetworkPtr net,
                             virNetworkPortPtr **ports,
                             virNetworkPortListFilter filter);
 
+typedef bool
+(*virNetworkPortListIter)(virNetworkPortDefPtr portdef,
+                          void *opaque);
+
+int
+virNetworkObjPortForEach(virNetworkObjPtr obj,
+                         virNetworkPortListIter iter,
+                         void *opaque);
+
 int
 virNetworkObjSaveStatus(const char *statusDir,
                         virNetworkObjPtr net,
index 7fe10d2286d7c83876c2765d9a7dace0bf9a255e..37afb07e212b7885849ac11fe6d618abd97f3ca7 100644 (file)
@@ -1097,6 +1097,7 @@ virNetworkObjLookupPort;
 virNetworkObjMacMgrAdd;
 virNetworkObjMacMgrDel;
 virNetworkObjNew;
+virNetworkObjPortForEach;
 virNetworkObjPortListExport;
 virNetworkObjRemoveInactive;
 virNetworkObjReplacePersistentDef;
index 7b441846161a244b81f3ba5509d00d958b4f016f..0fee153cb8033ae5c2d929910f324b57de84e6fe 100644 (file)
@@ -527,6 +527,21 @@ networkBridgeDummyNicName(const char *brname)
 }
 
 
+static int
+networkNotifyPort(virNetworkObjPtr obj,
+                  virNetworkPortDefPtr port);
+
+static bool
+networkUpdatePort(virNetworkPortDefPtr port,
+                  void *opaque)
+{
+    virNetworkObjPtr obj = opaque;
+
+    networkNotifyPort(obj, port);
+
+    return false;
+}
+
 static int
 networkUpdateState(virNetworkObjPtr obj,
                    void *opaque)
@@ -591,6 +606,8 @@ networkUpdateState(virNetworkObjPtr obj,
         goto cleanup;
     }
 
+    virNetworkObjPortForEach(obj, networkUpdatePort, obj);
+
     /* Try and read dnsmasq/radvd pids of active networks */
     if (virNetworkObjIsActive(obj) && def->ips && (def->nips > 0)) {
         pid_t radvdPid;