odissey: add scheme obsolete logic

This commit is contained in:
Dmitry Simonenko 2017-07-17 17:05:46 +03:00
parent 438296ae28
commit a9969ca1ca
6 changed files with 27 additions and 27 deletions

View File

@ -134,7 +134,7 @@ od_periodic_expire(od_periodic_t *periodic)
od_backend_close(server); od_backend_close(server);
/* cleanup unused dynamic route */ /* cleanup unused dynamic route */
od_routepool_gc_route(&router->route_pool, route); od_routepool_gc(&router->route_pool, route);
} }
} }

View File

@ -50,32 +50,23 @@ void od_routepool_free(od_routepool_t *pool)
} }
} }
void od_routepool_gc(od_routepool_t *pool) void od_routepool_gc(od_routepool_t *pool, od_route_t *route)
{ {
od_list_t *i, *n; if (od_serverpool_total(&route->server_pool) > 0 ||
od_list_foreach_safe(&pool->list, i, n) { od_clientpool_total(&route->client_pool) > 0)
od_route_t *route; return;
route = od_container_of(i, od_route_t, link);
od_routepool_gc_route(pool, route);
}
}
static inline void od_schemedb_t *scheme = route->scheme->db;
od_routepool_unlink(od_routepool_t *pool, od_route_t *route)
{ /* free route data */
assert(pool->count > 0); assert(pool->count > 0);
pool->count--; pool->count--;
od_list_unlink(&route->link); od_list_unlink(&route->link);
od_route_free(route); od_route_free(route);
}
void od_routepool_gc_route(od_routepool_t *pool, od_route_t *route) /* maybe free obsolete scheme db */
{ if (scheme->is_obsolete)
if (od_serverpool_total(&route->server_pool) == 0 && od_schemedb_free(scheme);
od_clientpool_total(&route->client_pool) == 0)
{
od_routepool_unlink(pool, route);
}
} }
od_route_t* od_route_t*

View File

@ -17,9 +17,7 @@ struct od_routepool
void od_routepool_init(od_routepool_t*); void od_routepool_init(od_routepool_t*);
void od_routepool_free(od_routepool_t*); void od_routepool_free(od_routepool_t*);
void od_routepool_gc(od_routepool_t*, od_route_t*);
void od_routepool_gc(od_routepool_t*);
void od_routepool_gc_route(od_routepool_t*, od_route_t*);
od_route_t* od_route_t*
od_routepool_new(od_routepool_t*, od_schemeuser_t*, od_routepool_new(od_routepool_t*, od_schemeuser_t*,

View File

@ -310,7 +310,7 @@ od_router(void *arg)
router->clients--; router->clients--;
/* maybe remove empty route */ /* maybe remove empty route */
od_routepool_gc_route(&router->route_pool, route); od_routepool_gc(&router->route_pool, route);
msg_unroute->status = OD_ROK; msg_unroute->status = OD_ROK;
machine_queue_put(msg_unroute->response, msg); machine_queue_put(msg_unroute->response, msg);

View File

@ -10,6 +10,7 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <inttypes.h> #include <inttypes.h>
#include <assert.h>
#include <machinarium.h> #include <machinarium.h>
@ -55,6 +56,9 @@ void od_scheme_init(od_scheme_t *scheme)
od_list_init(&scheme->storages); od_list_init(&scheme->storages);
} }
static void
od_schemestorage_free(od_schemestorage_t*);
void od_scheme_free(od_scheme_t *scheme) void od_scheme_free(od_scheme_t *scheme)
{ {
od_list_t *i, *n; od_list_t *i, *n;
@ -128,7 +132,8 @@ od_schemestorage_match(od_scheme_t *scheme, char *name, int version)
return match; return match;
} }
void od_schemestorage_free(od_schemestorage_t *storage) static void
od_schemestorage_free(od_schemestorage_t *storage)
{ {
if (storage->name) if (storage->name)
free(storage->name); free(storage->name);
@ -191,6 +196,12 @@ od_schemedb_match(od_scheme_t *scheme, char *name, int version)
return match; return match;
} }
void od_schemedb_mark_obsolete(od_schemedb_t *db)
{
assert(! db->is_obsolete);
db->is_obsolete = 1;
}
static void static void
od_schemeuser_free(od_schemeuser_t*); od_schemeuser_free(od_schemeuser_t*);

View File

@ -66,6 +66,7 @@ struct od_schemedb
od_list_t users; od_list_t users;
od_schemeuser_t *user_default; od_schemeuser_t *user_default;
int is_default; int is_default;
int is_obsolete;
int version; int version;
od_list_t link; od_list_t link;
}; };
@ -150,14 +151,13 @@ void od_scheme_print(od_scheme_t*, od_log_t*);
od_schemestorage_t* od_schemestorage_t*
od_schemestorage_add(od_scheme_t*, int); od_schemestorage_add(od_scheme_t*, int);
void od_schemestorage_free(od_schemestorage_t*);
od_schemestorage_t* od_schemestorage_t*
od_schemestorage_match(od_scheme_t*, char*, int); od_schemestorage_match(od_scheme_t*, char*, int);
od_schemedb_t* od_schemedb_t*
od_schemedb_add(od_scheme_t*, int); od_schemedb_add(od_scheme_t*, int);
void od_schemedb_mark_obsolete(od_schemedb_t*);
void od_schemedb_free(od_schemedb_t*); void od_schemedb_free(od_schemedb_t*);
od_schemedb_t* od_schemedb_t*