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 =/= [] ->
423427query_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
522539do_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
609626query_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 ;
828858select_node_to_join ([{Node , _Members , _StartTime , IsReady } | _ ])
829859 when IsReady =/= false ->
830860 ? LOG_INFO (
0 commit comments