[erlang-questions] Need help with simple_one_for_one

Serge Aleynikov <>
Wed Aug 20 19:03:47 CEST 2008


In your implementation it's possible that the init/1 call returns:

{ok, State, StateData} | ok

The second return type is not valid (the Else clause in case statement).

(I doubt that this is actually the error you are hitting as if the init 
function is not called it means that you are not starting gen_fsm 
correctly via gen_fsm:start_link(Module, Args::list(), [])).

Also, before you start debugging processes based on gen behaviors enable 
SASL so that the error reports are more verbose:

	erl -boot start_sasl

Serge

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 <> 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 <>
>>> 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 <>
>>>>> 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
>>>>>>> 
>>>>>>> http://www.erlang.org/mailman/listinfo/erlang-questions
>>>>>>>
>>>>>>>
>>>>>>>
> 




More information about the erlang-questions mailing list