add optional exceptions to mod_distributor to list nodes to skip
This commit is contained in:
parent
a7d8f866fd
commit
23fd8ebb3e
|
@ -27,7 +27,7 @@
|
||||||
* Neal Horman <neal at wanlink dot com>
|
* Neal Horman <neal at wanlink dot com>
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* mod_distributor.c -- Framework Demo Module
|
* mod_distributor.c -- Load distributor
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#include <switch.h>
|
#include <switch.h>
|
||||||
|
@ -240,14 +240,15 @@ static int reset_list(struct dist_list *list)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct dist_node *find_next(struct dist_list *list)
|
static struct dist_node *find_next(struct dist_list *list, int etotal, char **exceptions)
|
||||||
{
|
{
|
||||||
struct dist_node *np, *match = NULL;
|
struct dist_node *np, *match = NULL;
|
||||||
int x = 0, mx = 0;
|
int x = 0, mx = 0;
|
||||||
int matches = 0, loops = 0;
|
int matches = 0, loops = 0;
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
|
top:
|
||||||
|
|
||||||
if (++loops > 1000) {
|
if (++loops > 1000) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -259,7 +260,7 @@ static struct dist_node *find_next(struct dist_list *list)
|
||||||
match = NULL;
|
match = NULL;
|
||||||
for (np = list->nodes; np; np = np->next) {
|
for (np = list->nodes; np; np = np->next) {
|
||||||
if (np->cur_weight < list->target_weight) {
|
if (np->cur_weight < list->target_weight) {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "%s %d/%d\n", np->name, np->cur_weight, list->target_weight);
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "%s %d/%d\n", np->name, np->cur_weight, list->target_weight);
|
||||||
matches++;
|
matches++;
|
||||||
if (!match && x > list->last) {
|
if (!match && x > list->last) {
|
||||||
match = np;
|
match = np;
|
||||||
|
@ -270,10 +271,23 @@ static struct dist_node *find_next(struct dist_list *list)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (match) {
|
if (match) {
|
||||||
|
int i;
|
||||||
|
|
||||||
match->cur_weight++;
|
match->cur_weight++;
|
||||||
list->lastnode = match;
|
list->lastnode = match;
|
||||||
list->last = mx;
|
list->last = mx;
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Choose %s\n", match->name);
|
|
||||||
|
for(i = 0; i < etotal; i++) {
|
||||||
|
if (!strcmp(match->name, exceptions[i])) {
|
||||||
|
if (matches == 1) {
|
||||||
|
reset_list(list);
|
||||||
|
}
|
||||||
|
goto top;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG10, "Choose %s\n", match->name);
|
||||||
return match;
|
return match;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,7 +298,7 @@ static struct dist_node *find_next(struct dist_list *list)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,11 +308,21 @@ static char *dist_engine(const char *name)
|
||||||
struct dist_node *np = NULL;
|
struct dist_node *np = NULL;
|
||||||
struct dist_list *lp;
|
struct dist_list *lp;
|
||||||
char *str = NULL;
|
char *str = NULL;
|
||||||
|
char *myname = strdup(name);
|
||||||
|
char *except;
|
||||||
|
int argc = 0;
|
||||||
|
char *argv[100] = { 0 };
|
||||||
|
|
||||||
|
|
||||||
|
if ((except = strchr(myname, ' '))) {
|
||||||
|
*except++ = '\0';
|
||||||
|
argc = switch_split(except, ' ', argv);
|
||||||
|
}
|
||||||
|
|
||||||
switch_mutex_lock(globals.mod_lock);
|
switch_mutex_lock(globals.mod_lock);
|
||||||
for (lp = globals.list; lp; lp = lp->next) {
|
for (lp = globals.list; lp; lp = lp->next) {
|
||||||
if (!strcasecmp(name, lp->name)) {
|
if (!strcasecmp(myname, lp->name)) {
|
||||||
np = find_next(lp);
|
np = find_next(lp, argc, argv);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -308,6 +332,8 @@ static char *dist_engine(const char *name)
|
||||||
}
|
}
|
||||||
switch_mutex_unlock(globals.mod_lock);
|
switch_mutex_unlock(globals.mod_lock);
|
||||||
|
|
||||||
|
free(myname);
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -374,9 +400,9 @@ SWITCH_MODULE_LOAD_FUNCTION(mod_distributor_load)
|
||||||
load_config(SWITCH_FALSE);
|
load_config(SWITCH_FALSE);
|
||||||
|
|
||||||
|
|
||||||
SWITCH_ADD_API(api_interface, "distributor", "Distributor API", distributor_function, "<list name>");
|
SWITCH_ADD_API(api_interface, "distributor", "Distributor API", distributor_function, "<list name>[ <exception1> <exceptionN>]");
|
||||||
SWITCH_ADD_API(api_interface, "distributor_ctl", "Distributor API", distributor_ctl_function, "[reload]");
|
SWITCH_ADD_API(api_interface, "distributor_ctl", "Distributor API", distributor_ctl_function, "[reload]");
|
||||||
SWITCH_ADD_APP(app_interface, "distributor", "Distributor APP", "Distributor APP", distributor_exec, "<list name>",
|
SWITCH_ADD_APP(app_interface, "distributor", "Distributor APP", "Distributor APP", distributor_exec, "<list name>[ <exception1> <exceptionN>]",
|
||||||
SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC);
|
SAF_SUPPORT_NOMEDIA | SAF_ROUTING_EXEC);
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue