On Mar 25, 2010 at 13:44, I??aki Baz Castillo <ibc(a)aliax.net> wrote:
Hi, this is a common issue reported by other users.
Imagine I do
failover between two gateways based on request timeout:
------------------------------
failure_route[FAILURE_ROUTE_OUT] {
# Locally generated 408 due to transaction timeout:
if (t_local_replied("last") && $T_reply_code==408) {
xlog("L_ERROR", "_ERROR_ $T_reply_code local replied =>
failover\n");
... do failover ...
}
}
------------------------------
The above code runs when the gateway-1 doesn't reply at all so
"fr_timer" expires (let's say 5 seconds).
The problem is that such code also runs when no final response at all
is received from gateway-1 in "fr_inv_timer" (let's say 150 seconds).
This is, 408 is locallly generated even if the proxy has received
provisional responses for such transaction.
Try t_any_replied()
(
http://sip-router.org/docbook/sip-router/branch/master/modules/tm/tm.html#t…)
E.g.:
if (t_check_status("408"){
if (!t_any_replied()) {
t_reply(503, "Try again later, busy gws");
exit;
}
}
Main problem this originates is the fact that the list of gateways
could end without any of them giving a final reply, and when no more
gateways are available it's common to reply 500/503 to the client.
Two workarounds:
a) When no more gateways are available inspect if $T_reply_code==408
and then reply 408 rather than 500/503.
I don't like it as if no one gateways has replied a provisional
response in "fr_timer" then I have a *real* problem and I should reply
500/503.
b) Enable a flag(PROVISIONAL_RECEIVED) when a provisional response is
received and then reply 408/480 when no more gateways are available.
Anyhow, there should be (IMHO) a in-built way to determine if the 408
occurs after "fr_timer" or "fr_inv_timer". Do I miss something? do
you
consider this a real need?
I don't consider this a real need, however it already can be done easily :-)
Andrei