0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2025-01-03 15:41:54 +00:00

Fix for table hostcache corking and shutdown race conditions

This commit is contained in:
Maria Matejka 2022-09-14 10:25:09 +02:00
parent 12fd6c989a
commit cf38092b2d

View File

@ -4008,7 +4008,11 @@ rt_commit(struct config *new, struct config *old)
rt_lock_table(tab); rt_lock_table(tab);
if (tab->hostcache) if (tab->hostcache)
{
rt_stop_export(&tab->hostcache->req, NULL); 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); 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. */ /* Yes, something has actually changed. Do the hostcache update. */
if (o != RTE_VALID_OR_NULL(new_best)) if (o != RTE_VALID_OR_NULL(new_best))
RT_LOCKED((rtable *) hc->update.data, tab) 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; struct hostcache *hc = tab->hostcache;
/* Shutdown shortcut */
if (!hc->req.hook)
RT_RETURN(tab);
if (rt_cork_check(&hc->update)) if (rt_cork_check(&hc->update))
{ {
rt_trace(tab, D_STATES, "Hostcache update corked"); rt_trace(tab, D_STATES, "Hostcache update corked");