[asterisk-dev] [Code Review] 3404: app_queue removing callers from queue when reloading

Jonathan Rose reviewboard at asterisk.org
Thu Mar 27 17:05:21 CDT 2014


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/3404/#review11410
-----------------------------------------------------------

Ship it!


I've looked at how realtime queues are reloaded and I don't think this is problematic.  RT Queue members behave similarly to dynamic queue members in a lot of ways anyway.

- Jonathan Rose


On March 27, 2014, 2:22 p.m., Italo Rossi wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/3404/
> -----------------------------------------------------------
> 
> (Updated March 27, 2014, 2:22 p.m.)
> 
> 
> Review request for Asterisk Developers.
> 
> 
> Bugs: https://issues.asterisk.org/jira/browse/ASTERISK-23547
>     https://issues.asterisk.org/jira/browse/https://issues.asterisk.org/jira/browse/ASTERISK-23547
> 
> 
> Repository: Asterisk
> 
> 
> Description
> -------
> 
> If you have only realtime members in queue 'sales', for example, and callers are waiting on this queue, when you do 'module reload app_queue.so' all the callers will be removed with EXITEMPTY reason.
> 
> The problem is when we reload app_queue, the function:
> 
> 
>     static int mark_member_dead(void *obj, void *arg, int flags)
>     {
>             struct member *member = obj;
>             if (!member->dynamic) {
>                     member->delme = 1;
>             }
>             return 0;
>     }
> 
> 
> is called and mark the static AND REALTIME members as dead.
> 
> At the same time, the remaining callers on queue are checking if there are available members through the function get_member_status. This functions iterate over all members of the queue and will return 0 if there are available members, or -1 if there's no members available.
> 
> If you have one realtime member with status inuse and the queue is configured with leavewhenempty=penalty,invalid, for example, the callers will join this queue and will keep waiting for an available member.
> Before the reload, the get_member_status will always return 0, because there is one available member with status inuse, but when you reload the app_queue.so, the realtime member will be removed by mark_member_dead (and kill_dead_members) function and the callers waiting on queue will leave with reason EXITEMPTY because get_member_status doesn't iterate over members (there's no members at this time) and returns -1.
> 
> 
> Diffs
> -----
> 
>   /branches/1.8/apps/app_queue.c 411294 
> 
> Diff: https://reviewboard.asterisk.org/r/3404/diff/
> 
> 
> Testing
> -------
> 
> I've tested the main operations:
> 
>  adding/removing dynamic members
>  adding/removing static members
>  adding/removing realtime members
> 
> All worked.
> 
> Tested reloading module with calls waiting on queues, all worked.
> 
> 
> Thanks,
> 
> Italo Rossi
> 
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20140327/452a1f70/attachment.html>


More information about the asterisk-dev mailing list