odissey: cleanup unused routes on expire

This commit is contained in:
Dmitry Simonenko 2017-05-31 16:48:44 +03:00
parent aca2cb9003
commit 0d04fc7c87
4 changed files with 38 additions and 16 deletions

View File

@ -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 */

View File

@ -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;
}

View File

@ -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*);

View File

@ -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 */