summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Jones <paulj@lshift.net>2009-09-28 19:41:07 +0100
committerPaul Jones <paulj@lshift.net>2009-09-28 19:41:07 +0100
commit28051995b73b90d93482eddb296d9519237bef77 (patch)
treeadfe9ed9d189fc407c381d20f327678e78259854
parentef4629d694f2ea810d8c7ec7ba71227a97edfca9 (diff)
downloadrabbitmq-server-28051995b73b90d93482eddb296d9519237bef77.tar.gz
Updated boot modification code to support catching errors
-rw-r--r--Makefile2
-rw-r--r--src/rabbit.erl26
-rw-r--r--src/rabbit_plugin_activator.erl56
3 files changed, 53 insertions, 31 deletions
diff --git a/Makefile b/Makefile
index 57b2a793..c98a45ba 100644
--- a/Makefile
+++ b/Makefile
@@ -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