]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Let Queue wrap up time influence member availability
authorMatthew Jordan <mjordan@digium.com>
Tue, 20 Aug 2013 00:06:37 +0000 (00:06 +0000)
committerMatthew Jordan <mjordan@digium.com>
Tue, 20 Aug 2013 00:06:37 +0000 (00:06 +0000)
Queue members who happen to be in multiple queues at the same time may not
have any wrap up time. This problem occurred due to a code change in Asterisk
11.3.0 that unified device state tracking of Queue members in multiple
Queues (which fixed some other problems, but unfortunately caused this one).

This patch fixes the behavior by having the is_member_available function
check the queue's wrap up time and the time of the member's last call, such
that for a particular queue, the member won't be considered available if their
last call is within the wrap up time.

(closes issue ASTERISK-22189)
Reported by: Tony Lewis
Tested by: Tony Lewis

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

apps/app_queue.c

index 7cb069c404dfdbae7d675b59cea1b43ff537711e..e01f9a5d64e4cbde2ca49efcc91e7ea82a85795e 100644 (file)
@@ -1709,7 +1709,7 @@ static int update_status(struct call_queue *q, struct member *m, const int statu
  * \retval 1 if the member is available
  * \retval 0 if the member is not available
  */
-static int is_member_available(struct member *mem)
+static int is_member_available(struct call_queue *q, struct member *mem)
 {
        int available = 0;
 
@@ -1734,6 +1734,10 @@ static int is_member_available(struct member *mem)
                        break;
        }
 
+       /* Let wrapuptimes override device state availability */
+       if (mem->lastcall && q->wrapuptime && (time(NULL) - q->wrapuptime < mem->lastcall)) {
+               available = 0;
+       }
        return available;
 }
 
@@ -1774,7 +1778,7 @@ static int handle_statechange(void *datap)
 
                        /* check every member until we find one NOT_INUSE */
                        if (!avail) {
-                               avail = is_member_available(m);
+                               avail = is_member_available(q, m);
                        }
                        if (avail && found_member) {
                                /* early exit as we've found an available member and the member of interest */
@@ -3384,7 +3388,7 @@ static int num_available_members(struct call_queue *q)
        mem_iter = ao2_iterator_init(q->members, 0);
        while ((mem = ao2_iterator_next(&mem_iter))) {
 
-               avl += is_member_available(mem);
+               avl += is_member_available(q, mem);
                ao2_ref(mem, -1);
 
                /* If autofill is not enabled or if the queue's strategy is ringall, then
@@ -6169,7 +6173,7 @@ static int add_to_queue(const char *queuename, const char *interface, const char
                                new_member->penalty, new_member->calls, (int) new_member->lastcall,
                                new_member->status, new_member->paused);
 
-                       if (is_member_available(new_member)) {
+                       if (is_member_available(q, new_member)) {
                                ast_devstate_changed(AST_DEVICE_NOT_INUSE, AST_DEVSTATE_CACHABLE, "Queue:%s_avail", q->name);
                        }
 
@@ -6235,7 +6239,7 @@ static int set_member_paused(const char *queuename, const char *interface, const
                                        dump_queue_members(q);
                                }
 
-                               if (is_member_available(mem)) {
+                               if (is_member_available(q, mem)) {
                                        ast_devstate_changed(AST_DEVICE_NOT_INUSE, AST_DEVSTATE_CACHABLE, "Queue:%s_avail", q->name);
                                } else if (!num_available_members(q)) {
                                        ast_devstate_changed(AST_DEVICE_INUSE, AST_DEVSTATE_CACHABLE, "Queue:%s_avail", q->name);