network/nexthop: forget dependent routes without trying to remove
authorYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 11 Nov 2024 03:26:48 +0000 (12:26 +0900)
committerLuca Boccassi <bluca@debian.org>
Mon, 11 Nov 2024 13:59:41 +0000 (13:59 +0000)
When a nexthop is removed, routes depend on the removed nexthop are
already removed. It is not necessary to remove them, as already
commented. Let's forget them without trying to remove.

src/network/networkd-nexthop.c
src/network/networkd-route.c
src/network/networkd-route.h

index 76f2371bd8e6f6fea55c0944738fa85c0dd8f339..94df608222fa7e303df7387634f2823af5548907 100644 (file)
@@ -485,21 +485,23 @@ static void log_nexthop_debug(const NextHop *nexthop, const char *str, Manager *
                        yes_no(nexthop->blackhole), strna(group), strna(flags));
 }
 
-static int nexthop_remove_dependents(NextHop *nexthop, Manager *manager) {
-        int r = 0;
-
+static void nexthop_forget_dependents(NextHop *nexthop, Manager *manager) {
         assert(nexthop);
         assert(manager);
 
         /* If a nexthop is removed, the kernel silently removes routes that depend on the removed nexthop.
-         * Let's remove them for safety (though, they are already removed in the kernel, hence that should
-         * fail), and forget them. */
+         * Let's forget them. */
 
         Route *route;
-        SET_FOREACH(route, nexthop->routes)
-                RET_GATHER(r, route_remove(route, manager));
-
-        return r;
+        SET_FOREACH(route, nexthop->routes) {
+                Request *req;
+                if (route_get_request(manager, route, &req) >= 0)
+                        route_enter_removed(req->userdata);
+
+                route_enter_removed(route);
+                log_route_debug(route, "Forgetting silently removed", manager);
+                route_detach(route);
+        }
 }
 
 static int nexthop_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, RemoveRequest *rreq) {
@@ -517,7 +519,7 @@ static int nexthop_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, Remov
                                        (r == -ENOENT || !nexthop->manager) ? LOG_DEBUG : LOG_WARNING,
                                        r, "Could not drop nexthop, ignoring");
 
-                (void) nexthop_remove_dependents(nexthop, manager);
+                nexthop_forget_dependents(nexthop, manager);
 
                 if (nexthop->manager) {
                         /* If the nexthop cannot be removed, then assume the nexthop is already removed. */
@@ -1022,7 +1024,7 @@ int manager_rtnl_process_nexthop(sd_netlink *rtnl, sd_netlink_message *message,
                 if (nexthop) {
                         nexthop_enter_removed(nexthop);
                         log_nexthop_debug(nexthop, "Forgetting removed", m);
-                        (void) nexthop_remove_dependents(nexthop, m);
+                        nexthop_forget_dependents(nexthop, m);
                         nexthop_detach(nexthop);
                 } else
                         log_nexthop_debug(&(const NextHop) { .id = id }, "Kernel removed unknown", m);
index 8317a5894c1b42e5303819011842eb24e98cb6e5..3f775fc13ce432c4d3e2be973ffe50d3811602d4 100644 (file)
@@ -47,7 +47,7 @@ static Route* route_detach_impl(Route *route) {
         return NULL;
 }
 
-static void route_detach(Route *route) {
+void route_detach(Route *route) {
         route_unref(route_detach_impl(route));
 }
 
index b0da5d80c7343326dee38a7fedbd73a4ed0466b8..bfe52ca3373d1aabb2ae142c106fc86dcb1ed1ba 100644 (file)
@@ -89,6 +89,8 @@ Route* route_ref(Route *route);
 Route* route_unref(Route *route);
 DEFINE_SECTION_CLEANUP_FUNCTIONS(Route, route_unref);
 
+void route_detach(Route *route);
+
 int route_new(Route **ret);
 int route_new_static(Network *network, const char *filename, unsigned section_line, Route **ret);
 int route_dup(const Route *src, const RouteNextHop *nh, Route **ret);