[OpenSIPS-Users] dispatcher "fail-over" doesn't seem happy
Bogdan-Andrei Iancu
bogdan at voice-system.ro
Mon Apr 12 14:35:56 CEST 2010
Hi Jock,
My approach was to use a common subroute (try_next) to be used from
both failure route (if you get a failure at SIP level) and from main
route, if relay fails. Of course the t_was_cancelled() needs to be kept
in failure route (as it is specific to that type of route) :
oute[try_next] {
here put the next stuff
}
{
...
t_on_failure("sip_failure");
if (!t_relay()) {
xlog("L_WARN", "[$Tf] t_relay fail\n");
route(try_next);
}
...
}
failure_route[sip_failure]
{
if (t_was_cancelled()) {
......
}
if (t_check_status("....") {
# is a destination failure
route(try_next);
}
}
on the ds_next_xxx () - it is documented to be triggered only from
failure route, but it is a bit too restrictive - you can safely call it
from this shared try_next subroute.
Regards,
Bogdan
Jock McKechnie wrote:
> Greetings Bogdan;
>
> Unfortunately there's a minor hitch in the getalong with this
> suggestion - the failure route utilises two functions that can only be
> called from a failure_route block (t_was_cancelled() and
> ds_next_domain()).
>
> From my understanding of what you're suggesting below, I should move
> my failure logic into its own route block and then call it, both from
> the failure_route block and from the t_relay() failed section. This
> would be a very elegant way to handle it, if I could use it :)
>
> It appears there is no 'back door' method of calling a failure_route()
> block from inside a route block, as in:
> if (!t_relay()) {
> failure_route("2");
> }
>
> Any new thoughts?
>
> Many thanks, both of you.
>
> - JP
>
>
> On Fri, Apr 2, 2010 at 2:58 AM, Bogdan-Andrei Iancu
> <bogdan at voice-system.ro <mailto:bogdan at voice-system.ro>> wrote:
>
> Hi Jock,
>
> I guess the problem is detecting the failure . The failure route
> catches
> only SIP failures (like you sent the requests and you get nothing or
> negative reply); but failure route does not catch sending error
> (like in
> your case).
>
> So, you should do something like:
>
> route[try_next] {
> here put the next stuff
> }
>
>
> {
> ...
> t_on_failure("sip_failure");
> if (!t_relay()) {
> xlog("L_WARN", "[$Tf] t_relay fail\n");
> route(try_next);
> }
> ...
> }
>
>
> failure_route[sip_failure]
> {
> if (t_check_status("....") {
> # is a destination failure
> route(try_next);
> }
> }
>
>
> Regards,
> bogdan
>
>
> Jock McKechnie wrote:
> >
> >
> > On Thu, Apr 1, 2010 at 10:26 AM, Brett Nemeroff
> <brett at nemeroff.com <mailto:brett at nemeroff.com>
> > <mailto:brett at nemeroff.com <mailto:brett at nemeroff.com>>> wrote:
> >
> > Where is your failure route? :)
> > -Brett
> >
> >
> > I intentionally chose to not include it, along with the other 200
> > lines of config, for simplicity, but you're right, given this is a
> > failure, I clearly should've, duh :)
> >
> > failure_route[2] {
> > if (t_was_cancelled()) {
> > xlog( "L_NOTICE", "[$Tf] FR: transaction cancelled -
> > exiting\n" );
> > exit;
> > }
> >
> > # If fr_timer expires t_check_status("408") is true,
> although
> > $rs is <null>
> > if( t_check_status("408") ){
> > xlog( "L_NOTICE", "[$Tf] FR: $ci -- TIMEOUT for
> > Gateway $rd\n" );
> > } else {
> > xlog( "L_NOTICE", "[$Tf] FR: $ci -- $rs reason
> $rr\n" );
> > }
> >
> > # 403 -- typically ISDN network says 'not a valid
> number' etc..
> > if( t_check_status("403") ){
> > xlog("L_WARN", "[$Tf] FR: $ci -- SIP-$rs
> Forbidden ->
> > ISDN Cause Code 1\n" );
> > return;
> > }
> >
> > if( ds_next_domain() ){
> > xlog( "L_NOTICE", "[$Tf] FR: $ci Next gateway $fU ->
> > $tU via $rd \n" );
> >
> > t_on_failure("2");
> >
> > if( !t_relay() ){
> > xlog( "L_WARN", "[$Tf] FR: $ci -- ERROR -
> > Cannot t_relay() -- $fU -> $tU via $rd\n" );
> > return;
> > }
> > return;
> > } else {
> > xlog( "L_WARN", "[$Tf] FR: $ci No more gateways ->
> > 503.\n" );
> > t_reply("503", "Service unavailable -- no more
> > gateways" );
> > return;
> > }
> >
> > }
> >
> > - Jock
> >
> >
> >
> >
> > On Thu, Apr 1, 2010 at 11:20 AM, Jock McKechnie
> > <jock.mckechnie at gmail.com <mailto:jock.mckechnie at gmail.com>
> <mailto:jock.mckechnie at gmail.com
> <mailto:jock.mckechnie at gmail.com>>> wrote:
> > > Greetings all;
> > >
> > > I'm attempting to set up a fail-over only scenario using
> > dispatcher and am
> > > encountering some problems. I'm using dispatcher since
> we're already
> > > utilising it for load balancing, so it makes sense to
> reuse the
> > tool, and
> > > according to the OpenSIPS 1.6 dispatcher module
> documentation it
> > supports
> > > fail-over.
> > >
> > > If the destination server is running, everything works as
> > expected - algo 8
> > > (which OpenSIPS logs as not found and defaulting to the first
> > entry) pushes
> > > the call to the first server at all times. However if I block
> > the route to
> > > the destination server like so:
> > > /sbin/route add -host 192.168.0.99 reject
> > > Then instead of failing over I get a SIP 477 (Send failed)
> error.
> > >
> > > The chunk of routing looks like so:
> > >
> > > xlog("L_WARN", "[$Tf] Found failover, working on set:
> 1101\n");
> > > if (!ds_select_domain("1101", "8")) {
> > > t_reply("503", "Unable to locate failover set requested");
> > > return;
> > > };
> > >
> > > route(1);
> > > };
> > >
> > > route[1] {
> > > t_on_failure("2");
> > >
> > > xlog("L_WARN", "Attempting to relay call to $ru\n");
> > >
> > > if (!t_relay()) {
> > > xlog("L_WARN", "[$Tf] t_relay fail\n");
> > > return;
> > > }
> > > return;
> > > }
> > >
> > >
> > >
> > > The log contains:
> > > [Thu Apr 1 11:14:35 2010] Found failover, working on set:
> 1101
> > > WARNING:dispatcher:ds_select_dst: algo 8 not implemented -
> using
> > first
> > > entry...
> > > Attempting to relay call to
> sip:+12125551212 at 192.168.0.99:5060
> <http://sip:+12125551212@192.168.0.99:5060>
> > <http://sip:+12125551212@192.168.0.99:5060>
> > > ERROR:core:udp_send:
> > sendto(sock,0xb3b9bd28,1039,0,0xb3ba2cf4,16): Network
> > > is unreachable(101)
> > > ERROR:tm:msg_send: udp_send failed
> > > ERROR:tm:t_forward_nonack: sending request failed
> > > [Thu Apr 1 11:14:35 2010] Found failover, working on set:
> 1101
> > > WARNING:dispatcher:ds_select_dst: algo 8 not implemented -
> using
> > first
> > > entry...
> > > Attempting to relay call to
> sip:+12125551212 at 192.168.0.99:5060
> <http://sip:+12125551212@192.168.0.99:5060>
> > <http://sip:+12125551212@192.168.0.99:5060>
> > >
> > > This suggests to me that instead of failing over it's simply
> > retrying the
> > > first entry, which it shouldn't be, and after finding it
> out for
> > a second
> > > time (and thus exhausting the two-entry set), gives up.
> > >
> > > Any thoughts?
> > >
> > > - JP
> > >
> > > _______________________________________________
> > > Users mailing list
> > > Users at lists.opensips.org <mailto:Users at lists.opensips.org>
> <mailto:Users at lists.opensips.org <mailto:Users at lists.opensips.org>>
> > > http://lists.opensips.org/cgi-bin/mailman/listinfo/users
> > >
> > >
> >
> > _______________________________________________
> > Users mailing list
> > Users at lists.opensips.org <mailto:Users at lists.opensips.org>
> <mailto:Users at lists.opensips.org <mailto:Users at lists.opensips.org>>
> > http://lists.opensips.org/cgi-bin/mailman/listinfo/users
> >
> >
> >
> ------------------------------------------------------------------------
> >
> > _______________________________________________
> > Users mailing list
> > Users at lists.opensips.org <mailto:Users at lists.opensips.org>
> > http://lists.opensips.org/cgi-bin/mailman/listinfo/users
> >
>
>
> --
> Bogdan-Andrei Iancu
> www.voice-system.ro <http://www.voice-system.ro>
>
>
> _______________________________________________
> Users mailing list
> Users at lists.opensips.org <mailto:Users at lists.opensips.org>
> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Users mailing list
> Users at lists.opensips.org
> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>
--
Bogdan-Andrei Iancu
www.voice-system.ro
More information about the Users
mailing list