Module: sip-router Branch: master Commit: ecd5c5846483e9069df875a181b58de7f8035604 URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=ecd5c584...
Author: Daniel-Constantin Mierla miconda@gmail.com Committer: Daniel-Constantin Mierla miconda@gmail.com Date: Sun Dec 14 22:21:14 2014 +0100
dispatcher: take in consideration the value of maxload attribute
---
modules/dispatcher/dispatch.c | 35 +++++++++++++++++++++++++++++------ 1 files changed, 29 insertions(+), 6 deletions(-)
diff --git a/modules/dispatcher/dispatch.c b/modules/dispatcher/dispatch.c index ac3dd3d..e8da58b 100644 --- a/modules/dispatcher/dispatch.c +++ b/modules/dispatcher/dispatch.c @@ -1312,11 +1312,12 @@ int ds_get_leastloaded(ds_set_t *dset) int k; int t;
- k = 0; - t = dset->dlist[k].dload; - for(j=1; j<dset->nr; j++) + k = -1; + t = 0x7fffffff; /* high load */ + for(j=0; j<dset->nr; j++) { - if(!ds_skip_dst(dset->dlist[j].flags & DS_PROBING_DST)) + if(!ds_skip_dst(dset->dlist[j].flags) + && dset->dlist[j].dload<dset->dlist[j].attrs.maxload) { if(dset->dlist[j].dload<t) { @@ -1650,7 +1651,14 @@ int ds_select_dst(struct sip_msg *msg, int set, int alg, int mode) return ds_select_dst_limit(msg, set, alg, 0, mode); }
-int ds_select_dst_limit(struct sip_msg *msg, int set, int alg, unsigned int limit, int mode) +/** + * Set destination address from group 'set' selected with alogorithm 'alg' + * - the rest of addresses in group are added as next destination in avps, + * up to the 'limit' + * - mode specify to set address in R-URI or outboud proxy + * + */ +int ds_select_dst_limit(sip_msg_t *msg, int set, int alg, unsigned int limit, int mode) { int i, cnt; unsigned int hash; @@ -1781,7 +1789,13 @@ int ds_select_dst_limit(struct sip_msg *msg, int set, int alg, unsigned int limi hash = 0; alg = 0; } else { - hash = ds_get_leastloaded(idx); + i = ds_get_leastloaded(idx); + if(i<0) + { + /* no address selected */ + return -1; + } + hash = i; if(ds_load_add(msg, idx, set, hash)<0) { LM_ERR("unable to update destination load" @@ -1803,6 +1817,8 @@ int ds_select_dst_limit(struct sip_msg *msg, int set, int alg, unsigned int limi else hash = hash%idx->nr; i=hash; + + /* if selected address is inactive, find next active */ while (ds_skip_dst(idx->dlist[i].flags)) { if(ds_use_default!=0 && idx->nr!=1) @@ -1892,6 +1908,10 @@ int ds_select_dst_limit(struct sip_msg *msg, int set, int alg, unsigned int limi if(ds_skip_dst(idx->dlist[i].flags) || (ds_use_default!=0 && i==(idx->nr-1))) continue; + /* max load exceeded per destination */ + if(alg==DS_ALG_LOAD + && idx->dlist[i].dload>=idx->dlist[i].attrs.maxload) + continue; LM_DBG("using entry [%d/%d]\n", set, i); avp_val.s = idx->dlist[i].uri; if(add_avp(AVP_VAL_STR|dst_avp_type, dst_avp_name, avp_val)!=0) @@ -1936,6 +1956,9 @@ int ds_select_dst_limit(struct sip_msg *msg, int set, int alg, unsigned int limi if(ds_skip_dst(idx->dlist[i].flags) || (ds_use_default!=0 && i==(idx->nr-1))) continue; + /* max load exceeded per destination */ + if(alg==DS_ALG_LOAD + && idx->dlist[i].dload>=idx->dlist[i].attrs.maxload) LM_DBG("using entry [%d/%d]\n", set, i); avp_val.s = idx->dlist[i].uri; if(add_avp(AVP_VAL_STR|dst_avp_type, dst_avp_name, avp_val)!=0)