chiark / gitweb /
networkd: don't warn about missing links unnecessarily
authorTom Gundersen <teg@jklm.no>
Wed, 4 Feb 2015 09:08:12 +0000 (10:08 +0100)
committerTom Gundersen <teg@jklm.no>
Thu, 5 Feb 2015 10:50:34 +0000 (11:50 +0100)
If we get a NEWLINK + NEWADDR between enumerating the links and enumerating the addresses, we
would get a warning that the link corresponding to the address does not exist. This is a false
warning as both the NEWLINK and NEWADDR would be processed after enumerating completed, so drop
it.

src/network/networkd-link.c
src/network/networkd-manager.c
src/network/networkd.h

index 22864bd403b89552650ef1f0f9c04643a8c1ecab..077626cd17d82c8ff1d4a29e66de047b82569192 100644 (file)
@@ -1492,7 +1492,10 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *use
         } else {
                 r = link_get(m, ifindex, &link);
                 if (r < 0 || !link) {
-                        log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex);
+                        /* when enumerating we might be out of sync, but we will
+                         * get the address again, so just ignore it */
+                        if (!m->enumerating)
+                                log_warning("rtnl: received address for nonexistent link (%d), ignoring", ifindex);
                         return 0;
                 }
         }
index 378633061e1d0121df7b4a0d768ebd0222babc49..4d27272b3be3b7e47907b3fc3fcabd860a94881f 100644 (file)
@@ -525,9 +525,13 @@ int manager_rtnl_enumerate_links(Manager *m) {
         for (link = reply; link; link = sd_rtnl_message_next(link)) {
                 int k;
 
+                m->enumerating = true;
+
                 k = manager_rtnl_process_link(m->rtnl, link, m);
                 if (k < 0)
                         r = k;
+
+                m->enumerating = false;
         }
 
         return r;
@@ -556,9 +560,13 @@ int manager_rtnl_enumerate_addresses(Manager *m) {
         for (addr = reply; addr; addr = sd_rtnl_message_next(addr)) {
                 int k;
 
+                m->enumerating = true;
+
                 k = link_rtnl_process_address(m->rtnl, addr, m);
                 if (k < 0)
                         r = k;
+
+                m->enumerating = false;
         }
 
         return r;
index 075aefec7172693eb670f6621b8f9e8ddfd1cffe..e053bd624acb324205e4c2a76f5832f8d275c21c 100644 (file)
@@ -206,6 +206,8 @@ struct Manager {
         struct udev_monitor *udev_monitor;
         sd_event_source *udev_event_source;
 
+        bool enumerating;
+
         char *state_file;
 
         Hashmap *links;