From 0d04fc7c871369aee537ee1bb120c91c8a3004bf Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Wed, 31 May 2017 16:48:44 +0300 Subject: [PATCH] odissey: cleanup unused routes on expire --- src/od_periodic.c | 4 ++++ src/od_route_pool.c | 41 +++++++++++++++++++++++++++-------------- src/od_route_pool.h | 3 +-- src/od_server_pool.h | 6 ++++++ 4 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/od_periodic.c b/src/od_periodic.c index 9fc54cd4..89bc68ec 100644 --- a/src/od_periodic.c +++ b/src/od_periodic.c @@ -155,8 +155,12 @@ void od_periodic(void *arg) od_serverpool_set(&route->server_pool, server, OD_SUNDEF); machine_io_attach(server->io); + od_backend_terminate(server); od_backend_close(server); + + /* cleanup unused dynamic routes */ + od_routepool_gc(&router->route_pool); } /* stats */ diff --git a/src/od_route_pool.c b/src/od_route_pool.c index dab70a43..d170c3be 100644 --- a/src/od_route_pool.c +++ b/src/od_route_pool.c @@ -40,14 +40,35 @@ void od_routepool_init(od_routepool_t *pool) void od_routepool_free(od_routepool_t *pool) { - od_route_t *route; od_list_t *i, *n; od_list_foreach_safe(&pool->list, i, n) { + od_route_t *route; route = od_container_of(i, od_route_t, link); od_route_free(route); } } +static inline void +od_routepool_unlink(od_routepool_t *pool, od_route_t *route) +{ + assert(pool->count > 0); + pool->count--; + od_list_unlink(&route->link); + od_route_free(route); +} + +void od_routepool_gc(od_routepool_t *pool) +{ + od_list_t *i, *n; + od_list_foreach_safe(&pool->list, i, n) { + od_route_t *route; + route = od_container_of(i, od_route_t, link); + if (od_serverpool_total(&route->server_pool) == 0 && + od_clientpool_total(&route->client_pool) == 0) + od_routepool_unlink(pool, route); + } +} + od_route_t* od_routepool_new(od_routepool_t *pool, od_schemeroute_t *scheme, od_routeid_t *id) @@ -67,14 +88,6 @@ od_routepool_new(od_routepool_t *pool, od_schemeroute_t *scheme, return route; } -void od_routepool_unlink(od_routepool_t *pool, od_route_t *route) -{ - assert(pool->count > 0); - pool->count--; - od_list_unlink(&route->link); - od_route_free(route); -} - od_route_t* od_routepool_match(od_routepool_t *pool, od_routeid_t *key) { @@ -95,8 +108,8 @@ od_routepool_next(od_routepool_t *pool, od_serverstate_t state) od_list_t *i, *n; od_list_foreach_safe(&pool->list, i, n) { route = od_container_of(i, od_route_t, link); - od_server_t *server = - od_serverpool_next(&route->server_pool, state); + od_server_t *server; + server = od_serverpool_next(&route->server_pool, state); if (server) return server; } @@ -112,9 +125,9 @@ od_routepool_foreach(od_routepool_t *pool, od_serverstate_t state, od_list_t *i, *n; od_list_foreach_safe(&pool->list, i, n) { route = od_container_of(i, od_route_t, link); - od_server_t *server = - od_serverpool_foreach(&route->server_pool, state, - callback, arg); + od_server_t *server; + server = od_serverpool_foreach(&route->server_pool, state, + callback, arg); if (server) return server; } diff --git a/src/od_route_pool.h b/src/od_route_pool.h index 8e15496e..771e326e 100644 --- a/src/od_route_pool.h +++ b/src/od_route_pool.h @@ -17,13 +17,12 @@ struct od_routepool void od_routepool_init(od_routepool_t*); void od_routepool_free(od_routepool_t*); +void od_routepool_gc(od_routepool_t*); od_route_t* od_routepool_new(od_routepool_t*, od_schemeroute_t*, od_routeid_t*); -void od_routepool_unlink(od_routepool_t*, od_route_t*); - od_route_t* od_routepool_match(od_routepool_t*, od_routeid_t*); diff --git a/src/od_server_pool.h b/src/od_server_pool.h index 85729a18..3c13f600 100644 --- a/src/od_server_pool.h +++ b/src/od_server_pool.h @@ -34,4 +34,10 @@ od_server_t* od_serverpool_foreach(od_serverpool_t*, od_serverstate_t, od_serverpool_cb_t, void*); +static inline int +od_serverpool_total(od_serverpool_t *pool) { + return pool->count_active + pool->count_idle + + pool->count_expire; +} + #endif /* OD_SERVER_POOL_H */