]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fix for table hostcache corking and shutdown race conditions
authorMaria Matejka <mq@ucw.cz>
Wed, 14 Sep 2022 08:25:09 +0000 (10:25 +0200)
committerMaria Matejka <mq@ucw.cz>
Sun, 18 Sep 2022 14:35:49 +0000 (16:35 +0200)
nest/rt-table.c

index 35da182c48b8e0af462207bc45da5dde53def945..4b9d83c558c568f4e3f4490be5df2af408ab83ec 100644 (file)
@@ -4008,7 +4008,11 @@ rt_commit(struct config *new, struct config *old)
          rt_lock_table(tab);
 
          if (tab->hostcache)
+         {
            rt_stop_export(&tab->hostcache->req, NULL);
+           if (ev_get_list(&tab->hostcache->update) == &rt_cork.queue)
+             ev_postpone(&tab->hostcache->update);
+         }
 
          rt_unlock_table(tab);
 
@@ -4392,7 +4396,9 @@ hc_notify_export_one(struct rt_export_request *req, const net_addr *net, struct
   /* Yes, something has actually changed. Do the hostcache update. */
   if (o != RTE_VALID_OR_NULL(new_best))
     RT_LOCKED((rtable *) hc->update.data, tab)
-      ev_send_loop(tab->loop, &hc->update);
+      if ((atomic_load_explicit(&req->hook->export_state, memory_order_acquire) == TES_READY)
+         && !ev_active(&hc->update))
+       ev_send_loop(tab->loop, &hc->update);
 }
 
 
@@ -4555,6 +4561,10 @@ rt_update_hostcache(void *data)
 
   struct hostcache *hc = tab->hostcache;
 
+  /* Shutdown shortcut */
+  if (!hc->req.hook)
+    RT_RETURN(tab);
+
   if (rt_cork_check(&hc->update))
   {
     rt_trace(tab, D_STATES, "Hostcache update corked");