Hi, t_relay() negative return codes is something ugly, more when there is parallel or serial forking. For example:
- Parallel forking to two different locations. - The first destination gets a -4: bad destination (unresolvable address). - The second destination gest a -5 - destination filtered (black listed). - But t_relay() would reply just one of both codes.
Also when mixing UDP and TCP branches t_relay() return codes get more complex to evaluate. For the same kind of error in UDP t_relay() returns true and we get into failure_route, and in TCP t_relay() returns a nevative value and failure_route is not executed. This is difficult to manage, too much exotic cases. Mixing it with parallel forking we get something really terrible.
So I wonder, shouldn't be better if we forgot the t_relay() codes and instead handle the error of the winning branch (even if it failed or it was no branch) in failure_route? This could mean new functions to be executed in failure_route, something like:
- t_no_destination_available: Returns true if the failure route is executed because no branches were added or request was already cancelled. It would generate a local 500 error by default.
- t_branch_bad destination: Returns true if the failure route is executed for a branch whose destination was an uresolvable address. Generates a local 500 error (or perhaps other).
- t_branch_destination_filtered: Returns true if the failure route is executed for a branch whose destination was black listed. Generates a local 500.
- t_branch_tcp_error: Returns true if the failure route is executed for a TCP branch for which the connection was not possible. Generates a local 500.
- t_failed: Returns true if no request could be sent for this transaction (any of the above returns true). Generates a local 500.
...and so on.
Then any code we actually run into "if ! t_relay() { ... }" could be executed in failure_route and we get an easier and solid way to handle errors (instead of mixing t_relay negative values, local generated negative responses in failure_route and so).
Also this would mean that t_relay() terminates the request process, it acts as "exit();". Then we can inspect failure_route to get the result in case it's negative.
Opinions? I strongly think it would be really better than the current behavior.
Iñaki Baz Castillo writes:
So I wonder, shouldn't be better if we forgot the t_relay() codes and instead handle the error of the winning branch (even if it failed or it was no branch) in failure_route?
inaki,
this has been discussed before and then the response has been that it is impossible to enter failure route if transaction has not been created. so there has not been any other choice that to live with this terrible mess. now calling drop() in branch route seems to add one more complication and produce errors to syslog.
Then any code we actually run into "if ! t_relay() { ... }" could be executed in failure_route and we get an easier and solid way to handle errors (instead of mixing t_relay negative values, local generated negative responses in failure_route and so).
this has been proposed before, and the answer has been "can't be done".
-- juha
2010/4/17 Juha Heinanen jh@tutpro.com:
Iñaki Baz Castillo writes:
> So I wonder, shouldn't be better if we forgot the t_relay() codes and > instead handle the error of the winning branch (even if it failed or > it was no branch) in failure_route?
inaki,
this has been discussed before and then the response has been that it is impossible to enter failure route if transaction has not been created.
Yes, it makes sense, failure_route should not be entered if no transaction took place (due TCP connection error, malformed message, invalid destination).
so there has not been any other choice that to live with this terrible mess.
ok :(
Thanks for your response.