[erlang-questions] supervisor does not restart my worker

Anders Nygren <>
Sat Jun 9 14:36:10 CEST 2007


On 6/9/07, Matej Kosik <> wrote:
> Hi,
>
> While playing with Erlang, I have tried to check supervisor behavior. I have written a simple generic server (it is attached as `serv.erl' file) that is started by a simple supervisor (its source is in the attached `sup.erl' file).
>
> The API of the server is simple:
>
>         serv:question()
>         serv:fail()
>
> The second service intentionally fails. I wanted to see how the generic server is restarted so that I could continue using it (those services that does not cause failure). However, the `serv' worker is not restarted. What am I doing wrong?
>
>
Hi
The problem You have is that when You call serv:fail() the shell
process terminates,
and is immediately restarted. But since the supervisor was started
with sup:start_link
from the shell the supervisor is terminated.

One way to avoid this problem here is to make the call
> catch serv:fail().

Another useful thing is to start sasl, which will provide more
detailed error messages
>application:start(sasl).


/Anders

> <DETAILS>
> I start supervisor as follows
>
>         1> sup:start_link().
>
> Then I try to use services of my server:
>
>         2> serv:question().
>         42
>         3> serv:question().
>         42
>
> But when I call the service that causes failure of the server
>
>         4> serv:fail().
>
> I get
>
>         =ERROR REPORT==== 9-Jun-2007::13:34:51 ===
>         ** Generic server serv terminating
>         ** Last message in was fail
>         ** When Server state == []
>         ** Reason for termination ==
>         ** {{badmatch,2},[{serv,handle_call,3},{proc_lib,init_p,5}]}
>         ** exited: {{{badmatch,2},[{serv,handle_call,3},{proc_lib,init_p,5}]},
>             {gen_server,call,[serv,fail]}} **
>         5>
>         =ERROR REPORT==== 9-Jun-2007::13:34:51 ===
>         ** Generic server <0.32.0> terminating
>         ** Last message in was {'EXIT',<0.30.0>,
>                                {{{badmatch,2},
>                                  [{serv,handle_call,3},{proc_lib,init_p,5}]},
>                                 {gen_server,call,[serv,fail]}}}
>         ** When Server state == {state,{<0.32.0>,sup},
>                                one_for_all,
>                                [{child,
>                                     <0.37.0>,
>                                     serv,
>                                     {serv,start_link,[]},
>                                     permanent,
>                                     2000,
>                                     worker,
>                                     [serv]}],
>                                {dict,0,
>                                      16,
>                                      16,
>                                      8,
>                                      80,
>                                      48,
>                                      {[],
>                                       [],
>                                       [],
>                                       [],
>                                       [],
>                                       [],
>                                       [],
>                                       [],
>                                       [],
>                                       [],
>                                       [],
>                                       [],
>                                       [],
>                                       [],
>                                       [],
>                                       []},
>                                      {{[],
>                                        [],
>                                        [],
>                                        [],
>                                        [],
>                                        [],
>                                        [],
>                                        [],
>                                        [],
>                                        [],
>                                        [],
>                                        [],
>                                        [],
>                                        [],
>                                        [],
>                                        []}}},
>                                20,
>                                3600,
>                                [{1181,388891,757484}],
>                                sup,
>                                []}
>         ** Reason for termination ==
>         ** {{{badmatch,2},[{serv,handle_call,3},{proc_lib,init_p,5}]},
>             {gen_server,call,[serv,fail]}}
>
> and no restart happens.
> </DETAILS>
>
> Thanks for any clues.
> Cheers
> --
> Matej Kosik
>
> -module(serv).
> -behaviour(gen_server).
>
> -export([start_link/0]).
> -export([question/0, fail/0]).
> -export([init/1, handle_call/3, handle_cast/2]).
> -export([terminate/2, handle_info/2, code_change/3]).
>
> start_link() ->
>     gen_server:start_link({local, serv}, serv, [], []).
>
> question() ->
>     gen_server:call(serv, question).
>
> fail() ->
>     gen_server:call(serv, fail).
>
> init(_Args) ->
>     {ok, []}.
>
> handle_call(question, _From, State) ->
>     {reply, 42, State};
>
> handle_call(fail, _From, State) ->
>     X = 1,
>     % The following command will cause "bad match"
>     X = 2,
>     {reply, 42, State}.
>
> handle_cast(_, State) ->
>     {noreply, State}.
>
> handle_info(_, State) ->
>     {noreply, State}.
>
> terminate(_, _) ->
>     ok.
>
> code_change(_, State, _) ->
>     {ok, State}.
>
> -module(sup).
> -behaviour(supervisor).
>
> -export([start_link/0]).
> -export([init/1]).
>
> start_link() ->
>     supervisor:start_link(sup, []).
>
> init(_Args) ->
>     {ok, {{one_for_all, 20, 3600},
>           [{serv, {serv, start_link, []},
>             permanent, 2000, worker, [serv]}]}}.
>
> all: serv.beam sup.beam
>
> %.beam: %.erl
>         erlc "$<"
>
> clean:
>         rm -f *.beam
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions
>
>



More information about the erlang-questions mailing list