[erlang-questions] Need help with simple_one_for_one

Matt Williamson <>
Wed Aug 20 18:51:12 CEST 2008


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
>>>>>>
>>>>>>
>>>>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20080820/4ca35421/attachment.html>


More information about the erlang-questions mailing list