From: Lev W. <vl...@li...> - 2007-11-26 16:21:54
|
On FreeBSD 6.x machine under high load the gen_tcp:accept() sometimes returns with {error, econnaborted}. yaws_server.erl is programmed to finish its work and die upon receiving this error. I think this error needs to be ignored without any attempt at suicide. There may be other classes of "safe" errors which are better be ignored. -- vlm |
From: Claes W. <kl...@ta...> - 2007-11-26 19:07:38
|
Lev Walkin wrote: > > On FreeBSD 6.x machine under high load the gen_tcp:accept() > sometimes returns with {error, econnaborted}. yaws_server.erl > is programmed to finish its work and die upon receiving > this error. I think this error needs to be ignored without > any attempt at suicide. There may be other classes of "safe" > errors which are better be ignored. > > I completely agree, this is a bug. The econnaborted is apparently happening when we receive an RST instead of the final TCP SYN which is a completely normal case... well almost. I had no idea. News to me. Thus the boring downside of this bug report is that the current yaws release which I believe is the first one out there where my new "die on accept()" idea is in, is not fit for production. I still feel the "die on accept() failure" is the right thing TM to do. I'll try to make a new release asap, Thanks for the bug report - good. /klacke The patch is: Index: yaws_server.erl =================================================================== --- yaws_server.erl (revision 1178) +++ yaws_server.erl (working copy) @@ -783,7 +783,10 @@ erase_transients(), acceptor0(GS, Top) end; - {error, timeout} -> + {error, Reason} when ((Reason == timeout) or + (Reason == econnaborted)) -> + %% The econnaborted is + %% caused by recieving a RST when a SYN or SYN+ACK was expected. Top ! {self(), done_client, 0}, receive {Top, stop} -> |