app_queue: Ensure member is removed from pending when hanging up.
authorMartin Tomec <tomec@ipex.cz>
Fri, 9 Dec 2016 18:23:37 +0000 (19:23 +0100)
committerMartin Tomec <tomec.martin@gmail.com>
Mon, 19 Dec 2016 09:45:51 +0000 (03:45 -0600)
In some cases member is added to pending_members, and the channel
is hung up before any extension state change. So the member would
stay in pending_members forever. So when we call do_hang, we
should also remove member from pending.

ASTERISK-26621 #close

Change-Id: Iae476b5c06481db18ebe0fa594b3e80fdc9a7d54

apps/app_queue.c

index 0abd512..9176f93 100644 (file)
@@ -2351,6 +2351,7 @@ static int pending_members_cmp(void *obj, void *arg, int flags)
 
 static void pending_members_remove(struct member *mem)
 {
+       ast_debug(3, "Removed %s from pending_members\n", mem->membername);
        ao2_find(pending_members, mem, OBJ_POINTER | OBJ_NODATA | OBJ_UNLINK);
 }
 
@@ -4207,6 +4208,7 @@ static void do_hang(struct callattempt *o)
 {
        o->stillgoing = 0;
        ast_hangup(o->chan);
+       pending_members_remove(o->member);
        o->chan = NULL;
 }
 
@@ -4287,6 +4289,7 @@ static int can_ring_entry(struct queue_ent *qe, struct callattempt *call)
                 * If not found add it to the container so another queue
                 * won't attempt to call this member at the same time.
                 */
+               ast_debug(3, "Add %s to pending_members\n", call->member->membername);
                ao2_link(pending_members, call->member);
                ao2_unlock(pending_members);
 
@@ -4422,7 +4425,6 @@ static int ring_entry(struct queue_ent *qe, struct callattempt *tmp, int *busies
                /* Again, keep going even if there's an error */
                ast_verb(3, "Couldn't call %s\n", tmp->interface);
                do_hang(tmp);
-               pending_members_remove(tmp->member);
                ++*busies;
                return 0;
        }