Review Board 1.7.16


Fix queue weight behavior so that calls in low-weighted queues are not blocked when they should not be.

Review Request #202 - Created March 18, 2009 and submitted

Mark Michelson
/branches/1.4
13220
Reviewers
asterisk-dev
Asterisk
Asterisk has some odd behavior when queue weights are used. The current logic used when potentially calling a queue member is:

If the member we are going to call is part of another queue and _that other queue has any callers in it_ and has a higher weight than the queue we are calling from, then don't try to contact that member. The issue here is what I have marked with underscores. If the higher-weighted queue has any callers in it at all, then the queue member will be unreachable from the lower-weighted queue. This has the potential to be really really bad if using a queue strategy, such as leastrecent or fewestcalls, with the potential to call the same member repeatedly.

The fix proposed by garychen on issue 13220 is very simple and, as far as I can see, works well for this situation. With this set of changes, the logic used becomes:

If the member we are going to call is part of another queue, the other queue has a higher weight than the queue we are calling from, and the higher weight queue has at least as many callers as available members, then do not try to contact the queue member. If the higher weighted queue has fewer callers than available members, then there is no reason to deny the call to this member since the other queue can afford to spare a member.

Since the fix involved writing a generic function for determining the number of available members in the queue, I also modified the is_our_turn function to make use of the new num_available_members function to determine if it is our turn to try calling a member. There is one small behavior change. Before writing this patch, if you had autofill disabled, then if you were the head caller in a queue, you would automatically be told that it was your turn to try calling a member. This did not take into account whether there were actually any queue members available to take the call. Now we actually make sure there is at least one member available to take the call if autofill is disabled.

I first of all tested to make sure that simple calls to a queue would properly report the number of available members still. That passed just fine.

I also tested to be sure that the weight behavior has been modified as desired, and it worked well, too.
Ship it!
Posted (March 30, 2009, 4:24 a.m.)
Looks good to me, nice work!

https://reviewboard.asterisk.org/ runs on a server provided by Digium, Inc. and uses bandwidth donated to the open source Asterisk community by API Digital Communications in Huntsville, AL USA.
Please report problems with this site to asteriskteam@digium.com.