[PATCH 4/4] interface: let netcf pre-filter for active vs. inactive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



If a system has a large number of active or active interfaces, it can
be a big waste of time to retrieve and qualify all interfaces if the
caller only wanted one subset. Since netcf has a simple flag for this,
translate the libvirt flag into a netcf flag and let netcf pre-filter.
---
 src/interface/interface_backend_netcf.c | 40 +++++++++++++--------------------
 1 file changed, 16 insertions(+), 24 deletions(-)

diff --git a/src/interface/interface_backend_netcf.c b/src/interface/interface_backend_netcf.c
index 169ca57..0181635 100644
--- a/src/interface/interface_backend_netcf.c
+++ b/src/interface/interface_backend_netcf.c
@@ -528,10 +528,10 @@ netcfConnectListAllInterfaces(virConnectPtr conn,
 {
     int count;
     size_t i;
+    unsigned int ncf_flags = 0;
     struct netcf_if *iface = NULL;
     virInterfacePtr *tmp_iface_objs = NULL;
     virInterfacePtr iface_obj = NULL;
-    bool active;
     int niface_objs = 0;
     int ret = -1;
     char **names = NULL;
@@ -543,14 +543,20 @@ netcfConnectListAllInterfaces(virConnectPtr conn,
 
     virObjectLock(driver);
 
-    /* List all interfaces, in case of we might support new filter flags
-     * except active|inactive in future.
-     */
-    count = ncf_num_of_interfaces(driver->netcf, NETCF_IFACE_ACTIVE |
-                                  NETCF_IFACE_INACTIVE);
-    if (count < 0) {
+    /* let netcf pre-filter for this flag to save time */
+    if (MATCH(VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE)) {
+        if (MATCH(VIR_CONNECT_LIST_INTERFACES_ACTIVE))
+            ncf_flags |= NETCF_IFACE_ACTIVE;
+        if (MATCH(VIR_CONNECT_LIST_INTERFACES_INACTIVE))
+            ncf_flags |= NETCF_IFACE_INACTIVE;
+    } else {
+        ncf_flags = NETCF_IFACE_ACTIVE | NETCF_IFACE_INACTIVE;
+    }
+
+    if ((count = ncf_num_of_interfaces(driver->netcf, ncf_flags)) < 0) {
         const char *errmsg, *details;
         int errcode = ncf_error(driver->netcf, &errmsg, &details);
+
         virReportError(netcf_to_vir_err(errcode),
                        _("failed to get number of host interfaces: %s%s%s"),
                        errmsg, details ? " - " : "",
@@ -566,11 +572,11 @@ netcfConnectListAllInterfaces(virConnectPtr conn,
     if (VIR_ALLOC_N(names, count) < 0)
         goto cleanup;
 
-    if ((count = ncf_list_interfaces(driver->netcf, count, names,
-                                     NETCF_IFACE_ACTIVE |
-                                     NETCF_IFACE_INACTIVE)) < 0) {
+    if ((count = ncf_list_interfaces(driver->netcf, count,
+                                     names, ncf_flags)) < 0) {
         const char *errmsg, *details;
         int errcode = ncf_error(driver->netcf, &errmsg, &details);
+
         virReportError(netcf_to_vir_err(errcode),
                        _("failed to list host interfaces: %s%s%s"),
                        errmsg, details ? " - " : "",
@@ -604,9 +610,6 @@ netcfConnectListAllInterfaces(virConnectPtr conn,
             }
         }
 
-        if (netcfInterfaceObjIsActive(iface, &active) < 0)
-            goto cleanup;
-
         if (!(def = netcfGetMinimalDefForDevice(iface)))
             goto cleanup;
 
@@ -616,17 +619,6 @@ netcfConnectListAllInterfaces(virConnectPtr conn,
             virInterfaceDefFree(def);
             continue;
         }
-        /* XXX: Filter the result, need to be split once new filter flags
-         * except active|inactive are supported.
-         */
-        if (MATCH(VIR_CONNECT_LIST_INTERFACES_FILTERS_ACTIVE) &&
-            !((MATCH(VIR_CONNECT_LIST_INTERFACES_ACTIVE) && active) ||
-              (MATCH(VIR_CONNECT_LIST_INTERFACES_INACTIVE) && !active))) {
-            virInterfaceDefFree(def);
-            ncf_if_free(iface);
-            iface = NULL;
-            continue;
-        }
 
         if (ifaces) {
             if (!(iface_obj = virGetInterface(conn, def->name, def->mac)))
-- 
2.4.3

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]