summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/app_queue.c12
-rw-r--r--configs/queues.conf.sample2
2 files changed, 10 insertions, 4 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 18e9942b5..6557edd50 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -680,7 +680,8 @@ enum {
QUEUE_STRATEGY_RANDOM,
QUEUE_STRATEGY_RRMEMORY,
QUEUE_STRATEGY_LINEAR,
- QUEUE_STRATEGY_WRANDOM
+ QUEUE_STRATEGY_WRANDOM,
+ QUEUE_STRATEGY_RRORDERED,
};
enum {
@@ -708,6 +709,7 @@ static const struct strategy {
{ QUEUE_STRATEGY_RRMEMORY, "roundrobin" },
{ QUEUE_STRATEGY_LINEAR, "linear" },
{ QUEUE_STRATEGY_WRANDOM, "wrandom"},
+ { QUEUE_STRATEGY_RRORDERED, "rrordered"},
};
static const struct autopause {
@@ -1538,7 +1540,7 @@ static void init_queue(struct call_queue *q)
q->autopause = QUEUE_AUTOPAUSE_OFF;
q->timeoutpriority = TIMEOUT_PRIORITY_APP;
if (!q->members) {
- if (q->strategy == QUEUE_STRATEGY_LINEAR)
+ if (q->strategy == QUEUE_STRATEGY_LINEAR || q->strategy == QUEUE_STRATEGY_RRORDERED)
/* linear strategy depends on order, so we have to place all members in a single bucket */
q->members = ao2_container_alloc(1, member_hash_fn, member_cmp_fn);
else
@@ -3909,6 +3911,7 @@ static int calc_metric(struct call_queue *q, struct member *mem, int pos, struct
}
tmp->metric += mem->penalty * 1000000 * usepenalty;
break;
+ case QUEUE_STRATEGY_RRORDERED:
case QUEUE_STRATEGY_RRMEMORY:
if (pos < q->rrpos) {
tmp->metric = 1000 + pos;
@@ -4231,7 +4234,7 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
ast_set_flag(&(bridge_config.features_caller), AST_FEATURE_PARKCALL);
break;
case 'n':
- if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY || qe->parent->strategy == QUEUE_STRATEGY_LINEAR)
+ if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY || qe->parent->strategy == QUEUE_STRATEGY_LINEAR || qe->parent->strategy == QUEUE_STRATEGY_RRORDERED)
(*tries)++;
else
*tries = qe->parent->membercount;
@@ -4418,8 +4421,9 @@ static int try_calling(struct queue_ent *qe, const char *options, char *announce
}
ast_channel_unlock(qe->chan);
ao2_lock(qe->parent);
- if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY) {
+ if (qe->parent->strategy == QUEUE_STRATEGY_RRMEMORY || qe->parent->strategy == QUEUE_STRATEGY_RRORDERED) {
store_next_rr(qe, outgoing);
+
}
if (qe->parent->strategy == QUEUE_STRATEGY_LINEAR) {
store_next_lin(qe, outgoing);
diff --git a/configs/queues.conf.sample b/configs/queues.conf.sample
index b251323a0..0177b8a69 100644
--- a/configs/queues.conf.sample
+++ b/configs/queues.conf.sample
@@ -87,6 +87,8 @@ monitor-type = MixMonitor
; fewestcalls - ring the one with fewest completed calls from this queue
; random - ring random interface
; rrmemory - round robin with memory, remember where we left off last ring pass
+; rrordered - same as rrmemory, except the queue member order from config file
+ is preserved
; linear - rings interfaces in the order specified in this configuration file.
; If you use dynamic members, the members will be rung in the order in
; which they were added