mirror of https://github.com/yandex/odyssey.git
Allow logging in module init cb (#344)
fix memory corruption in config reload, also fix logging & route disabling Co-authored-by: reshke <Kirill Reshke>
This commit is contained in:
parent
d2bf7f2977
commit
5d129fa783
|
@ -52,7 +52,7 @@ od_retcode_t od_logger_init(od_logger_t *logger, od_pid_t *pid)
|
||||||
|
|
||||||
static inline void od_logger(void *arg);
|
static inline void od_logger(void *arg);
|
||||||
|
|
||||||
#define OD_LOGGER_TASK_CHANNEL_LIMIT 1 << 5
|
#define OD_LOGGER_TASK_CHANNEL_LIMIT 1 << 8
|
||||||
|
|
||||||
od_retcode_t od_logger_load(od_logger_t *logger)
|
od_retcode_t od_logger_load(od_logger_t *logger)
|
||||||
{
|
{
|
||||||
|
|
|
@ -46,6 +46,9 @@ int od_target_module_add(od_logger_t *logger, od_module_t *modules,
|
||||||
|
|
||||||
handle = od_dlopen(target_module_path);
|
handle = od_dlopen(target_module_path);
|
||||||
if (!handle) {
|
if (!handle) {
|
||||||
|
od_log(logger, "load_module", NULL, NULL,
|
||||||
|
"errors while openning %s module: %s",
|
||||||
|
target_module_path, dlerror());
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
module_ptr = od_load_module(handle);
|
module_ptr = od_load_module(handle);
|
||||||
|
@ -63,7 +66,7 @@ int od_target_module_add(od_logger_t *logger, od_module_t *modules,
|
||||||
strcat(module_ptr->path, target_module_path);
|
strcat(module_ptr->path, target_module_path);
|
||||||
|
|
||||||
if (module_ptr->module_init_cb) {
|
if (module_ptr->module_init_cb) {
|
||||||
return module_ptr->module_init_cb();
|
return module_ptr->module_init_cb(logger);
|
||||||
}
|
}
|
||||||
|
|
||||||
return OD_MODULE_CB_OK_RETCODE;
|
return OD_MODULE_CB_OK_RETCODE;
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
#define OD_MODULE_CB_FAIL_RETCODE -1
|
#define OD_MODULE_CB_FAIL_RETCODE -1
|
||||||
|
|
||||||
/* init */
|
/* init */
|
||||||
typedef int (*module_init_cb_t)();
|
typedef int (*module_init_cb_t)(od_logger_t *logger);
|
||||||
|
|
||||||
/* auth */
|
/* auth */
|
||||||
typedef int (*client_auth_attempt_cb_t)(od_client_t *c);
|
typedef int (*client_auth_attempt_cb_t)(od_client_t *c);
|
||||||
|
|
|
@ -83,6 +83,7 @@ static inline int od_router_reload_cb(od_route_t *route, void **argv)
|
||||||
|
|
||||||
int od_router_reconfigure(od_router_t *router, od_rules_t *rules)
|
int od_router_reconfigure(od_router_t *router, od_rules_t *rules)
|
||||||
{
|
{
|
||||||
|
od_instance_t *instance = router->global->instance;
|
||||||
od_router_lock(router);
|
od_router_lock(router);
|
||||||
|
|
||||||
int updates;
|
int updates;
|
||||||
|
@ -95,9 +96,27 @@ int od_router_reconfigure(od_router_t *router, od_rules_t *rules)
|
||||||
|
|
||||||
if (updates > 0) {
|
if (updates > 0) {
|
||||||
od_extention_t *extentions = router->global->extentions;
|
od_extention_t *extentions = router->global->extentions;
|
||||||
od_module_t *modules = extentions->modules;
|
|
||||||
/* reloadcallback */
|
|
||||||
od_list_t *i;
|
od_list_t *i;
|
||||||
|
od_module_t *modules = extentions->modules;
|
||||||
|
|
||||||
|
od_list_foreach(&added, i)
|
||||||
|
{
|
||||||
|
od_rule_key_t *rk;
|
||||||
|
rk = od_container_of(i, od_rule_key_t, link);
|
||||||
|
od_log(&instance->logger, "reload config", NULL, NULL,
|
||||||
|
"added rule: %s %s", rk->usr_name, rk->db_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
od_list_foreach(&deleted, i)
|
||||||
|
{
|
||||||
|
od_rule_key_t *rk;
|
||||||
|
rk = od_container_of(i, od_rule_key_t, link);
|
||||||
|
od_log(&instance->logger, "reload config", NULL, NULL,
|
||||||
|
"deleted rule: %s %s", rk->usr_name,
|
||||||
|
rk->db_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reloadcallback */
|
||||||
od_list_foreach(&modules->link, i)
|
od_list_foreach(&modules->link, i)
|
||||||
{
|
{
|
||||||
od_module_t *module;
|
od_module_t *module;
|
||||||
|
@ -111,11 +130,18 @@ int od_router_reconfigure(od_router_t *router, od_rules_t *rules)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
od_list_foreach(&added, i)
|
||||||
|
{
|
||||||
|
od_rule_key_t *rk;
|
||||||
|
rk = od_container_of(i, od_rule_key_t, link);
|
||||||
|
od_rule_key_free(rk);
|
||||||
|
}
|
||||||
|
|
||||||
od_list_foreach(&deleted, i)
|
od_list_foreach(&deleted, i)
|
||||||
{
|
{
|
||||||
od_rule_t *rule;
|
od_rule_key_t *rk;
|
||||||
rule = od_container_of(i, od_rule_t, link);
|
rk = od_container_of(i, od_rule_key_t, link);
|
||||||
od_rules_rule_free(rule);
|
od_rule_key_free(rk);
|
||||||
}
|
}
|
||||||
|
|
||||||
od_route_pool_foreach(&router->route_pool, od_router_reload_cb,
|
od_route_pool_foreach(&router->route_pool, od_router_reload_cb,
|
||||||
|
|
|
@ -596,8 +596,80 @@ __attribute__((hot)) int od_rules_merge(od_rules_t *rules, od_rules_t *src,
|
||||||
count_mark++;
|
count_mark++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* select new rules */
|
/* select dropped rules */
|
||||||
od_list_t *n;
|
od_list_t *n;
|
||||||
|
od_list_foreach_safe(&rules->rules, i, n)
|
||||||
|
{
|
||||||
|
od_rule_t *rule_old;
|
||||||
|
rule_old = od_container_of(i, od_rule_t, link);
|
||||||
|
|
||||||
|
int ok = 0;
|
||||||
|
|
||||||
|
od_list_t *m;
|
||||||
|
od_list_t *j;
|
||||||
|
od_list_foreach_safe(&src->rules, j, m)
|
||||||
|
{
|
||||||
|
od_rule_t *rule_new;
|
||||||
|
rule_new = od_container_of(j, od_rule_t, link);
|
||||||
|
if (strcmp(rule_old->user_name, rule_new->user_name) ==
|
||||||
|
0 &&
|
||||||
|
strcmp(rule_old->db_name, rule_new->db_name) == 0) {
|
||||||
|
ok = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
od_rule_key_t *rk = malloc(sizeof(od_rule_key_t));
|
||||||
|
|
||||||
|
od_rule_key_init(rk);
|
||||||
|
|
||||||
|
rk->usr_name = strndup(rule_old->user_name,
|
||||||
|
rule_old->user_name_len);
|
||||||
|
rk->db_name = strndup(rule_old->db_name,
|
||||||
|
rule_old->db_name_len);
|
||||||
|
|
||||||
|
od_list_append(deleted, &rk->link);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* select added rules */
|
||||||
|
od_list_foreach_safe(&src->rules, i, n)
|
||||||
|
{
|
||||||
|
od_rule_t *rule_new;
|
||||||
|
rule_new = od_container_of(i, od_rule_t, link);
|
||||||
|
|
||||||
|
int ok = 0;
|
||||||
|
|
||||||
|
od_list_t *m;
|
||||||
|
od_list_t *j;
|
||||||
|
od_list_foreach_safe(&rules->rules, j, m)
|
||||||
|
{
|
||||||
|
od_rule_t *rule_old;
|
||||||
|
rule_old = od_container_of(j, od_rule_t, link);
|
||||||
|
if (strcmp(rule_old->user_name, rule_new->user_name) ==
|
||||||
|
0 &&
|
||||||
|
strcmp(rule_old->db_name, rule_new->db_name) == 0) {
|
||||||
|
ok = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
od_rule_key_t *rk = malloc(sizeof(od_rule_key_t));
|
||||||
|
|
||||||
|
od_rule_key_init(rk);
|
||||||
|
|
||||||
|
rk->usr_name = strndup(rule_new->user_name,
|
||||||
|
rule_new->user_name_len);
|
||||||
|
rk->db_name = strndup(rule_new->db_name,
|
||||||
|
rule_new->db_name_len);
|
||||||
|
|
||||||
|
od_list_append(added, &rk->link);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/* select new rules */
|
||||||
od_list_foreach_safe(&src->rules, i, n)
|
od_list_foreach_safe(&src->rules, i, n)
|
||||||
{
|
{
|
||||||
od_rule_t *rule;
|
od_rule_t *rule;
|
||||||
|
@ -643,9 +715,7 @@ __attribute__((hot)) int od_rules_merge(od_rules_t *rules, od_rules_t *src,
|
||||||
rule->obsolete = is_obsolete;
|
rule->obsolete = is_obsolete;
|
||||||
|
|
||||||
if (is_obsolete && rule->refs == 0) {
|
if (is_obsolete && rule->refs == 0) {
|
||||||
od_list_unlink(&rule->link);
|
od_rules_rule_free(rule);
|
||||||
od_list_init(&rule->link);
|
|
||||||
od_list_append(deleted, &rule->link);
|
|
||||||
count_deleted++;
|
count_deleted++;
|
||||||
count_mark--;
|
count_mark--;
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,6 +62,27 @@ struct od_rule_auth {
|
||||||
od_list_t link;
|
od_list_t link;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct od_rule_key od_rule_key_t;
|
||||||
|
|
||||||
|
struct od_rule_key {
|
||||||
|
char *usr_name;
|
||||||
|
char *db_name;
|
||||||
|
|
||||||
|
od_list_t link;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void od_rule_key_init(od_rule_key_t *rk)
|
||||||
|
{
|
||||||
|
od_list_init(&rk->link);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void od_rule_key_free(od_rule_key_t *rk)
|
||||||
|
{
|
||||||
|
od_list_unlink(&rk->link);
|
||||||
|
|
||||||
|
free(rk);
|
||||||
|
}
|
||||||
|
|
||||||
struct od_rule {
|
struct od_rule {
|
||||||
/* versioning */
|
/* versioning */
|
||||||
int mark;
|
int mark;
|
||||||
|
@ -175,9 +196,11 @@ od_rule_storage_t *od_rules_storage_copy(od_rule_storage_t *);
|
||||||
|
|
||||||
void od_rules_storage_free(od_rule_storage_t *);
|
void od_rules_storage_free(od_rule_storage_t *);
|
||||||
|
|
||||||
|
#ifdef LDAP_FOUND
|
||||||
/* ldap endpoint */
|
/* ldap endpoint */
|
||||||
od_ldap_endpoint_t *od_rules_ldap_endpoint_add(od_rules_t *rules,
|
od_ldap_endpoint_t *od_rules_ldap_endpoint_add(od_rules_t *rules,
|
||||||
od_ldap_endpoint_t *ldap);
|
od_ldap_endpoint_t *ldap);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* auth */
|
/* auth */
|
||||||
od_rule_auth_t *od_rules_auth_add(od_rule_t *);
|
od_rule_auth_t *od_rules_auth_add(od_rule_t *);
|
||||||
|
|
Loading…
Reference in New Issue