[erlang-questions] Need help with simple_one_for_one

Matt Williamson <>
Thu Aug 21 11:27:15 CEST 2008


I didn't indicate an error because there wasn't any. Even with SASL started.


My problem is that I didn't realize that FSMs were event based. I did
realize they could handle events, but didn't realize that's how they are
supposed to be used. I thought that at the end of each state function, it
would change state (which it does do) and then call the next state function
automatically.

Since FSMs don't work like that, I switched to a good old fashioned process
with spawn_link and my project is making headway.

Thank you both very much for your help!

On Wed, Aug 20, 2008 at 6:06 PM, Serge Aleynikov <> wrote:

> After looking at your code for the second time, I see that the init
> function is wrong - it should be:
>
> init([StartArgs]) ->
>    ...
>
> Try that.  You are not indicating here what the error is, but if it is
> function_clause, then that's it.
>
> Serge
>
>
> Matt Williamson wrote:
>
>> So no. I did not send it any event.
>> Serge, I enabled sasl via application:start/1 but when I ran the function
>> in
>> question I didn't get any output from it.
>>
>> On Wed, Aug 20, 2008 at 1:00 PM, Mazen Harake
>> <>wrote:
>>
>>  Hi Matt,
>>>
>>> Sorry this might be a stupid question but did you send it an event?
>>>
>>> /Mazen
>>>
>>> Matt Williamson wrote:
>>>
>>>  I hate to keep bugging with simple problems, but I'm stuck again. My FSM
>>>> dosn't seem to be executing its first state. Here is my init function:
>>>>
>>>> /init(StartArgs) ->
>>>>   InitialState = case StartArgs of
>>>>   {store_chunk, Chunk} ->
>>>>       io:format("FSM Storing chunk...~n"),
>>>>       {ok, storing_chunk, [Chunk]};
>>>>   {get_chunk, Args} ->
>>>>       {ok, getting_chunk, Args};
>>>>   Else ->
>>>>       %% @todo Add error logging here.
>>>>       io:format("Bad arg for FSM: ~p~n", [StartArgs])
>>>>   end,
>>>>   io:format("FSM Initial State: ~p~n", [InitialState]),
>>>>   InitialState./
>>>>
>>>> storing_chunk/2 is exported and I'm not getting any errors. Here is that
>>>> function:
>>>>
>>>> /storing_chunk(_Event, [Chunk]) ->
>>>>   io:format("STATE: storing_chunk~n"),
>>>>   case erlfs_store_lib:store_chunk() of
>>>>   ok ->
>>>>       {next_state, notifying_tracker, Chunk};
>>>>   {error, Reason} ->
>>>>       %% @todo Add error logging here.
>>>>       io:format("FSM Stopped: ~p~n", [Reason]),
>>>>       {stop, {file, Reason}, Chunk#chunk.chunk_meta}
>>>>   end./
>>>>
>>>> On Wed, Aug 20, 2008 at 11:04 AM, Serge Aleynikov <
>>>> <mailto:
>>>> >> wrote:
>>>>
>>>>   The error you reported earlier:
>>>>
>>>>   {'EXIT', {badarg, [{erlang, apply,
>>>>      [erlfs_store_worker_fsm, start_link, {store_chunk, ...}]}]}}
>>>>
>>>>   was a clear indication that erlang:apply(M,F,A) was called with A
>>>>   being a tuple rather than a list.  If this still doesn't work
>>>>   after replacing tuple with a list in the second argument of the
>>>>   supervisor:start_child/2 call, this means that you probably have
>>>>   other issues in the erlfs_store_worker_fsm:start_link/1 itself.
>>>>
>>>>   I can't say anything more without seeing a more detailed error report.
>>>>
>>>>   Serge
>>>>
>>>>
>>>>   Matt Williamson wrote:
>>>>
>>>>       Yes, I saw that in the docs. What I was saying is that calling
>>>>       apply(M, F,
>>>>       A++List) =:= apply(M, F, List) when A =:= [].
>>>>
>>>>       I did try your suggestion anyway with the same results.
>>>>
>>>>       On Wed, Aug 20, 2008 at 9:54 AM, Serge Aleynikov
>>>>       < <mailto:>> wrote:
>>>>
>>>>           What is the arity of erlfs_store_worker_fsm:start_link
>>>>           function?
>>>>
>>>>           Not quite sure what you mean by [] ++ 1 below.
>>>>
>>>>           The supervisor:start_child/2 takes a list [term()] as the
>>>>           second parameter.
>>>>            Here's its docs:
>>>>
>>>>           "If the case of a simple_one_for_one supervisor, the child
>>>>           specification
>>>>           defined in Module:init/1 will be used and ChildSpec should
>>>>           instead be an
>>>>           arbitrary list of terms List. The child process will then
>>>>           be started by
>>>>           appending List to the existing start function arguments,
>>>>           i.e. by calling
>>>>           apply(M, F, A++List) where {M,F,A} is the start function
>>>>           defined in the
>>>>           child specification."
>>>>
>>>>           Note the A++List part.
>>>>
>>>>
>>>>           Matt Williamson wrote:
>>>>
>>>>               I'm afraid that did not work. I am passing an empty
>>>>               list, and if I execute
>>>>               [] ++ 1 in the shell I get 1.
>>>>
>>>>               On Wed, Aug 20, 2008 at 9:31 AM, Serge Aleynikov
>>>>               < <mailto:>>
>>>>
>>>>               wrote:
>>>>
>>>>                Try starting it as:
>>>>
>>>>                   supervisor:start_child(erlfs_store_worker_sup,
>>>>                   [{store_chunk, Chunk}])
>>>>
>>>>                   The simple_one_for_one strategy appends the
>>>>                   arguments passed to
>>>>                   supervisor:start_child/2 to the list of args
>>>>                   specified in the
>>>>                   supervisor's
>>>>                   spec.
>>>>
>>>>                   Serge
>>>>
>>>>                   Matt Williamson wrote:
>>>>
>>>>                    Hello,
>>>>
>>>>                       I am starting a gen_fsm with
>>>>                       supervisor:start_child(erlfs_store_worker_sup,
>>>>                       {store_chunk, Chunk}) but I get the following
>>>>                       error:
>>>>
>>>>                       {error,
>>>>                                                       {'EXIT',
>>>>                                                        {badarg,
>>>>                                                         [{erlang,
>>>>                                                           apply,
>>>>
>>>>       [erlfs_store_worker_fsm,
>>>>                                                            start_link,
>>>>                                                            {store_chunk,
>>>>                                                             {chunk,
>>>>
>>>>          {chunk_meta,
>>>>
>>>>           {file_meta,
>>>>
>>>>            "test123",
>>>>
>>>>            "test.txt",
>>>>                                                                0,
>>>>
>>>>            "text/plain",
>>>>
>>>>            {{0,1,1},{0,0,0}}},
>>>>                                                               0,
>>>>                                                               0,
>>>>                                                               []},
>>>>
>>>>          <<"Hello world!">>}}]},
>>>>
>>>>      {supervisor,do_start_child_i,3},
>>>>
>>>>      {supervisor,handle_call,3},
>>>>
>>>>      {gen_server,handle_msg,6},
>>>>
>>>>      {proc_lib,init_p,5}]}}}
>>>>
>>>>                       I've been trying to figure it out for a while,
>>>>                       but I am having a hard
>>>>                       time.
>>>>                       Here is the Child Spec in the supervisor
>>>>                       (erlfs_store_worker_sup):
>>>>
>>>>                       init(Args) ->
>>>>                        WorkerSpec = {erlfs_store_worker_fsm,
>>>>                       {erlfs_store_worker_fsm,
>>>>                                           start_link, []},
>>>>                              temporary, 2000, worker,
>>>>                       [erlfs_store_worker_fsm]},
>>>>                        {ok,{{simple_one_for_one, 0, 1}, [WorkerSpec]}}.
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>  ------------------------------------------------------------------------
>>>>
>>>>                       _______________________________________________
>>>>                       erlang-questions mailing list
>>>>                       
>>>>                       <mailto:>
>>>>
>>>> http://www.erlang.org/mailman/listinfo/erlang-questions
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> ------------------------------------------------------------------------
>>>>
>>>> _______________________________________________
>>>> erlang-questions mailing list
>>>> 
>>>> http://www.erlang.org/mailman/listinfo/erlang-questions
>>>>
>>>>
>>> --
>>> Mazen Harake <>
>>> Erlang Software Developer and Consultant,
>>> Erlang Training & Consulting, Ltd
>>>
>>> Mobile Phone: +44 (0)795 13 26 317
>>> Office Phone: +44 (0)207 45 61 020
>>> Office Address:
>>> 401 London Fruit & Wool Exchange
>>> Brushfield St, London, E1 6EL
>>> United Kingdom
>>>
>>> This email and its attachments may be confidential and are intended
>>> solely
>>> for the use of the individual to whom it is addressed. Any views or
>>> opinions
>>> expressed are solely those of the author and do not necessarily represent
>>> those of "Erlang Training & Consulting, Ltd".
>>>
>>> If you are not the intended recipient of this email and its attachments,
>>> you must take no action based upon them, nor must you copy or show them
>>> to
>>> anyone. Please contact the sender if you believe you have received this
>>> email in error.
>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20080821/ee3ab261/attachment.html>


More information about the erlang-questions mailing list