]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Tables: Requesting prune only after export cleanup
authorMaria Matejka <mq@ucw.cz>
Tue, 30 Aug 2022 16:05:00 +0000 (18:05 +0200)
committerMaria Matejka <mq@ucw.cz>
Tue, 30 Aug 2022 16:05:06 +0000 (18:05 +0200)
We can't free the network structures before the export has been cleaned
up, therefore it makes more sense to request prune only after export
cleanup. This change also reduces prune calls on table shutdown.

nest/rt-table.c

index 3ade423732d6656ea47aa2d67e61b3bb1d7dd29d..8e1e03fb59146fa7dafcfe112f84e23c5cf1a171 100644 (file)
@@ -1748,10 +1748,6 @@ rte_recalculate(struct rt_import_hook *c, net *net, rte *new, struct rte_src *sr
   rte_announce(table, net, new_stored, old_stored,
       net->routes, old_best_stored);
 
-  if (!net->routes &&
-      (table->gc_counter++ >= table->config->gc_threshold))
-    rt_kick_prune_timer(table);
-
 #if 0
   /* Enable and reimplement these callbacks if anybody wants to use them */
   if (old_ok && p->rte_remove)
@@ -2852,6 +2848,7 @@ rt_export_cleanup(rtable *tab)
   u64 min_seq = ~((u64) 0);
   struct rt_pending_export *last_export_to_free = NULL;
   struct rt_pending_export *first = tab->exporter.first;
+  int want_prune = 0;
 
   struct rt_export_hook *eh;
   node *n;
@@ -2928,6 +2925,8 @@ rt_export_cleanup(rtable *tab)
       /* First is now the next one */
       net->first = atomic_load_explicit(&first->next, memory_order_relaxed);
 
+    want_prune += !net->routes && !net->first;
+
     /* For now, the old route may be finally freed */
     if (first->old)
     {
@@ -3003,6 +3002,9 @@ done:;
        rt_unlock_table(tab);
       }
 
+  if ((tab->gc_counter += want_prune) >= tab->config->gc_threshold)
+    rt_kick_prune_timer(tab);
+
   if (tab->export_used)
     ev_schedule(tab->rt_event);