]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 303007 via svnmerge from
authorJeff Peeler <jpeeler@digium.com>
Thu, 20 Jan 2011 17:07:44 +0000 (17:07 +0000)
committerJeff Peeler <jpeeler@digium.com>
Thu, 20 Jan 2011 17:07:44 +0000 (17:07 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.4

........
  r303007 | jpeeler | 2011-01-20 11:04:08 -0600 (Thu, 20 Jan 2011) | 8 lines

  Add new queue strategy to preserve behavior for when queue members moved to ao2.

  Add queue strategy called "rrordered" to mimic old behavior from when queue
  members were stored in a linked list.

  ABE-2707
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.6.2@303008 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_queue.c
configs/queues.conf.sample

index 987d8da244bf95dc4d6eed8bb076b81b0de17391..813e8f9e0fe64b69f07c3d1bbe82fa24194dac36 100644 (file)
@@ -497,7 +497,8 @@ enum {
        QUEUE_STRATEGY_RANDOM,
        QUEUE_STRATEGY_RRMEMORY,
        QUEUE_STRATEGY_LINEAR,
-       QUEUE_STRATEGY_WRANDOM
+       QUEUE_STRATEGY_WRANDOM,
+       QUEUE_STRATEGY_RRORDERED,
 };
 
 enum queue_reload_mask {
@@ -519,6 +520,7 @@ static const struct strategy {
        { QUEUE_STRATEGY_RRMEMORY, "roundrobin" },
        { QUEUE_STRATEGY_LINEAR, "linear" },
        { QUEUE_STRATEGY_WRANDOM, "wrandom"},
+       { QUEUE_STRATEGY_RRORDERED, "rrordered"},
 };
 
 static struct ast_taskprocessor *devicestate_tps;
@@ -1216,7 +1218,7 @@ static void init_queue(struct call_queue *q)
        q->numperiodicannounce = 0;
        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
@@ -3352,6 +3354,7 @@ static int calc_metric(struct call_queue *q, struct member *mem, int pos, struct
                }
                tmp->metric += mem->penalty * 1000000;
                break;
+       case QUEUE_STRATEGY_RRORDERED:
        case QUEUE_STRATEGY_RRMEMORY:
                if (pos < q->rrpos) {
                        tmp->metric = 1000 + pos;
@@ -3675,7 +3678,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;
@@ -3852,8 +3855,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);
index 6e9d9576a40436b1112e5ce1cd91a1d06bc27cec..618baf0e97171dad9bb8243e5299549eb4107918 100644 (file)
@@ -88,6 +88,8 @@ shared_lastcall=no
 ; 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