Skip to content

Commit

Permalink
qrouting: Code refactoring
Browse files Browse the repository at this point in the history
    * add helpful comments
    * improve field naming
    * fix misplaced LM_DBG, could segfault
  • Loading branch information
liviuchircu committed Feb 6, 2020
1 parent fdf9303 commit 46a8e50
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 73 deletions.
43 changes: 25 additions & 18 deletions modules/qrouting/qr_acc.c
Expand Up @@ -352,34 +352,41 @@ static inline void add_stats(qr_stats_t *x, qr_stats_t *y, char op) {
/* testing purpose only */
void show_stats(qr_gw_t *gw) {
LM_INFO("*****************************\n");
LM_INFO("ans seizure: %lf / %lf\n", gw->history_stats.stats.as,
gw->history_stats.n.ok);
LM_INFO("completed calls: %lf / %lf\n", gw->history_stats.stats.cc,
gw->history_stats.n.ok);
LM_INFO("post dial delay: %lf / %lf\n", gw->history_stats.stats.pdd,
gw->history_stats.n.pdd);
LM_INFO("setup time: %lf / %lf\n", gw->history_stats.stats.st,
gw->history_stats.n.setup);
LM_INFO("call duration: %lf / %lf\n", gw->history_stats.stats.cd,
gw->history_stats.n.cd);
LM_INFO("ans seizure: %lf / %lf\n", gw->summed_stats.stats.as,
gw->summed_stats.n.ok);
LM_INFO("completed calls: %lf / %lf\n", gw->summed_stats.stats.cc,
gw->summed_stats.n.ok);
LM_INFO("post dial delay: %lf / %lf\n", gw->summed_stats.stats.pdd,
gw->summed_stats.n.pdd);
LM_INFO("setup time: %lf / %lf\n", gw->summed_stats.stats.st,
gw->summed_stats.n.setup);
LM_INFO("call duration: %lf / %lf\n", gw->summed_stats.stats.cd,
gw->summed_stats.n.cd);
LM_INFO("*****************************\n");
}

/* update the statistics for a gateway */
void update_gw_stats(qr_gw_t *gw) {
qr_stats_t current, last;
void update_gw_stats(qr_gw_t *gw)
{
qr_stats_t diff;

lock_get(gw->acc_lock);
current = gw->current_interval;
last = gw->next_interval->calls;
add_stats(&current, &last, '-');

/* prepare a diff of current/last stat samples */
diff = gw->current_interval;
add_stats(&diff, &gw->lru_interval->calls, '-');

/* apply the diff to the summed stats */
lock_start_write(gw->ref_lock);
add_stats(&gw->history_stats, &current, '+');
add_stats(&gw->summed_stats, &diff, '+');
gw->state |= QR_STATUS_DIRTY;
lock_stop_write(gw->ref_lock);
gw->next_interval->calls = gw->current_interval;

/* rotate the sampling window */
gw->lru_interval->calls = gw->current_interval;
// show_stats(gw);
memset(&gw->current_interval, 0, sizeof(qr_stats_t));
gw->next_interval = gw->next_interval->next; /* the 'oldest' sample interval
gw->lru_interval = gw->lru_interval->next; /* the 'oldest' sample interval
becomes the 'newest' */
lock_release(gw->acc_lock);
}
Expand Down
20 changes: 10 additions & 10 deletions modules/qrouting/qr_sort.h
Expand Up @@ -43,11 +43,11 @@ int qr_add_dst_to_list(qr_sorted_list_t **sorted_list, int dst_id, int score);
static inline double asr(qr_gw_t *gw) {
double asr;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.ok == 0) {
if(gw->summed_stats.n.ok == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
asr = (double)gw->history_stats.stats.as/gw->history_stats.n.ok;
asr = (double)gw->summed_stats.stats.as/gw->summed_stats.n.ok;
lock_stop_read(gw->ref_lock);
return asr;
}
Expand All @@ -56,11 +56,11 @@ static inline double asr(qr_gw_t *gw) {
static inline double ccr(qr_gw_t *gw) {
double ccr;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.ok == 0) {
if(gw->summed_stats.n.ok == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
ccr = (double)gw->history_stats.stats.cc/gw->history_stats.n.ok;
ccr = (double)gw->summed_stats.stats.cc/gw->summed_stats.n.ok;
lock_stop_read(gw->ref_lock);
return ccr;
}
Expand All @@ -69,11 +69,11 @@ static inline double ccr(qr_gw_t *gw) {
static inline double pdd(qr_gw_t *gw) {
double pdd;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.pdd == 0) {
if(gw->summed_stats.n.pdd == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
pdd = (double)gw->history_stats.stats.pdd/gw->history_stats.n.pdd;
pdd = (double)gw->summed_stats.stats.pdd/gw->summed_stats.n.pdd;
lock_stop_read(gw->ref_lock);
return pdd;
}
Expand All @@ -82,11 +82,11 @@ static inline double pdd(qr_gw_t *gw) {
static inline double ast(qr_gw_t *gw) {
double ast;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.setup == 0) {
if(gw->summed_stats.n.setup == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
ast = (double)gw->history_stats.stats.st/gw->history_stats.n.setup;
ast = (double)gw->summed_stats.stats.st/gw->summed_stats.n.setup;
lock_stop_read(gw->ref_lock);
return ast;
}
Expand All @@ -95,11 +95,11 @@ static inline double ast(qr_gw_t *gw) {
static inline double acd(qr_gw_t *gw) {
double acd;
lock_start_read(gw->ref_lock);
if(gw->history_stats.n.cd == 0) {
if(gw->summed_stats.n.cd == 0) {
lock_stop_read(gw->ref_lock);
return -1;
}
acd = (double)gw->history_stats.stats.cd/gw->history_stats.n.cd;
acd = (double)gw->summed_stats.stats.cd/gw->summed_stats.n.cd;
lock_stop_read(gw->ref_lock);
return acd;
}
Expand Down
91 changes: 48 additions & 43 deletions modules/qrouting/qr_stats.c
Expand Up @@ -40,7 +40,8 @@ qr_rule_t **qr_rules_start;


/* create the samples for a gateway's history */
qr_sample_t * create_history(void) {
qr_sample_t *create_history(void)
{
qr_sample_t *history, *tmp;
int i;

Expand Down Expand Up @@ -87,7 +88,7 @@ qr_gw_t *qr_create_gw(void *dst)
goto error;
}

if (!(gw->next_interval = create_history())) {
if (!(gw->lru_interval = create_history())) {
LM_ERR("failed to create history\n");
goto error;
}
Expand Down Expand Up @@ -116,7 +117,8 @@ void qr_dst_is_gw(void *param)
rule = drp->rule;
dst = drp->cr_or_gw;
n_dst = drp->n_dst;
LM_DBG("Adding gw to rule %d\n", rule->r_id);

LM_DBG("adding gw to rule %d\n", rule->r_id);

if(rule != NULL) {
rule->dest[n_dst].type = QR_DST_GW;
Expand All @@ -129,7 +131,7 @@ void qr_dst_is_gw(void *param)
/* free gateway information */
void qr_free_gw(qr_gw_t * gw)
{
shm_free_all(gw->next_interval);
shm_free_all(gw->lru_interval);

if (gw->acc_lock) {
lock_destroy(gw->acc_lock);
Expand Down Expand Up @@ -272,50 +274,50 @@ void qr_dst_is_grp(void *param)
{
struct dr_reg_param *drp = (struct dr_reg_param *)param;
qr_rule_t *rule = drp->rule;
void * dr_gw;
str *cr_name, *gw_name;
int i;
int n_dst = drp->n_dst;
int n_gws ;
void *grp = drp->cr_or_gw;
n_gws = drb.get_cr_n_gw(grp);
cr_name = drb.get_cr_name(grp);
LM_DBG("Carrier '%.*s' with %d gateways added to rule %d\n", cr_name->len,
cr_name->s, n_gws, rule->r_id);
int i, n_dst = drp->n_dst;
void *dr_gw, *grp = drp->cr_or_gw;
int n_gws = drb.get_cr_n_gw(grp);
str *gw_name, *cr_name = drb.get_cr_name(grp);

if (!rule) {
LM_ERR("null rule\n");
return;
}

if(rule != NULL) {
rule->dest[n_dst].type = QR_DST_GRP;
memset(&rule->dest[n_dst].dst.grp, 0, sizeof(qr_grp_t));
rule->dest[n_dst].dst.grp.state |= QR_STATUS_DIRTY;
rule->dest[n_dst].dst.grp.gw = (qr_gw_t**)shm_malloc(n_gws *
sizeof(qr_gw_t*));
if(rule->dest[n_dst].dst.grp.gw == NULL) {
LM_ERR("no more shm memory\n");
goto error;
}
if ((rule->dest[n_dst].dst.grp.ref_lock = lock_init_rw()) == NULL) {
LM_ERR("failed to init RW lock\n");
goto error;
}
LM_DBG("carrier '%.*s' with %d gateways added to rule %d\n",
cr_name->len, cr_name->s, n_gws, rule->r_id);

rule->dest[n_dst].dst.grp.n = n_gws;
rule->dest[n_dst].dst.grp.dr_cr = grp;
for(i = 0; i < n_gws; i++) {
dr_gw = (void*)drb.get_gw_from_cr(grp, i); /* get the gateway
as pgw_t from dr */
rule->dest[n_dst].dst.grp.gw[i] = qr_create_gw(dr_gw);
gw_name = drb.get_gw_name(rule->dest[n_dst].dst.grp.gw[i]->dr_gw);
LM_DBG("Gw '%.*s' added to carrier '%.*s' from rule %d\n",
gw_name->len, gw_name->s, cr_name->len, cr_name->s,
rule->r_id);
}
} else {
LM_ERR("bad rule\n");
rule->dest[n_dst].type = QR_DST_GRP;
memset(&rule->dest[n_dst].dst.grp, 0, sizeof (qr_grp_t));
rule->dest[n_dst].dst.grp.state |= QR_STATUS_DIRTY;

rule->dest[n_dst].dst.grp.gw = shm_malloc(n_gws * sizeof (qr_gw_t *));
if (!rule->dest[n_dst].dst.grp.gw) {
LM_ERR("oom\n");
goto error;
}

if ((rule->dest[n_dst].dst.grp.ref_lock = lock_init_rw()) == NULL) {
LM_ERR("failed to init RW lock\n");
goto error;
}

rule->dest[n_dst].dst.grp.n = n_gws;
rule->dest[n_dst].dst.grp.dr_cr = grp;

for (i = 0; i < n_gws; i++) {
dr_gw = (void*)drb.get_gw_from_cr(grp, i); /* get the gateway
as pgw_t from dr */
rule->dest[n_dst].dst.grp.gw[i] = qr_create_gw(dr_gw);
gw_name = drb.get_gw_name(rule->dest[n_dst].dst.grp.gw[i]->dr_gw);
LM_DBG("gw '%.*s' added to carrier '%.*s' from rule %d\n",
gw_name->len, gw_name->s, cr_name->len, cr_name->s,
rule->r_id);
}
return ;

return;
error:
if(rule->dest[n_dst].dst.grp.gw != NULL)
if (rule->dest[n_dst].dst.grp.gw)
shm_free(rule->dest[n_dst].dst.grp.gw);
}

Expand Down Expand Up @@ -356,7 +358,9 @@ void qr_create_partition_list(void *param)
memset(pl->part_name, 0, np * sizeof (str));
memset(pl->qr_rules_start, 0, np * sizeof (qr_rule_t *));

LM_DBG("created new partition list (%d items)\n", np);
return;

error:
if (pl->rw_lock)
lock_destroy_rw(pl->rw_lock);
Expand All @@ -366,6 +370,7 @@ void qr_create_partition_list(void *param)

if (pl)
shm_free(pl);
*ppl = NULL;
}

/* add rule to list. if the list is NULL a new list is created */
Expand Down
7 changes: 5 additions & 2 deletions modules/qrouting/qr_stats.h
Expand Up @@ -81,10 +81,13 @@ typedef struct qr_thresholds {

/* history for gateway: sum of sampled intervals */
typedef struct qr_gw {
qr_sample_t * next_interval; /* sampled intervals */
/* circular list of sampled stats (constant size),
* always points to the least recently updated sample */
qr_sample_t *lru_interval;

void *dr_gw; /* pointer to the gateway from drouting*/
qr_stats_t current_interval; /* the current interval */
qr_stats_t history_stats; /* the statistcs for all the intervals */
qr_stats_t summed_stats; /* the sum of the @lru_interval list */
char state; /* the state of the gateway: dirty/disabled */
int score; /* the score of the gateway (based on thresholds) */
rw_lock_t *ref_lock; /* lock for protecting the overall statistics (history) */
Expand Down

0 comments on commit 46a8e50

Please sign in to comment.