[Asterisk-Dev] Issue with current PostgresSQL application and also
with 3rd party MySQL application
Andreas Sikkema
andreas.sikkema at ritstele.com
Thu Sep 2 03:36:34 MST 2004
Hi,
We're using the MySQL app quite a lot and have noticed a
problem with it that will also have an impact on the
PostgresSQL application since it shares a lot of the
same kind of code.
Suppose one has the following configuration (which uses
MySQL, but I think the same will happen with Postgres):
exten => s,1,MYSQL(Connect connid ${billing_db_host} ${billing_db_user} ${billing_db_password} ${billing_db_name})
exten => s,2,MYSQL(Query resultid ${connid} SELECT userid\, credit FROM users WHERE username=\'${CALLERIDNUM}\')
exten => s,3,MYSQL(Fetch fetchid ${resultid} userid credit)
<do some magic here with the results from the query
; We're done with the database, so we can disconnect
; No need to keep a db connection open during the call
exten => s,200,MYSQL(Disconnect ${connid});
exten => s,201,Dial(SIP/${DNID}@sip_proxy-out,80,S(${max_duration}));
But, because a hangup can also occur while we're finding
out if the user can dial the extension, there's also need
for the following:
exten => h,1,MYSQL(Disconnect ${connid});
This opens a whole can of worms regarding race conditions
etc. We've experencied numerous crashes of Asterisk with
this scenario, until I only disconnected from the database
when the call was hanging up.
Our theory for the reason why Asterisk is crashing is that
the second disconnect from call A is closing the database
connection of another call, while it is in progress. This
might have some unexpected results.
Leaving a database connection open for the duration of the
call is not optimal, so I really want to have Disconnect()
be safe to call on a connection identifier, even if the
connection was already closed. I've been thinking about
resetting the connection identifier back to -1 when
disconnect is finished, but this is impossible with the
current interface.
I'm thinking of adding a second parameter to Disconnect,
being a variable name (the connection identifier variable
again) which can be set to -1 if the disconnect succeeds.
exten => h,1,MYSQL(Disconnect ${connid} connid);
Disconnect can then check if the incoming value of connid
is a valid identifier or -1 if it tries to disconnect a
connection for the second time.
Does anyone have a better idea?
--
Andreas Sikkema Rits tele.com
Scheepmakersstraat 11 3011 VH Rotterdam
t: +31 (0)10 2245544 f: +31 (0)10 2245540
More information about the asterisk-dev
mailing list