Skip to content

Commit

Permalink
dialplan: basic safety for concurent rpc reload
Browse files Browse the repository at this point in the history
- reported by GH #1874

(cherry picked from commit 99d5da8)
(cherry picked from commit 567c5b9)
(cherry picked from commit 6b7a473)
  • Loading branch information
miconda committed Apr 3, 2019
1 parent 847d860 commit e9ecbdc
Showing 1 changed file with 24 additions and 0 deletions.
24 changes: 24 additions & 0 deletions src/modules/dialplan/dialplan.c
Expand Up @@ -80,6 +80,8 @@ dp_param_p default_par2 = NULL;
int dp_fetch_rows = 1000;
int dp_match_dynamic = 0;

static time_t *dp_rpc_reload_time = NULL;

static param_export_t mod_params[]={
{ "db_url", PARAM_STR, &dp_db_url },
{ "table_name", PARAM_STR, &dp_table_name },
Expand Down Expand Up @@ -174,6 +176,13 @@ static int mod_init(void)
return -1;
}

dp_rpc_reload_time = shm_malloc(sizeof(time_t));
if(dp_rpc_reload_time == NULL) {
SHM_MEM_ERROR;
return -1;
}
*dp_rpc_reload_time = 0;

return 0;
}

Expand All @@ -191,6 +200,10 @@ static void mod_destroy(void)
shm_free(default_par2);
default_par2 = NULL;
}
if(dp_rpc_reload_time!=NULL) {
shm_free(dp_rpc_reload_time);
dp_rpc_reload_time = 0;
}
destroy_data();
}

Expand Down Expand Up @@ -475,6 +488,17 @@ static const char* dialplan_rpc_reload_doc[2] = {
*/
static void dialplan_rpc_reload(rpc_t* rpc, void* ctx)
{
if(dp_rpc_reload_time==NULL) {
LM_ERR("not ready for reload\n");
rpc->fault(ctx, 500, "Not ready for reload");
return;
}
if(*dp_rpc_reload_time!=0 && *dp_rpc_reload_time > time(NULL) - 5) {
LM_ERR("ongoing reload\n");
rpc->fault(ctx, 500, "ongoing reload");
return;
}
*dp_rpc_reload_time = time(NULL);
if (dp_connect_db() < 0) {
LM_ERR("failed to reload rules fron database (db connect)\n");
rpc->fault(ctx, 500, "DB Connection Error");
Expand Down

0 comments on commit e9ecbdc

Please sign in to comment.