[erlang-questions] inets services startup

Serge <>
Fri Apr 6 06:05:04 CEST 2007


I've been trying to work around the inets startup issue described in the 
former email of failing to crash inets in case of a inability to start 
for a httpd service given its configuration file.  I also need to run 
inets as an embedded application.  The best solution I could come up 
with was not to use inets' own supervisor, but start a custom one, 
register it as 'httpd_sup' so that httpd_sup:start_child/1 could be used 
to link to this supervisor.  Since httpd_sup:start_child/1 doesn't 
accept the supervisor name I am enforced to call this supervisor 
'httpd_sup'.  Are there any more elegant ways of embedding inets and 
solving the described issue aside from patching the distribution?

What I would like to see implemented in inets is a function:

httpd_sup:start_child(Supervisor, ConfigList)
   Supervisor = atom()            % Name of a parent supervisor
   ConfigList = [{Option, Value}] % What's returned by httpd_conf:load/1

Serge


-module(test_app).
-behaviour(application).

%% application callbacks
-export([start/2, stop/1]).

%% supervisor callbacks
-export([init/1]).

%%%-------------------------------------------------------------------
%%% Callbacks functions from application
%%%-------------------------------------------------------------------

%%--------------------------------------------------------------------
%% @spec start(Type, StartArgs) -> Result
%%         Result = {ok, Pid}        |
%%                  {ok, Pid, State} |
%%                  {error, Reason}
%% @doc Start application callback
%% @end
%% @private
%%--------------------------------------------------------------------
start(_Type, StartArgs) ->
     {ok, ConfigFile} = application:get_env(test_app, httpd_config_file),
     case supervisor:start_link({local, httpd_sup}, ?MODULE, []) of
     {ok, Pid} ->
         case catch httpd_sup:start_child(ConfigFile) of
         {ok, _Child} ->
             {ok, Pid};
         {error,Error} ->
             {error, Error}
         end;
     {error, Error} ->
         {error, Error}
     end.

%%--------------------------------------------------------------------
%% @spec stop(Reason) -> any
%% @doc Stop application callback
%% @end
%% @private
%%--------------------------------------------------------------------
stop(_Reason) ->
     ok.

%%%-------------------------------------------------------------------
%%% Callback functions from supervisor
%%%-------------------------------------------------------------------

%%%-------------------------------------------------------------------
%%% Internal functions
%%%-------------------------------------------------------------------

init(_Args) ->
     {ok, {{one_for_one, 10, 3600}, []}}.


Serge Aleynikov wrote:
> While accidentally entering wrong information in inets' server 
> configuration file I got an error report stating that a child spec was 
> not created.  As a result the corresponding service didn't get started.
> 
> Upon examining sources, I found the following code with 
> exit({error,Reason}) commented out:
> 
> httpd_sup.erl:
> ==============
> child_spec([], Acc) ->
>      Acc;
> child_spec([{httpd, HttpdService} | Rest], Acc) ->
>      NewHttpdService = mk_tuple_list(HttpdService),
>      %%    Acc2 = child_spec2(NewHttpdService,Acc),
>      NewAcc=
>      case catch child_spec2(NewHttpdService) of
>          {ok,Acc2} ->
>          [Acc2|Acc];
>          {error,Reason} ->
>          error_msg("failed to create child spec for ~n~p~ndue to: ~p",
>                [HttpdService,Reason]),
> %       exit({error,Reason})
>          Acc
>      end,
>      child_spec(Rest,NewAcc).
> 
> I was wondering what the authors had in mind by somewhat silently 
> ignoring the critical error at startup.  Wouldn't it be proper to 
> uncomment that line?
> 
> Serge
> 




More information about the erlang-questions mailing list