summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Klishin <mklishin@pivotal.io>2016-11-13 04:31:40 +0300
committerMichael Klishin <mklishin@pivotal.io>2016-11-13 04:31:40 +0300
commit77567c95c7d2a50acc9deaacb81fa793b6c1821f (patch)
tree15a0741748e0df616f87aa30542732dfc56d05c1
parent93876aef692a9ec0f7ba9fe693b32885e9b3c0e1 (diff)
downloadrabbitmq-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.erl14
-rw-r--r--src/rabbit_peer_discovery.erl53
-rw-r--r--src/rabbit_peer_discovery_dns.erl21
-rw-r--r--test/peer_discovery_dns_SUITE.erl4
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).