diff options
| author | Michael Klishin <mklishin@pivotal.io> | 2016-11-13 04:31:40 +0300 |
|---|---|---|
| committer | Michael Klishin <mklishin@pivotal.io> | 2016-11-13 04:31:40 +0300 |
| commit | 77567c95c7d2a50acc9deaacb81fa793b6c1821f (patch) | |
| tree | 15a0741748e0df616f87aa30542732dfc56d05c1 | |
| parent | 93876aef692a9ec0f7ba9fe693b32885e9b3c0e1 (diff) | |
| download | rabbitmq-server-git-77567c95c7d2a50acc9deaacb81fa793b6c1821f.tar.gz | |
Integrate DNS peer discovery backend, more logging
* Returned value must be a list of atoms
* Support more tuple types in normalize/1
* Update tests
| -rw-r--r-- | src/rabbit_mnesia.erl | 14 | ||||
| -rw-r--r-- | src/rabbit_peer_discovery.erl | 53 | ||||
| -rw-r--r-- | src/rabbit_peer_discovery_dns.erl | 21 | ||||
| -rw-r--r-- | test/peer_discovery_dns_SUITE.erl | 4 |
4 files changed, 66 insertions, 26 deletions
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl index 1ec9a46880..51deed8597 100644 --- a/src/rabbit_mnesia.erl +++ b/src/rabbit_mnesia.erl @@ -98,11 +98,10 @@ init() -> ensure_mnesia_dir(), case is_virgin_node() of true -> - rabbit_log:info("Database directory at ~s is empty. " + rabbit_log:info("Node database directory at ~s is empty. " "Assuming we need to join an existing cluster or initialise from scratch...~n", [dir()]), - rabbit_log:info("Using ~p as peer discovery backend~n", - [rabbit_peer_discovery:backend()]), + rabbit_peer_discovery:log_configured_backend(), init_from_config(); false -> NodeType = node_type(), @@ -141,7 +140,9 @@ init_from_config() -> e(invalid_cluster_nodes_conf) end, case DiscoveredNodes of - [] -> init_db_and_upgrade([node()], disc, false, _Retry = true); + [] -> + rabbit_log:info("Discovered no peer nodes to cluster with"), + init_db_and_upgrade([node()], disc, false, _Retry = true); _ -> rabbit_log:info("Discovered peer nodes: ~s~n", [rabbit_peer_discovery:format_discovered_nodes(DiscoveredNodes)]), @@ -158,8 +159,9 @@ auto_cluster(TryNodes, NodeType) -> rabbit_node_monitor:notify_joined_cluster(); none -> rabbit_log:warning( - "Could not find any node for auto-clustering from: ~p~n" - "Starting blank node...~n", [TryNodes]), + "Could not successfully contact any node of: ~s (as in Erlang distribution). " + "Starting as a blank standalone node...~n", + [string:join(lists:map(fun atom_to_list/1, TryNodes), ",")]), init_db_and_upgrade([node()], disc, false, _Retry = true) end. diff --git a/src/rabbit_peer_discovery.erl b/src/rabbit_peer_discovery.erl index e04df6a02d..c0b554e3b3 100644 --- a/src/rabbit_peer_discovery.erl +++ b/src/rabbit_peer_discovery.erl @@ -16,21 +16,53 @@ -module(rabbit_peer_discovery). +%% %% API --export([discover_cluster_nodes/0, backend/0, - normalize/1, format_discovered_nodes/1]). +%% + +-export([discover_cluster_nodes/0, backend/0, node_type/0, + normalize/1, format_discovered_nodes/1, log_configured_backend/0]). -export([append_node_prefix/1, node_prefix/0]). +-define(DEFAULT_BACKEND, rabbit_peer_discovery_classic_config). +%% what node type is used by default for this node when joining +%% a new cluster as a virgin node +-define(DEFAULT_NODE_TYPE, disc). +%% default node prefix to attach to discovered hostnames +-define(DEFAULT_PREFIX, "rabbit"). +-define(NODENAME_PART_SEPARATOR, "@"). + -spec backend() -> atom(). backend() -> - case application:get_env(rabbit, peer_discovery_backend) of - {ok, Backend} when is_atom(Backend) -> Backend; - undefined -> rabbit_peer_discovery_classic_config + case application:get_env(rabbit, autocluster) of + {ok, Proplist} -> + proplists:get_value(peer_discovery_backend, Proplist, ?DEFAULT_BACKEND); + undefined -> + ?DEFAULT_BACKEND + end. + + + +-spec node_type() -> rabbit_types:node_type(). + +node_type() -> + case application:get_env(rabbit, autocluster) of + {ok, Proplist} -> + proplists:get_value(node_type, Proplist, ?DEFAULT_NODE_TYPE); + undefined -> + ?DEFAULT_NODE_TYPE end. + +-spec log_configured_backend() -> ok. + +log_configured_backend() -> + rabbit_log:info("Configured peer discovery backend: ~s~n", [backend()]). + + -spec discover_cluster_nodes() -> {ok, Nodes :: list()} | {ok, {Nodes :: list(), NodeType :: rabbit_types:node_type()}} | {error, Reason :: string()}. @@ -40,11 +72,17 @@ discover_cluster_nodes() -> normalize(Backend:list_nodes()). --spec normalize({ok, Nodes :: list()} | +-spec normalize(Nodes :: list() | + {Nodes :: list(), NodeType :: rabbit_types:node_type()} | + {ok, Nodes :: list()} | {ok, {Nodes :: list(), NodeType :: rabbit_types:node_type()}} | {error, Reason :: string()}) -> {ok, {Nodes :: list(), NodeType :: rabbit_types:node_type()}} | {error, Reason :: string()}. +normalize(Nodes) when is_list(Nodes) -> + {ok, {Nodes, disc}}; +normalize({Nodes, NodeType}) when is_list(Nodes) andalso is_atom(NodeType) -> + {ok, {Nodes, NodeType}}; normalize({ok, Nodes}) when is_list(Nodes) -> {ok, {Nodes, disc}}; normalize({ok, {Nodes, NodeType}}) when is_list(Nodes) andalso is_atom(NodeType) -> @@ -59,9 +97,6 @@ format_discovered_nodes(Nodes) -> string:join(lists:map(fun (Val) -> hd(io_lib:format("~s", [Val])) end, Nodes), ", "). --define(DEFAULT_PREFIX, "rabbit"). --define(NODENAME_PART_SEPARATOR, "@"). - -spec node_prefix() -> string(). diff --git a/src/rabbit_peer_discovery_dns.erl b/src/rabbit_peer_discovery_dns.erl index 8656a9523f..53a10333b0 100644 --- a/src/rabbit_peer_discovery_dns.erl +++ b/src/rabbit_peer_discovery_dns.erl @@ -37,9 +37,8 @@ list_nodes() -> undefined -> io:format("rabbit.autocluster.peer_discovery_dns~n", []), {[], disc}; Proplist -> Hostname = rabbit_data_coercion:to_list(proplists:get_value(hostname, Proplist)), - NodeType = proplists:get_value(node_type, Autocluster, disc), - {discover_nodes(Hostname, net_kernel:longnames()), NodeType} + {discover_nodes(Hostname, net_kernel:longnames()), rabbit_peer_discovery:node_type()} end end. @@ -59,21 +58,25 @@ unregister() -> %% discover_nodes(SeedHostname, LongNamesUsed) -> - [rabbit_peer_discovery:append_node_prefix(H) || + [list_to_atom(rabbit_peer_discovery:append_node_prefix(H)) || H <- discover_hostnames(SeedHostname, LongNamesUsed)]. discover_hostnames(SeedHostname, LongNamesUsed) -> %% TODO: IPv6 support - Hosts = [extract_host(inet_res:gethostbyaddr(A), LongNamesUsed) || - A <- inet_res:lookup(SeedHostname, in, a)], + IPs = inet_res:lookup(SeedHostname, in, a), + rabbit_log:info("Addresses discovered via A records of ~s: ~s", + [SeedHostname, string:join([inet_parse:ntoa(IP) || IP <- IPs], ", ")]), + Hosts = [extract_host(inet_res:gethostbyaddr(A), LongNamesUsed, A) || + A <- IPs], lists:filter(fun(E) -> E =/= error end, Hosts). %% long node names are used -extract_host({ok, {hostent, FQDN, _, _, _, _}}, true) -> +extract_host({ok, {hostent, FQDN, _, _, _, _}}, true, _Address) -> FQDN; %% short node names are used -extract_host({ok, {hostent, FQDN, _, _, _, _}}, false) -> +extract_host({ok, {hostent, FQDN, _, _, _, _}}, false, _Address) -> lists:nth(1, string:tokens(FQDN, ".")); -extract_host(Error, _) -> - rabbit_log:error("DNS peer discovery failed: ~p", [Error]), +extract_host({error, Error}, _, Address) -> + rabbit_log:error("Reverse DNS lookup for address ~s failed: ~p", + [inet_parse:ntoa(Address), Error]), error. diff --git a/test/peer_discovery_dns_SUITE.erl b/test/peer_discovery_dns_SUITE.erl index 80bb2f8de6..da01aeebdd 100644 --- a/test/peer_discovery_dns_SUITE.erl +++ b/test/peer_discovery_dns_SUITE.erl @@ -95,8 +95,8 @@ hostname_discovery_with_short_node_names(_) -> node_discovery_with_long_node_names(_) -> Result = rabbit_peer_discovery_dns:discover_nodes(?DISCOVERY_ENDPOINT, true), - ?assertEqual(["ct_rabbit@www.rabbitmq.com"], Result). + ?assertEqual(['ct_rabbit@www.rabbitmq.com'], Result). node_discovery_with_short_node_names(_) -> Result = rabbit_peer_discovery_dns:discover_nodes(?DISCOVERY_ENDPOINT, false), - ?assertEqual(["ct_rabbit@www"], Result). + ?assertEqual([ct_rabbit@www], Result). |
