0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-22 09:41:54 +00:00

Every table has its own netindex now

It's obnoxiously slow to walk over sparse tables.
This commit is contained in:
Maria Matejka 2024-06-10 23:07:36 +02:00
parent d8c0faaec9
commit 4d01ca3e8f

View File

@ -122,7 +122,6 @@ pool *rt_table_pool;
list routing_tables; list routing_tables;
list deleted_routing_tables; list deleted_routing_tables;
netindex_hash *rt_global_netindex_hash[NET_MAX];
#define RT_INITIAL_ROUTES_BLOCK_SIZE 128 #define RT_INITIAL_ROUTES_BLOCK_SIZE 128
struct rt_cork rt_cork; struct rt_cork rt_cork;
@ -3070,7 +3069,7 @@ rt_setup(pool *pp, struct rtable_config *cf)
if (t->id >= rtable_max_id) if (t->id >= rtable_max_id)
rtable_max_id = t->id + 1; rtable_max_id = t->id + 1;
t->netindex = rt_global_netindex_hash[cf->addr_type]; t->netindex = netindex_hash_new(birdloop_pool(t->loop), birdloop_event_list(t->loop), cf->addr_type);
atomic_store_explicit(&t->routes, mb_allocz(p, RT_INITIAL_ROUTES_BLOCK_SIZE * sizeof(net)), memory_order_relaxed); atomic_store_explicit(&t->routes, mb_allocz(p, RT_INITIAL_ROUTES_BLOCK_SIZE * sizeof(net)), memory_order_relaxed);
atomic_store_explicit(&t->routes_block_size, RT_INITIAL_ROUTES_BLOCK_SIZE, memory_order_relaxed); atomic_store_explicit(&t->routes_block_size, RT_INITIAL_ROUTES_BLOCK_SIZE, memory_order_relaxed);
@ -3218,9 +3217,6 @@ rt_init(void)
rt_cork.run = (event) { .hook = rt_cork_release_hook }; rt_cork.run = (event) { .hook = rt_cork_release_hook };
idm_init(&rtable_idm, rt_table_pool, 256); idm_init(&rtable_idm, rt_table_pool, 256);
for (uint i=1; i<NET_MAX; i++)
rt_global_netindex_hash[i] = netindex_hash_new(rt_table_pool, &global_event_list, i);
ea_register_init(&ea_roa_aggregated); ea_register_init(&ea_roa_aggregated);
} }
@ -4323,6 +4319,14 @@ rt_unlock_table_priv(struct rtable_private *r, const char *file, uint line)
ev_send_loop(r->loop, ev_new_init(r->rp, rt_shutdown, r)); ev_send_loop(r->loop, ev_new_init(r->rp, rt_shutdown, r));
} }
static void
rt_shutdown_finished(void *tab_)
{
rtable *t = tab_;
RT_LOCK(t, tab);
birdloop_stop_self(t->loop, rt_delete, t);
}
static void static void
rt_shutdown(void *tab_) rt_shutdown(void *tab_)
{ {
@ -4342,7 +4346,9 @@ rt_shutdown(void *tab_)
rt_exporter_shutdown(&tab->export_best, NULL); rt_exporter_shutdown(&tab->export_best, NULL);
rt_exporter_shutdown(&tab->export_all, NULL); rt_exporter_shutdown(&tab->export_all, NULL);
birdloop_stop_self(t->loop, rt_delete, t); netindex_hash_delete(tab->netindex,
ev_new_init(tab->rp, rt_shutdown_finished, tab),
birdloop_event_list(tab->loop));
} }
static void static void