<div dir="ltr"><div dir="auto"><div>Hello,<br><br><div class="gmail_quote"><div dir="ltr">On Mon, 6 Aug 2018, 10:49 Bekes, Andras G, wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi All,<br>
<br>
Reviving this old thread again, because I am getting more and more convinced that we need further changes.<br>
We're still observing connection close events when an error should be reported to gen_tcp level.<br>
It can be a reset error somehow still not reported as 'econnreset', but I suspect it must be some other error.<br></blockquote><div><br></div><div>I suppose that you have not managed to catch the error in a tcp dump as Rory asked for?</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
I checked the code in inet_drv.c. The function<br>
static int tcp_recv(tcp_descriptor* desc, int request_len)<br>
seems to work properly -- a reset is either reported as closed or econnreset, depending on show_econnreset, all other errors are reported as errors.<br>
<br>
However, the function<br>
static int tcp_send_or_shutdown_error(tcp_descriptor* desc, int err)<br>
hides errors. Connection reset errors are properly handled (either reported as closed or econnreset, depending on show_econnreset), but all other errors are just reported as closed.<br>
Active and passive modes have independent code paths, but I think both do the same: all errors are reported as normal close -- except for econnreset.<br></blockquote><div><br></div><div>There is a merge of error codes happening in tcp_send_error, so some other errors get mapped into econnreset before tcp_send_or_shutdown_error is called.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Apparently I need to detect all errors.<br>
Is it possible to implement a show_errors (or show_all_errors) flag, too?<br>
<br>
Actually, this new flag could replace the current show_econnreset flag.<br>
Having two separate flags for econnreset & others requires more complex code, but having a single show_errors flag would simplify the current that provides special treatment for econnreset.<br>
I am not sure if it makes much sense to expose connection reset errors but still mask all other errors as normal close events.<br>
<br>
>From a farther point of view, it seems there are network-programming tasks (there is at least one!), for which Erlang seems not suitable. This sounds rather sad.<br>
Luckily the fix doesn't seem difficult.<br>
<br>
What do you think?<br></blockquote></div></div><div dir="auto"><br></div><div dir="auto">I agree that it should be possible to get the original error from the tcp stack. Given the discussions here <a href="https://github.com/erlang/otp/pull/731">https://github.com/erlang/otp/pull/731</a>, maybe it is time to reverse the options so that returning the original error becomes the default and you have to set an option to get the backwards compatible behaviour?</div><div dir="auto"><br></div><div>We are currently in the process of a major overhaul of gen_tcp and friends, so maybe this can be changed while doing that, as we are bound to break backwards compatibility in various ways during that rewrite anyways.</div><div><br></div><div>Lukas</div></div>
</div>