[erlang-questions] UDP socket - ealready ERROR

Bogdan Andu bog495@REDACTED
Tue Dec 8 12:18:11 CET 2015


Hi,

I try to build a concurrent UDP server in Erlang,

The socket is opened in a supervisor like this:
init([]) ->
    %%xpp_config_lib:reload_config_file(),
    [{port, Port}] = ets:lookup(config, port),
    [{listen, IPv4}] = ets:lookup(config, listen),

    %% for worker
    [{ssl_recv_timeout, SslRecvTimeout}] = ets:lookup(config,
ssl_recv_timeout),


    {ok, Sock} = gen_udp:open(Port, [binary,
                            {active, false},
                            {reuseaddr, true},
                            {ip, IPv4},
                            {mode, binary}
        ]),


    MpsConn = {mps_conn_fsm,{mps_conn_fsm, start_link, [Sock,
SslRecvTimeout, false]},
            temporary, 5000, worker, [mps_conn_fsm]},

    {ok, {{simple_one_for_one, 0, 1}, [MpsConn]}}.

  and in worker I have:


  init([Sock, SslRecvTimeout, Inet6]) ->
        process_flag(trap_exit, true),

        {ok, recv_pckt, #ssl_conn_state{lsock = Sock, ssl_recv_timeout =
SslRecvTimeout,
                                conn_pid = self(), inet6 = Inet6}, 0}.

%% --------------------------------------------------------------------
%% Func: StateName/2
%% Returns: {next_state, NextStateName, NextStateData}          |
%%          {next_state, NextStateName, NextStateData, Timeout} |
%%          {stop, Reason, NewStateData}
%% --------------------------------------------------------------------
recv_pckt(Event, #ssl_conn_state{lsock = ListenSock, inet6 = Inet6,
                                 ssl_recv_timeout = SslRecvTimeout} =
StateData) ->
%%      io:format("**epp_login~n", []),
%%          gen_udp:close(ListenSock),
        {ok, {Address, Port, Packet}} = gen_udp:recv(ListenSock, 0,
SslRecvTimeout),
        io:format("~p~n", [Packet]),
        gen_udp:close(ListenSock),
         {stop, normal, StateData}.
%%         {next_state, recv_pckt, StateData, 0}.

.. and in Erlang shell :
Erlang/OTP 18 [erts-7.0] [source] [64-bit] [smp:2:2] [async-threads:10]
[kernel-poll:false]

mps_dbg@REDACTED)1>
(mps_dbg@REDACTED)1> mps_conn_sup:start_child().
{ok,<0.62.0>}
(mps_dbg@REDACTED)2> mps_conn_sup:start_child().
{ok,<0.64.0>}

=ERROR REPORT==== 8-Dec-2015::13:09:55 ===
[<0.64.0>]:[2]:TERMINATE:REASON={{badmatch,{error,ealready}},
                                 [{mps_conn_fsm,recv_pckt,2,
                                   [{file,

"/home/andu/remote/hp/home/andu/web/mps/src/mps_conn_fsm.erl"},
                                    {line,80}]},
                                  {gen_fsm,handle_msg,7,
                                   [{file,"gen_fsm.erl"},{line,518}]},
                                  {proc_lib,init_p_do_apply,3,

[{file,"proc_lib.erl"},{line,239}]}]}:undefined
(mps_dbg@REDACTED)3>
=ERROR REPORT==== 8-Dec-2015::13:09:55 ===
** State machine <0.64.0> terminating
** Last event in was timeout
** When State == recv_pckt
**      Data  == {ssl_conn_state,#Port<0.1632>,60000,undefined,undefined,

undefined,[],[],<0.64.0>,undefined,undefined,
                                 undefined,"en",undefined,false,undefined,
                                 undefined,undefined,undefined,undefined,
                                 false,<<>>,<<>>,undefined,0}
** Reason for termination =
** {{badmatch,{error,ealready}},
    [{mps_conn_fsm,recv_pckt,2,

[{file,"/home/andu/remote/hp/home/andu/web/mps/src/mps_conn_fsm.erl"},
                    {line,80}]},
     {gen_fsm,handle_msg,7,[{file,"gen_fsm.erl"},{line,518}]},
     {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,239}]}]}

=CRASH REPORT==== 8-Dec-2015::13:09:55 ===
  crasher:
    initial call: mps_conn_fsm:init/1
    pid: <0.64.0>
    registered_name: []
    exception exit: {{badmatch,{error,ealready}},
                     [{mps_conn_fsm,recv_pckt,2,
                          [{file,

"/home/andu/remote/hp/home/andu/web/mps/src/mps_conn_fsm.erl"},
                           {line,80}]},

{gen_fsm,handle_msg,7,[{file,"gen_fsm.erl"},{line,518}]},
                      {proc_lib,init_p_do_apply,3,
                          [{file,"proc_lib.erl"},{line,239}]}]}
      in function  gen_fsm:terminate/7 (gen_fsm.erl, line 626)
    ancestors: [mps_conn_sup,<0.60.0>,<0.56.0>]
    messages: []
    links: [<0.61.0>]
    dictionary: []
    trap_exit: true
    status: running
    heap_size: 610
    stack_size: 27
    reductions: 295
  neighbours:

=SUPERVISOR REPORT==== 8-Dec-2015::13:09:55 ===
     Supervisor: {local,mps_conn_sup}
     Context:    child_terminated
     Reason:     {{badmatch,{error,ealready}},
                  [{mps_conn_fsm,recv_pckt,2,
                       [{file,

"/home/andu/remote/hp/home/andu/web/mps/src/mps_conn_fsm.erl"},
                        {line,80}]},
                   {gen_fsm,handle_msg,7,[{file,"gen_fsm.erl"},{line,518}]},
                   {proc_lib,init_p_do_apply,3,
                       [{file,"proc_lib.erl"},{line,239}]}]}
     Offender:   [{pid,<0.64.0>},
                  {id,mps_conn_fsm},
                  {mfargs,{mps_conn_fsm,start_link,undefined}},
                  {restart_type,temporary},
                  {shutdown,5000},
                  {child_type,worker}]


When I try to start another concurrent worker I get ealready error.

How can be this error avoided.

The option to make socket active introduces a bottleneck as all messages
are sent to
controlling process.

Is there any configuration parameter at os kernel level or via inet_dist to
fix the error?

OS :
Linux localhost 4.0.4-301.fc22.x86_64 #1 SMP Thu May 21 13:10:33 UTC 2015
x86_64 x86_64 x86_64 GNU/Linux

Any help very much appreciated,

Bogdan
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20151208/00a51250/attachment.htm>


More information about the erlang-questions mailing list