diff options
author | Paul Jones <paulj@lshift.net> | 2009-09-28 19:41:07 +0100 |
---|---|---|
committer | Paul Jones <paulj@lshift.net> | 2009-09-28 19:41:07 +0100 |
commit | 28051995b73b90d93482eddb296d9519237bef77 (patch) | |
tree | adfe9ed9d189fc407c381d20f327678e78259854 | |
parent | ef4629d694f2ea810d8c7ec7ba71227a97edfca9 (diff) | |
download | rabbitmq-server-28051995b73b90d93482eddb296d9519237bef77.tar.gz |
Updated boot modification code to support catching errors
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | src/rabbit.erl | 26 | ||||
-rw-r--r-- | src/rabbit_plugin_activator.erl | 56 |
3 files changed, 53 insertions, 31 deletions
@@ -103,7 +103,7 @@ BASIC_SCRIPT_ENVIRONMENT_SETTINGS=\ run: all $(BASIC_SCRIPT_ENVIRONMENT_SETTINGS) \ RABBITMQ_ALLOW_INPUT=true \ - RABBITMQ_SERVER_START_ARGS="$(RABBITMQ_SERVER_START_ARGS) -s rabbit" \ + RABBITMQ_SERVER_START_ARGS="$(RABBITMQ_SERVER_START_ARGS)" \ ./scripts/rabbitmq-server run-node: all diff --git a/src/rabbit.erl b/src/rabbit.erl index 242b6cc7..e7baa107 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -33,7 +33,7 @@ -behaviour(application). --export([prepare/0, start/0, stop/0, stop_and_halt/0, status/0, rotate_logs/1]). +-export([boot/1, start/0, stop/0, stop_and_halt/0, status/0, rotate_logs/1]). -export([start/2, stop/1]). @@ -59,6 +59,7 @@ -spec(start/0 :: () -> 'ok'). -spec(stop/0 :: () -> 'ok'). +-spec(boot/1 :: ([atom()]) -> 'ok'). -spec(stop_and_halt/0 :: () -> 'ok'). -spec(rotate_logs/1 :: (file_suffix()) -> 'ok' | {'error', any()}). -spec(status/0 :: () -> @@ -71,14 +72,27 @@ %%---------------------------------------------------------------------------- -prepare() -> - ok = ensure_working_log_handlers(), - ok = rabbit_mnesia:ensure_mnesia_dir(). +boot(Apps) -> + try + ok = ensure_working_log_handlers(), + ok = rabbit_mnesia:ensure_mnesia_dir(), + + ok = rabbit_misc:start_applications(Apps) + catch + {error, Reason} -> + io:format("Failed to start Rabbit: ~p~n", [Reason]), + halt(1); + {'EXIT', Reason} -> + io:format("Component crashed whilst starting Rabbit: ~p~n", [Reason]), + halt(1); + Unknown -> + io:format("Unknown failure type whilst starting Rabbit: ~p~n", [Unknown]), + halt(1) + end. start() -> try - prepare(), - ok = rabbit_misc:start_applications(?APPS) + rabbit:boot(?APPS) after %%give the error loggers some time to catch up timer:sleep(100) diff --git a/src/rabbit_plugin_activator.erl b/src/rabbit_plugin_activator.erl index 175e496d..c40ac114 100644 --- a/src/rabbit_plugin_activator.erl +++ b/src/rabbit_plugin_activator.erl @@ -108,6 +108,10 @@ start() -> {error, Message} -> io:format("~s~n", [Message]), halt(1) end, + case systools:script2boot(RabbitEBin ++ "/rabbit") of + ok -> ok; + error -> io:format("Failed to compile updated rabbit.script~n") + end, halt(), ok. @@ -204,31 +208,35 @@ expand_dependencies(Current, [Next|Rest]) -> end. include_rabbit_prepare(RootName) -> - ScriptFile = RootName ++ ".script", - {SName, SNewEntries} = case file:consult(RootName ++ ".script") of - {ok, [{script, Name, Entries}]} -> - NewEntries = process_entries(Entries), - {Name, NewEntries}; - {error, Reason} -> - throw({error, io_lib:format("Failed to load script: ~p", [Reason])}) - end, - - case file:open(ScriptFile, [write]) of - {ok, Fd} -> - io:format(Fd, "%% script generated at ~w ~w\n~p.\n", - [date(), time(), {script, SName, SNewEntries}]), - file:close(Fd), - ok; - {error, OReason} -> - throw({error, io_lib:format("Failed to open script file for writing - ~p", [OReason])}) - end, - case systools:script2boot(RootName) of - ok -> ok; - error -> "Failed to compile script file to boot file" + ScriptFile = RootName ++ ".script", + case file:consult(ScriptFile) of + {ok, [{script, Name, Entries}]} -> + NewEntries = process_entries(Entries), + case file:open(ScriptFile, [write]) of + {ok, Fd} -> + io:format(Fd, "%% script generated at ~w ~w\n~p.\n", + [date(), time(), {script, Name, NewEntries}]), + file:close(Fd), + ok; + {error, OReason} -> + {error, {failed_to_open_boot_for_writing, OReason}} + end; + {error, Reason} -> + {error, {failed_to_load_script, Reason}} end. -process_entries([]) -> []; +process_entries([]) -> + []; process_entries([Entry = {apply,{application,start_boot,[stdlib,permanent]}}|Rest]) -> - [Entry, {apply,{rabbit,prepare,[]}}] ++ process_entries(Rest); + {Apps, RestBoot} = select_apps(Rest), + [Entry, {apply,{rabbit,boot,[Apps]}} | RestBoot]; process_entries([Entry|Rest]) -> - [Entry] ++ process_entries(Rest). + [Entry | process_entries(Rest)]. + +select_apps([]) -> + {[], []}; +select_apps([{apply,{application,start_boot,[Name,_]}}|Rest]) -> + {RestApps, RestRest} = select_apps(Rest), + {[Name|RestApps], RestRest}; +select_apps(RestEntries) -> + {[], RestEntries}.
\ No newline at end of file |