From 6249b5b317a163333fd4135ad3213112d126f202 Mon Sep 17 00:00:00 2001 From: Timofey Barmin Date: Mon, 22 Feb 2021 17:21:01 -0800 Subject: [PATCH] MB-50289: Refactor cb_epmd:port_please code in order to ... ... 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 Reviewed-by: Timofey Barmin Well-Formed: Restriction Checker --- src/cb_dist.erl | 4 +++- src/cb_epmd.erl | 45 ++++++++++++++++++++++++++++++++------------- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/cb_dist.erl b/src/cb_dist.erl index c27c272ddc..c66569265d 100644 --- a/src/cb_dist.erl +++ b/src/cb_dist.erl @@ -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, diff --git a/src/cb_epmd.erl b/src/cb_epmd.erl index 8f8383eeb7..052865b35b 100644 --- a/src/cb_epmd.erl +++ b/src/cb_epmd.erl @@ -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 @@ -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