Skip to content

Commit

Permalink
MB-50289: Refactor cb_epmd:port_please code in order to ...
Browse files Browse the repository at this point in the history
... make it possible to get the port for an arbitrary address family
and encryption setting. Introduce cb_epmd:get_port/4 function.

port_please is used by dist modules for geting the port of a remote
node for currently cofigured settings (afamily and encryption).
But for self testing purposes we want to be able to extract TLS port
of a node even when encryption is disabled, and vise versa,
to extract TCP port when encryption is enabled.

Reviewed-on: http://review.couchbase.org/c/ns_server/+/146779
Change-Id: I540f8fcda4ec107011b8054e11e1447389c1ecbe
Reviewed-on: https://review.couchbase.org/c/ns_server/+/168559
Tested-by: Abhijeeth Nuthan <abhijeeth.nuthan@couchbase.com>
Reviewed-by: Timofey Barmin <timofey.barmin@couchbase.com>
Well-Formed: Restriction Checker
  • Loading branch information
timofey-barmin authored and anuthan committed Jan 12, 2022
1 parent 1e39487 commit 6249b5b
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 14 deletions.
4 changes: 3 additions & 1 deletion src/cb_dist.erl
Expand Up @@ -42,7 +42,9 @@
proto_to_encryption/1,
format_error/1,
netsettings2str/1,
restart_tls/0]).
restart_tls/0,
netsettings2proto/1,
proto2netsettings/1]).

%% gen_server callbacks
-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
Expand Down
45 changes: 32 additions & 13 deletions src/cb_epmd.erl
Expand Up @@ -25,7 +25,8 @@
%% External exports
-export([start/0, start_link/0, stop/0, port_for_node/2, port_please/2,
port_please/3, names/0, names/1,
register_node/2, register_node/3, is_local_node/1, node_type/1]).
register_node/2, register_node/3, is_local_node/1, node_type/1,
get_port/4]).

%%%----------------------------------------------------------------------
%%% API
Expand All @@ -48,24 +49,42 @@ port_please(Node, Hostname) ->
port_please(Node, Hostname, infinity).

port_please(NodeStr, Hostname, Timeout) ->
try {cb_dist:get_preferred_dist(NodeStr), node_type(NodeStr)} of
try cb_dist:get_preferred_dist(NodeStr) of
Module ->
{AFamily, Encryption} = cb_dist:proto2netsettings(Module),
get_port(NodeStr, Hostname, AFamily, Encryption, Timeout)
catch
error:Error ->
{error, Error}
end.

get_port(Node, AFamily, Encryption, Timeout) ->
{Name, Host} = misc:node_name_host(Node),
get_port(Name, Host, AFamily, Encryption, Timeout).

get_port(NodeName, NodeHost, AFamily, Encryption, Timeout) ->
Module = cb_dist:netsettings2proto({AFamily, Encryption}),
try {node_type(NodeName), Encryption} of
%% needed for backward compat: old ns_server nodes use dynamic
%% ports so the only way to know those ports is to ask real epmd
%% for this reason we also keep registering new static ports on
%% epmd because old nodes doesn't know anything about those
%% ports
{Module, ns_server} when Module == inet_tcp_dist;
Module == inet6_tcp_dist ->
case erl_epmd:port_please(NodeStr, Hostname, Timeout) of
{port, _, _} = R -> R;
_ ->
case port_for_node(Module, NodeStr) of
noport -> noport;
P -> {port, P, 5}
end
{ns_server, false} ->
case inet:getaddr(NodeHost, AFamily) of
{ok, IpAddr} ->
case erl_epmd:port_please(NodeName, IpAddr, Timeout) of
{port, _, _} = R -> R;
_ ->
case port_for_node(Module, NodeName) of
noport -> noport;
P -> {port, P, 5}
end
end;
{error, _} = Error -> Error
end;
{Module, _} ->
case port_for_node(Module, NodeStr) of
{_, _} ->
case port_for_node(Module, NodeName) of
noport -> noport;
P -> {port, P, 5}
end
Expand Down

0 comments on commit 6249b5b

Please sign in to comment.