Skip to content

Commit c8e3210

Browse files
Merge branch 'master' into rabbitmq-server-1257
2 parents b527963 + 245e3c7 commit c8e3210

File tree

3 files changed

+55
-25
lines changed

3 files changed

+55
-25
lines changed

priv/schema/rabbitmq.schema

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,6 +791,9 @@ fun(Conf) ->
791791
dns -> rabbit_peer_discovery_dns;
792792
aws -> rabbit_peer_discovery_aws;
793793
consul -> rabbit_peer_discovery_consul;
794+
etcd -> rabbit_peer_discovery_etcd;
795+
kubernetes -> rabbit_peer_discovery_k8s;
796+
k8s -> rabbit_peer_discovery_k8s;
794797
Module -> Module
795798
end
796799
end}.

src/rabbit.erl

Lines changed: 49 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@
1919
-behaviour(application).
2020

2121
-export([start/0, boot/0, stop/0,
22-
stop_and_halt/0, await_startup/0, status/0, is_running/0, alarms/0,
22+
stop_and_halt/0, await_startup/0, await_startup/1,
23+
status/0, is_running/0, alarms/0,
2324
is_running/1, environment/0, rotate_logs/0, force_event_refresh/1,
2425
start_fhc/0]).
2526
-export([start/2, stop/1, prep_stop/1]).
26-
-export([start_apps/1, stop_apps/1]).
27+
-export([start_apps/1, start_apps/2, stop_apps/1]).
2728
-export([log_locations/0, config_files/0, decrypt_config/2]). %% for testing and mgmt-agent
2829

2930
-ifdef(TEST).
@@ -266,6 +267,8 @@
266267
-spec boot_delegate() -> 'ok'.
267268
-spec recover() -> 'ok'.
268269
-spec start_apps([app_name()]) -> 'ok'.
270+
-spec start_apps([app_name()],
271+
#{app_name() => permanent|transient|temporary}) -> 'ok'.
269272
-spec stop_apps([app_name()]) -> 'ok'.
270273

271274
%%----------------------------------------------------------------------------
@@ -467,7 +470,7 @@ stop() ->
467470
undefined -> ok;
468471
_ ->
469472
rabbit_log:info("RabbitMQ hasn't finished starting yet. Waiting for startup to finish before stopping..."),
470-
wait_for_boot_to_finish()
473+
ok = wait_for_boot_to_finish(node())
471474
end,
472475
rabbit_log:info("RabbitMQ is asked to stop...~n", []),
473476
Apps = ?APPS ++ rabbit_plugins:active(),
@@ -502,6 +505,9 @@ stop_and_halt() ->
502505
ok.
503506

504507
start_apps(Apps) ->
508+
start_apps(Apps, #{}).
509+
510+
start_apps(Apps, AppModes) ->
505511
app_utils:load_applications(Apps),
506512

507513
ConfigEntryDecoder = case application:get_env(rabbit, config_entry_decoder) of
@@ -541,7 +547,8 @@ start_apps(Apps) ->
541547
true -> ok %% will run during start of rabbit app
542548
end,
543549
ok = app_utils:start_applications(OrderedApps,
544-
handle_app_error(could_not_start)).
550+
handle_app_error(could_not_start),
551+
AppModes).
545552

546553
%% This function retrieves the correct IoDevice for requesting
547554
%% input. The problem with using the default IoDevice is that
@@ -637,32 +644,52 @@ handle_app_error(Term) ->
637644
end.
638645

639646
await_startup() ->
640-
case is_booting() of
641-
true -> wait_for_boot_to_finish();
647+
await_startup(node()).
648+
649+
await_startup(Node) ->
650+
case is_booting(Node) of
651+
true -> wait_for_boot_to_finish(Node);
642652
false ->
643-
case is_running() of
653+
case is_running(Node) of
644654
true -> ok;
645-
false -> wait_for_boot_to_start(),
646-
wait_for_boot_to_finish()
655+
false -> wait_for_boot_to_start(Node),
656+
wait_for_boot_to_finish(Node)
647657
end
648658
end.
649659

650-
is_booting() ->
651-
whereis(rabbit_boot) /= undefined.
660+
is_booting(Node) ->
661+
case rpc:call(Node, erlang, whereis, [rabbit_boot]) of
662+
{badrpc, _} = Err -> Err;
663+
undefined -> false;
664+
P when is_pid(P) -> true
665+
end.
652666

653-
wait_for_boot_to_start() ->
654-
case whereis(rabbit_boot) of
655-
undefined -> timer:sleep(100),
656-
wait_for_boot_to_start();
657-
_ -> ok
667+
wait_for_boot_to_start(Node) ->
668+
case is_booting(Node) of
669+
false ->
670+
timer:sleep(100),
671+
wait_for_boot_to_start(Node);
672+
{badrpc, _} = Err ->
673+
Err;
674+
true ->
675+
ok
658676
end.
659677

660-
wait_for_boot_to_finish() ->
661-
case whereis(rabbit_boot) of
662-
undefined -> true = is_running(),
663-
ok;
664-
_ -> timer:sleep(100),
665-
wait_for_boot_to_finish()
678+
wait_for_boot_to_finish(Node) ->
679+
case is_booting(Node) of
680+
false ->
681+
%% We don't want badrpc error to be interpreted as false,
682+
%% so we don't call rabbit:is_running(Node)
683+
case rpc:call(Node, rabbit, is_running, []) of
684+
true -> ok;
685+
false -> {error, rabbit_is_not_running};
686+
{badrpc, _} = Err -> Err
687+
end;
688+
{badrpc, _} = Err ->
689+
Err;
690+
true ->
691+
timer:sleep(100),
692+
wait_for_boot_to_finish(Node)
666693
end.
667694

668695
status() ->

test/unit_SUITE.erl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ do_decrypt_start_app(Config, Passphrase) ->
332332
%%
333333
%% We expect a failure *after* the decrypting has been done.
334334
try
335-
rabbit:start_apps([rabbit_shovel_test])
335+
rabbit:start_apps([rabbit_shovel_test], #{rabbit => temporary})
336336
catch _:_ ->
337337
ok
338338
end,
@@ -359,7 +359,7 @@ decrypt_start_app_undefined(Config) ->
359359
%%
360360
%% We expect a failure during decryption because the passphrase is missing.
361361
try
362-
rabbit:start_apps([rabbit_shovel_test])
362+
rabbit:start_apps([rabbit_shovel_test], #{rabbit => temporary})
363363
catch
364364
exit:{bad_configuration, config_entry_decoder} -> ok;
365365
_:_ -> exit(unexpected_exception)
@@ -379,7 +379,7 @@ decrypt_start_app_wrong_passphrase(Config) ->
379379
%%
380380
%% We expect a failure during decryption because the passphrase is wrong.
381381
try
382-
rabbit:start_apps([rabbit_shovel_test])
382+
rabbit:start_apps([rabbit_shovel_test], #{rabbit => temporary})
383383
catch
384384
exit:{decryption_error,_,_} -> ok;
385385
_:_ -> exit(unexpected_exception)

0 commit comments

Comments
 (0)