Skip to content

Commit ce9c33a

Browse files
authored
Merge pull request #10904 from rabbitmq/peer-disc-temporary-nodes-and-inetrc
rabbit_peer_discovery: Pass inetrc config file to temporary hidden node
2 parents 4ec33c8 + dbf9dfb commit ce9c33a

File tree

5 files changed

+460
-34
lines changed

5 files changed

+460
-34
lines changed

deps/rabbit/BUILD.bazel

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,11 @@ rabbitmq_integration_suite(
576576
size = "medium",
577577
)
578578

579+
rabbitmq_integration_suite(
580+
name = "peer_discovery_tmp_hidden_node_SUITE",
581+
size = "large",
582+
)
583+
579584
rabbitmq_integration_suite(
580585
name = "per_user_connection_channel_limit_partitions_SUITE",
581586
size = "large",

deps/rabbit/app.bzl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,6 +1154,15 @@ def test_suite_beam_files(name = "test_suite_beam_files"):
11541154
erlc_opts = "//:test_erlc_opts",
11551155
deps = ["//deps/amqp_client:erlang_app"],
11561156
)
1157+
erlang_bytecode(
1158+
name = "peer_discovery_tmp_hidden_node_SUITE_beam_files",
1159+
testonly = True,
1160+
srcs = ["test/peer_discovery_tmp_hidden_node_SUITE.erl"],
1161+
outs = ["test/peer_discovery_tmp_hidden_node_SUITE.beam"],
1162+
app_name = "rabbit",
1163+
erlc_opts = "//:test_erlc_opts",
1164+
deps = ["//deps/amqp_client:erlang_app", "//deps/rabbitmq_ct_helpers:erlang_app"],
1165+
)
11571166
erlang_bytecode(
11581167
name = "per_user_connection_channel_limit_SUITE_beam_files",
11591168
testonly = True,

deps/rabbit/src/rabbit_peer_discovery.erl

Lines changed: 63 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@
3030
group_leader_proxy/2]).
3131

3232
-ifdef(TEST).
33-
-export([sort_nodes_and_props/1,
33+
-export([query_node_props/1,
34+
sort_nodes_and_props/1,
3435
join_selected_node/3]).
3536
-endif.
3637

@@ -388,16 +389,19 @@ query_node_props(Nodes) when Nodes =/= [] ->
388389
_ ->
389390
VMArgs1
390391
end,
391-
VMArgs3 = maybe_add_tls_arguments(VMArgs2),
392+
VMArgs3 = maybe_add_proto_dist_arguments(VMArgs2),
393+
VMArgs4 = maybe_add_inetrc_arguments(VMArgs3),
394+
VMArgs5 = maybe_add_tls_arguments(VMArgs4),
395+
PeerStartArg0 = #{name => PeerName,
396+
args => VMArgs5,
397+
connection => standard_io,
398+
wait_boot => infinity},
392399
PeerStartArg = case Context of
393400
#{nodename_type := longnames} ->
394-
#{name => PeerName,
395-
host => Suffix,
396-
longnames => true,
397-
args => VMArgs3};
401+
PeerStartArg0#{host => Suffix,
402+
longnames => true};
398403
_ ->
399-
#{name => PeerName,
400-
args => VMArgs3}
404+
PeerStartArg0
401405
end,
402406
?LOG_DEBUG("Peer discovery: peer node arguments: ~tp",
403407
[PeerStartArg]),
@@ -409,7 +413,7 @@ query_node_props(Nodes) when Nodes =/= [] ->
409413
[Peer],
410414
#{domain => ?RMQLOG_DOMAIN_PEER_DISC}),
411415
try
412-
erpc:call(Peer, ?MODULE, do_query_node_props, [Nodes])
416+
peer:call(Pid, ?MODULE, do_query_node_props, [Nodes], 180000)
413417
after
414418
peer:stop(Pid)
415419
end;
@@ -423,27 +427,40 @@ query_node_props(Nodes) when Nodes =/= [] ->
423427
query_node_props([]) ->
424428
[].
425429

426-
maybe_add_tls_arguments(VMArgs0) ->
430+
maybe_add_proto_dist_arguments(VMArgs) ->
427431
case init:get_argument(proto_dist) of
428-
{ok, [["inet_tls"]]} ->
429-
add_tls_arguments(inet_tls, VMArgs0);
430-
{ok, [["inet6_tls"]]} ->
431-
add_tls_arguments(inet6_tls, VMArgs0);
432+
{ok, [[Val]]} ->
433+
%% See net_kernel.erl / protocol_childspecs/1.
434+
Mod = list_to_existing_atom(Val ++ "_dist"),
435+
ModDir = filename:dirname(code:which(Mod)),
436+
["-proto_dist", Val, "-pa", ModDir | VMArgs];
432437
_ ->
433-
VMArgs0
438+
VMArgs
434439
end.
435440

