new queue option, penaltymemberslimit, disregards penalty on too few queue members when enabled


			
			
				certified/1.8.6
			
			
		
David Vossel 16 years ago
parent f72b2a060d
commit e21deabf02

@ -954,6 +954,7 @@ struct call_queue {
int count; /*!< How many entries */ int count; /*!< How many entries */
int maxlen; /*!< Max number of entries */ int maxlen; /*!< Max number of entries */
int wrapuptime; /*!< Wrapup Time */ int wrapuptime; /*!< Wrapup Time */
int penaltymemberslimit; /*!< Disregard penalty when queue has fewer than this many members */
int retry; /*!< Retry calling everyone after this amount of time */ int retry; /*!< Retry calling everyone after this amount of time */
int timeout; /*!< How long to wait for an answer */ int timeout; /*!< How long to wait for an answer */
@ -1447,6 +1448,7 @@ static void init_queue(struct call_queue *q)
q->monfmt[0] = '\0'; q->monfmt[0] = '\0';
q->reportholdtime = 0; q->reportholdtime = 0;
q->wrapuptime = 0; q->wrapuptime = 0;
q->penaltymemberslimit = 0;
q->joinempty = 0; q->joinempty = 0;
q->leavewhenempty = 0; q->leavewhenempty = 0;
q->memberdelay = 0; q->memberdelay = 0;
@ -1752,6 +1754,8 @@ static void queue_set_param(struct call_queue *q, const char *param, const char
q->retry = DEFAULT_RETRY; q->retry = DEFAULT_RETRY;
} else if (!strcasecmp(param, "wrapuptime")) { } else if (!strcasecmp(param, "wrapuptime")) {
q->wrapuptime = atoi(val); q->wrapuptime = atoi(val);
} else if (!strcasecmp(param, "penaltymemberslimit")) {
q->penaltymemberslimit = atoi(val);
} else if (!strcasecmp(param, "autofill")) { } else if (!strcasecmp(param, "autofill")) {
q->autofill = ast_true(val); q->autofill = ast_true(val);
} else if (!strcasecmp(param, "monitor-type")) { } else if (!strcasecmp(param, "monitor-type")) {
@ -3691,13 +3695,23 @@ static int update_queue(struct call_queue *q, struct member *member, int callcom
*/ */
static int calc_metric(struct call_queue *q, struct member *mem, int pos, struct queue_ent *qe, struct callattempt *tmp) static int calc_metric(struct call_queue *q, struct member *mem, int pos, struct queue_ent *qe, struct callattempt *tmp)
{ {
if ((qe->max_penalty && (mem->penalty > qe->max_penalty)) || (qe->min_penalty && (mem->penalty < qe->min_penalty))) /* disregarding penalty on too few members? */
return -1; unsigned char usepenalty = (q->membercount <= q->penaltymemberslimit) ? 0 : 1;
if (usepenalty) {
if ((qe->max_penalty && (mem->penalty > qe->max_penalty)) ||
(qe->min_penalty && (mem->penalty < qe->min_penalty))) {
return -1;
}
} else {
ast_debug(1, "Disregarding penalty, %d members and %d in penaltymemberslimit.\n",
q->membercount, q->penaltymemberslimit);
}
switch (q->strategy) { switch (q->strategy) {
case QUEUE_STRATEGY_RINGALL: case QUEUE_STRATEGY_RINGALL:
/* Everyone equal, except for penalty */ /* Everyone equal, except for penalty */
tmp->metric = mem->penalty * 1000000; tmp->metric = mem->penalty * 1000000 * usepenalty;
break; break;
case QUEUE_STRATEGY_LINEAR: case QUEUE_STRATEGY_LINEAR:
if (pos < qe->linpos) { if (pos < qe->linpos) {
@ -3708,7 +3722,7 @@ static int calc_metric(struct call_queue *q, struct member *mem, int pos, struct
qe->linwrapped = 1; qe->linwrapped = 1;
tmp->metric = pos; tmp->metric = pos;
} }
tmp->metric += mem->penalty * 1000000; tmp->metric += mem->penalty * 1000000 * usepenalty;
break; break;
case QUEUE_STRATEGY_RRMEMORY: case QUEUE_STRATEGY_RRMEMORY:
if (pos < q->rrpos) { if (pos < q->rrpos) {
@ -3719,25 +3733,25 @@ static int calc_metric(struct call_queue *q, struct member *mem, int pos, struct
q->wrapped = 1; q->wrapped = 1;
tmp->metric = pos; tmp->metric = pos;
} }
tmp->metric += mem->penalty * 1000000; tmp->metric += mem->penalty * 1000000 * usepenalty;
break; break;
case QUEUE_STRATEGY_RANDOM: case QUEUE_STRATEGY_RANDOM:
tmp->metric = ast_random() % 1000; tmp->metric = ast_random() % 1000;
tmp->metric += mem->penalty * 1000000; tmp->metric += mem->penalty * 1000000 * usepenalty;
break; break;
case QUEUE_STRATEGY_WRANDOM: case QUEUE_STRATEGY_WRANDOM:
tmp->metric = ast_random() % ((1 + mem->penalty) * 1000); tmp->metric = ast_random() % ((1 + mem->penalty) * 1000);
break; break;
case QUEUE_STRATEGY_FEWESTCALLS: case QUEUE_STRATEGY_FEWESTCALLS:
tmp->metric = mem->calls; tmp->metric = mem->calls;
tmp->metric += mem->penalty * 1000000; tmp->metric += mem->penalty * 1000000 * usepenalty;
break; break;
case QUEUE_STRATEGY_LEASTRECENT: case QUEUE_STRATEGY_LEASTRECENT:
if (!mem->lastcall) if (!mem->lastcall)
tmp->metric = 0; tmp->metric = 0;
else else
tmp->metric = 1000000 - (time(NULL) - mem->lastcall); tmp->metric = 1000000 - (time(NULL) - mem->lastcall);
tmp->metric += mem->penalty * 1000000; tmp->metric += mem->penalty * 1000000 * usepenalty;
break; break;
default: default:
ast_log(LOG_WARNING, "Can't calculate metric for unknown strategy %d\n", q->strategy); ast_log(LOG_WARNING, "Can't calculate metric for unknown strategy %d\n", q->strategy);

@ -112,6 +112,12 @@ shared_lastcall=no
; ;
;context = qoutcon ;context = qoutcon
; ;
; A limit can be set to disregard penalty settings when the queue has
; too few members. No penalty will be weighed in if there are only X
; or fewer queue members. (default 0)
;
;penaltymemberslimit = 5
;
;----------------------QUEUE TIMING OPTIONS------------------------------------ ;----------------------QUEUE TIMING OPTIONS------------------------------------
; A Queue has two different "timeout" values associated with it. One is the ; A Queue has two different "timeout" values associated with it. One is the
; timeout parameter configured in queues.conf. This timeout specifies the ; timeout parameter configured in queues.conf. This timeout specifies the

Loading…
Cancel
Save