[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