436-
add_tls_arguments(InetDistModule, VMArgs0) ->
437-
VMArgs1 = case InetDistModule of
438-
inet_tls ->
439-
ProtoDistArg = ["-proto_dist", "inet_tls" | VMArgs0],
440-
["-pa", filename:dirname(code:which(inet_tls_dist))
441-
| ProtoDistArg];
442-
inet6_tls ->
443-
ProtoDistArg = ["-proto_dist", "inet6_tls" | VMArgs0],
444-
["-pa", filename:dirname(code:which(inet6_tls_dist))
445-
| ProtoDistArg]
446-
end,
441+
maybe_add_inetrc_arguments(VMArgs) ->
442+
%% If an inetrc file is configured, we need to use it for the temporary
443+
%% hidden node too.
444+
case application:get_env(kernel, inetrc) of
445+
{ok, Val} ->
446+
maybe_add_inetrc_arguments1(VMArgs, Val);
447+
undefined ->
448+
case os:getenv("ERL_INETRC") of
449+
Val when is_list(Val) ->
450+
maybe_add_inetrc_arguments1(VMArgs, Val);
451+
false ->
452+
VMArgs
453+
end
454+
end.
455+
456+
maybe_add_inetrc_arguments1(VMArgs, Val) ->
457+
%% The filename argument must be passed as a quoted string so that the
458+
%% command line is correctly parsed as an Erlang string by the temporary
459+
%% hidden node.
460+
ValString = rabbit_misc:format("~0p", [Val]),
461+
["-kernel", "inetrc", ValString | VMArgs].
462+
463+
maybe_add_tls_arguments(VMArgs) ->
447464
%% In the next case, RabbitMQ has been configured with additional Erlang VM
448465
%% arguments such as this:
449466
%%
@@ -494,14 +511,14 @@ add_tls_arguments(InetDistModule, VMArgs0) ->
494511
%% "/usr/local/lib/erlang/lib/ssl-11.0.3/ebin",
495512
%% "-proto_dist","inet_tls","-boot",
496513
%% "no_dot_erlang","-hidden"],
497-
VMArgs2 = case init:get_argument(ssl_dist_opt) of
514+
VMArgs1 = case init:get_argument(ssl_dist_opt) of
498515
{ok, SslDistOpts0} ->
499516
SslDistOpts1 = [["-ssl_dist_opt" | SslDistOpt]
500517
|| SslDistOpt <- SslDistOpts0],
501518
SslDistOpts2 = lists:concat(SslDistOpts1),
502-
SslDistOpts2 ++ VMArgs1;
519+
SslDistOpts2 ++ VMArgs;
503520
_ ->
504-
VMArgs1
521+
VMArgs
505522
end,
506523
%% In the next case, RabbitMQ has been configured with additional Erlang VM
507524
%% arguments such as this:
@@ -511,13 +528,13 @@ add_tls_arguments(InetDistModule, VMArgs0) ->
511528
%%
512529
%% This code adds the `ssl_dist_optfile' argument to the peer node's
513530
%% argument list.
514-
VMArgs3 = case init:get_argument(ssl_dist_optfile) of
531+
VMArgs2 = case init:get_argument(ssl_dist_optfile) of
515532
{ok, [[SslDistOptfileArg]]} ->
516-
["-ssl_dist_optfile", SslDistOptfileArg | VMArgs2];
533+
["-ssl_dist_optfile", SslDistOptfileArg | VMArgs1];
517534
_ ->
518-
VMArgs2
535+
VMArgs1
519536
end,
520-
VMArgs3.
537+
VMArgs2.
521538

522539
do_query_node_props(Nodes) when Nodes =/= [] ->
523540
%% Make sure all log messages are forwarded from this temporary hidden
@@ -608,6 +625,10 @@ query_node_props1([], [], NodesAndProps, ProxyGroupLeader) ->
608625

609626
query_node_props2([{Node, Members} | Rest], NodesAndProps, ProxyGroupLeader) ->
610627
try
628+
erpc:call(
629+
Node, logger, debug,
630+
["Peer discovery: temporary hidden node '~ts' queries properties "
631+
"from node '~ts'", [node(), Node]]),
611632
StartTime = get_node_start_time(Node, microsecond, ProxyGroupLeader),
612633
IsReady = is_node_db_ready(Node, ProxyGroupLeader),
613634
NodeAndProps = {Node, Members, StartTime, IsReady},
@@ -638,6 +659,8 @@ query_node_props2([], NodesAndProps, ProxyGroupLeader) ->
638659
after 120_000 ->
639660
ok
640661
end,
662+
?assertEqual([], nodes()),
663+
?assert(length(NodesAndProps2) =< length(nodes(hidden))),
641664
NodesAndProps2.
642665

643666
-spec get_node_start_time(Node, Unit, ProxyGroupLeader) -> StartTime when
@@ -825,6 +848,13 @@ can_use_discovered_nodes(_DiscoveredNodes, []) ->
825848
%%
826849
%% @private
827850

851+
select_node_to_join([{Node, _Members, _StartTime, _IsReady} | _])
852+
when Node =:= node() ->
853+
?LOG_INFO(
854+
"Peer discovery: node '~ts' selected for auto-clustering",
855+
[Node],
856+
#{domain => ?RMQLOG_DOMAIN_PEER_DISC}),
857+
Node;
828858
select_node_to_join([{Node, _Members, _StartTime, IsReady} | _])
829859
when IsReady =/= false ->
830860
?LOG_INFO(

0 commit comments

Comments
 (0)