[asterisk-bugs] [JIRA] (ASTERISK-26755) app_queue: Random queues disappear on "core reload queue all"

Rusty Newton (JIRA) noreply at issues.asterisk.org
Fri Jan 27 11:41:10 CST 2017


     [ https://issues.asterisk.org/jira/browse/ASTERISK-26755?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Rusty Newton updated ASTERISK-26755:
------------------------------------

    Status: Open  (was: Triage)

> app_queue: Random queues disappear on "core reload queue all"
> -------------------------------------------------------------
>
>                 Key: ASTERISK-26755
>                 URL: https://issues.asterisk.org/jira/browse/ASTERISK-26755
>             Project: Asterisk
>          Issue Type: Bug
>      Security Level: None
>          Components: Applications/app_queue
>    Affects Versions: 13.13.1
>         Environment: $ uname -a
> Linux qa1-asterisk1 3.13.0-100-generic #147-Ubuntu SMP Tue Oct 18 16:48:51 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
>            Reporter: Kirill Katsnelson
>
> We have 500+ queues, the "core reload queue all" command is sent every 2 minutes, and sometimes a queue disappears on reload: it is in the queues.conf, but just not there until the next reload.
> ----
> The issue is very easy to reproduce in a matter of a second. First, create 1000 queues:
> {code}
> #!/bin/bash
> ASTROOT=~/asterisk/myroot
>   (
>     cat << EOF
> [general]
> persistentmembers = no
> autofill = yes
> updatecdr = no
> EOF
>     seq -f "[Q%03.0f]" 0 999
>     cat << EOF
> timeout = 1
> retry = 1
> autopause = no
> ringinuse = no
> setqueuevar = yes
> strategy = random
> announce-frequency = 0
> EOF
>   ) > ${ASTROOT}/etc/asterisk/queues.conf
> {code}
> Then make two torturously tight loops; the first in extensions.ael trying to enter the queue:
> {code}
> context from-sip {
>   796 => {
>     Queue(Q999,,,,0.01);
>     jump ${EXTEN};
>   }
> }
> {code}
> and the second reloading the queue files
> {code}
> #!/bin/bash
> ASTROOT=~/asterisk/myroot
> while :; do
>   # Reload queues
>   touch ${ASTROOT}/etc/asterisk/queues.conf
>   ${ASTROOT}/sbin/asterisk -rx "queue reload parameters"
> done
> {code}
> Call the first, run the second, and there will be a lot of failures reported from Queue() complaining the queue Q999 does not exist.
> -----
> This is a race condition in app_queues.c. When reloading, all queues are first marked dead, and then resurrected as soon as each is loaded from config. At the same time, the dead flag is checked on a queue whenever the Queue() app returns, for lame-ducking out of service on a deleted queue, such that the queue is unlinked when it has no calls, which is our case. Both pieces hold locks... but these are different locks!
> -----
> I am sending a patch against the 13 branch that fixed a problem for us (under the above artificial test conditions). It is in QA now, not yet under a production load. I'll post the progress.



--
This message was sent by Atlassian JIRA
(v6.2#6252)



More information about the asterisk-bugs mailing list