[erlang-bugs] [erlang-questions] Process/FD leak in SSL R15B01

Ingela Anderton Andin <>
Wed Nov 7 16:12:29 CET 2012


Hi!

The problem is that "call-timeouts"  in gen_server/fsm suck, as they are 
purly client side. The {ref, connected} is a gen:fsm-reply that should 
have been received by the ssl connect code.  Like the recv problem on 
erlang-questions this is solved by making the timer server side,  it 
could be argued some of these timeouts in ssl API are not needed, but 
they are legacy...  We will fix it.  After some investigation I think 
the "best" solution to your other problem will be call gen_tcp:recv/3 in 
the workaround. We will also clean up the logic in terminate.

Regards Ingela Erlang/OTP team - Ericsson AB


Loïc Hoguin wrote:
> On 11/01/2012 12:38 PM, Loïc Hoguin wrote:
>> * There is another problem where processes get stuck elsewhere, which
>> I'm going to try to investigate. Note that the sockets for this problem
>> stay in ESTABLISHED.
>
> In this particular case, here's what we got:
>
> [{current_function,{gen_fsm,loop,7}},
>  {initial_call,{proc_lib,init_p,5}},
>  {status,waiting},
>  {message_queue_len,0},
>  {messages,[]},
>  {links,[<0.897.0>,#Port<0.264729349>]},
>  {dictionary,[{ssl_manager,ssl_manager},
>               {'$ancestors',[ssl_connection_sup,ssl_sup,<0.894.0>]},
>               {'$initial_call',{ssl_connection,init,1}}]},
>  {trap_exit,false},
>  {error_handler,error_handler},
>  {priority,normal},
>  {group_leader,<0.893.0>},
>  {total_heap_size,8362},
>  {heap_size,4181},
>  {stack_size,10},
>  {reductions,7029},
>  {garbage_collection,[{min_bin_vheap_size,46368},
>                       {min_heap_size,233},
>                       {fullsweep_after,10},
>                       {minor_gcs,10}]},
>  {suspending,[]}]
>
> Looking further, I notice something weird.
>
> > erlang:process_info(Pid, monitors).
> {monitors,[{process,<0.1055.0>}]}
>
> This is a very old pid.
>
> > erlang:process_info(OldPid).
> [{current_function,{prim_inet,accept0,2}},
>  {initial_call,{cowboy_acceptor,acceptor,7}},
>  {status,waiting},
>  {message_queue_len,1602},
>  {messages,[{#Ref<0.0.19.196440>,connected},
>             {#Ref<0.0.21.74727>,connected},
>             {#Ref<0.0.28.93234>,connected},
>             {#Ref<0.0.64.192190>,connected},
>             {#Ref<0.0.167.184831>,connected},
>             {#Ref<0.0.208.24369>,connected},
>             {#Ref<0.0.282.59352>,connected},
>             {#Ref<0.0.340.181599>,connected},
>             {#Ref<0.0.341.57338>,connected},
>             {#Ref<0.0.427.15661>,connected},
>             {#Ref<0.0.430.8560>,connected},
>             {#Ref<0.0.439.40688>,connected},
>             {#Ref<0.0.439.214050>,connected},
>             {#Ref<0.0.440.206978>,connected},
>             {#Ref<0.0.466.173049>,connected},
>             {#Ref<0.0.497.35749>,connected},
>             {#Ref<0.0.514.36774>,connected},
>             {#Ref<0.0.514.109971>,connected},
>             {#Ref<0.0.541.246233>,connected},
>             {#Ref<0.0.544.168339>,connected},
>             {#Ref<0.0.584.43294>,...},
>             {...}|...]},
>  {links,[<0.1028.0>]},
>  {dictionary,[]},
>  {trap_exit,false},
>  {error_handler,error_handler},
>  {priority,normal},
>  {group_leader,<0.868.0>},
>  {total_heap_size,32838},
>  {heap_size,4181},
>  {stack_size,22},
>  {reductions,219876367},
>  {garbage_collection,[{min_bin_vheap_size,46368},
>                       {min_heap_size,233},
>                       {fullsweep_after,10},
>                       {minor_gcs,1}]},
>  {suspending,[]}]
>
> So this is the acceptor process. It doesn't make sense though, why 
> would the ssl process still monitor the acceptor? The acceptor code is 
> equivalent to this:
>
> {ok, Socket} = ssl:transport_accept(ListenSocket, 2000),
> ok = ssl:ssl_accept(Socket, 2000),
> {ok, Pid} = supervisor:start_child(SupPid, Args),
> Transport:controlling_process(Socket, Pid),
> %% ...
>
> I'm also not sure what {#Ref<0.0.19.196440>,connected} is. Are they 
> supposed to receive this?
>
> Any pointer as to where to look next would help.
>
> Thanks.
>



More information about the erlang-bugs mailing list