[asterisk-users] Help with semaphores - SOLVED
Mitch Thompson
mitchthompson at satx.rr.com
Mon Feb 12 11:17:31 MST 2007
Mitch Thompson wrote:
> I'm looking for some help from any Asterisk "heavy" who might be doing
> something similar to what I'm trying to do...
>
> Background:
>
> I work for a research lab, testing telephony products and tools.
> Historically, we used Ameritec Crescendos and Fortissimos to act as
> load generators and call "sinks" when testing equipment. However, the
> equipment we are testing gets more and more complex, and the scripted
> scenarios the Ameritecs give have become a limiting factor for
> testing. Therefore, Asterisk was chosen as a possible solution (we're
> a cheap lab).
>
> I've been learning Asterisk as I go, but I've learned a lot. Here's
> the basic scenario:
>
> We are using an Asterisk (AAH 2.8, specifically) to sink calls. I do
> this by taking the ${EXTEN} and breaking it down by sections until I
> get to the last 4 digits (i.e., 2105551212). Once I get to the
> 4-digit extension, I am trying to set a flag, or semaphore, to do
> Busy/Idle testing. Here is my extensions_custom.conf fragment:
>
>
> [SATX_555_Extensions]
>
> exten => 1212,1,System(cat /tmp/{orig_num}) ; ${orig_num} is set at
> the beginning of [from-trunk-custom] to the full dialed digits in
> ${EXTEN}, before I break it down.
> exten => 1212,n,Busy(); if the file exists, someone else has already
> called this number, return busy
>
> exten => 1212,102,System(echo ${UNIQUEID} > /tmp/${orig_num}) ;
> basically, create a file in /tmp whose name is the full number from
> the beginning. In this case, the full
>
> ; filename would be /tmp/2105551212. I don't really care about the
> contents, though.
> exten => 1212,103, Goto(Idle,1) ; from here, we jump to a new
> extension called Idle, where we do a Random to decide whether to
> simulate no one home (ring no answer) or
> ; we send ring for
> about 10 seconds, then Answer() and play some .wav files, then
> hangup. The last thing we do in either case is to delete
> ; the
> /tmp/${orig_num} file.
>
> The above code works very well at low call volumes. However, I'm
> running into race conditions at high call volumes where several calls
> are getting through the test in priority 1 before the file is created
> in priority 102 (n+101).
>
> I've tried to implement semaphores by using both local and global
> variables, but it doesn't seem to work.
>
> My ultimate question: Is anyone doing something similar, and what did
> you do to implement the busy/idle.
>
> I appreciate any help anyone can offer.
>
> Mitch Thompson
I wanted to follow-up with the solution I came up with, thanks to
excellent feedback from this group, and Trevor Peirce in particular.
Our fix action was a blending of my solution (above) and Trevor's
suggestion to stop using System() calls and use the DB directive. We
ended up with something like this:
exten => 1212,1,GotoIf(${DB_EXISTS(busy/${orig_num})}?busy:idle)
exten => 1212,n(busy),Busy()
exten => 1212,n(idle),Set(DB(busy/${orig_num})=${CALLERID(num)})
exten => 1212,n,Macro(disposition,$(orig_num}) ; Call a macro, pass
along the original CdPN, and do something.
In the disposition macro, we have this:
[macro-disposition]
exten => s,1,Set(orig_num=${arg1})
exten => s,n,Random(25:s-rna,1)
exten => s,n,Ringing()
exten => s,n,Wait(6)
exten => s,n,Answer()
exten => s,n,Wait(1)
exten => s,n,Playback(lots-o-monkeys)
exten => s,n,Hangup()
exten => s-rna,1,Ringing()
exten => s-rna,n,Wait()
exten => s-rna,n,Hangup
exten => h,1,DBDel(busy/${orig_num})
The above gives us a very simplistic "coin-toss" as to whether to answer
the phone or not.
With the above dialplan, we have successfully dialed one number with
eight (8) T-1 PRIs worth of calls simultaneously and only have 1 answer
(the remaining 183 calls were shown as Busy on the Fortissimo). This
was repeatable over a 2 hour period. I'm sure we will have calls slip
through, but for now we are satisfied.
Trevor, thanks again. I learned about the DB application that day.
More information about the asterisk-users
mailing list