Skip to content

Commit cb288ab

Browse files
authored
Merge pull request #11647 from rabbitmq/mergify/bp/v3.13.x/pr-11045
rabbit_peer_discovery: Fixes and improvements for Consul and etcd (backport #11045)
2 parents 2af9b09 + 4108700 commit cb288ab

File tree

17 files changed

+911
-128
lines changed

17 files changed

+911
-128
lines changed

deps/rabbit/src/rabbit_db.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ init() ->
5252

5353
ensure_dir_exists(),
5454
rabbit_peer_discovery:maybe_init(),
55+
rabbit_peer_discovery:maybe_register(),
5556

5657
pre_init(IsVirgin),
5758

@@ -77,7 +78,6 @@ init() ->
7778
"DB: initialization successeful",
7879
#{domain => ?RMQLOG_DOMAIN_DB}),
7980

80-
rabbit_peer_discovery:maybe_register(),
8181
init_finished(),
8282

8383
ok;

deps/rabbit/src/rabbit_peer_discovery.erl

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,22 @@ sync_desired_cluster(Backend, RetriesLeft, RetryDelay) ->
186186
#{domain => ?RMQLOG_DOMAIN_PEER_DISC}),
187187
ok;
188188
{ok, {DiscoveredNodes, NodeType}} ->
189-
NodesAndProps = query_node_props(DiscoveredNodes),
190-
case can_use_discovered_nodes(DiscoveredNodes, NodesAndProps) of
189+
NodeAlreadySelected = is_atom(DiscoveredNodes),
190+
NodesAndProps = case NodeAlreadySelected of
191+
true ->
192+
?LOG_DEBUG(
193+
"Peer discovery: node '~ts' already "
194+
"selected by backend",
195+
[DiscoveredNodes],
196+
#{domain => ?RMQLOG_DOMAIN_PEER_DISC}),
197+
query_node_props([DiscoveredNodes]);
198+
false ->
199+
query_node_props(DiscoveredNodes)
200+
end,
201+
CanUse = (
202+
NodeAlreadySelected orelse
203+
can_use_discovered_nodes(DiscoveredNodes, NodesAndProps)),
204+
case CanUse of
191205
true ->
192206
case select_node_to_join(NodesAndProps) of
193207
SelectedNode when SelectedNode =/= false ->
@@ -249,8 +263,9 @@ retry_sync_desired_cluster(_Backend, 0, _RetryDelay) ->
249263
ok.
250264

251265
-spec discover_cluster_nodes() -> {ok, Discovery} when
252-
Discovery :: {DiscoveredNodes, NodeType},
266+
Discovery :: {DiscoveredNodes | SelectedNode, NodeType},
253267
DiscoveredNodes :: [node()],
268+
SelectedNode :: node(),
254269
NodeType :: rabbit_types:node_type().
255270
%% @doc Queries the peer discovery backend to discover nodes.
256271
%%
@@ -262,10 +277,11 @@ discover_cluster_nodes() ->
262277

263278
-spec discover_cluster_nodes(Backend) -> Ret when
264279
Backend :: backend(),
265-
Discovery :: {DiscoveredNodes, NodeType},
280+
Ret :: {ok, Discovery} | {error, Reason},
281+
Discovery :: {DiscoveredNodes | SelectedNode, NodeType},
266282
DiscoveredNodes :: [node()],
283+
SelectedNode :: node(),
267284
NodeType :: rabbit_types:node_type(),
268-
Ret :: {ok, Discovery} | {error, Reason},
269285
Reason :: any().
270286
%% @private
271287

@@ -295,7 +311,7 @@ discover_cluster_nodes(Backend) ->
295311

296312
-spec check_discovered_nodes_list_validity(DiscoveredNodes, NodeType) ->
297313
Ret when
298-
DiscoveredNodes :: [node()],
314+
DiscoveredNodes :: [node()] | node(),
299315
NodeType :: rabbit_types:node_type(),
300316
Ret :: ok.
301317
%% @private
@@ -310,6 +326,12 @@ check_discovered_nodes_list_validity(DiscoveredNodes, NodeType)
310326
[] -> ok;
311327
_ -> e({invalid_cluster_node_names, BadNodenames})
312328
end;
329+
check_discovered_nodes_list_validity(SelectedNode, NodeType)
330+
when NodeType =:= disc orelse NodeType =:= disk orelse NodeType =:= ram ->
331+
case is_atom(SelectedNode) of
332+
true -> ok;
333+
false -> e({invalid_cluster_node_names, SelectedNode})
334+
end;
313335
check_discovered_nodes_list_validity(DiscoveredNodes, BadNodeType)
314336
when is_list(DiscoveredNodes) ->
315337
e({invalid_cluster_node_type, BadNodeType}).
@@ -836,7 +858,7 @@ can_use_discovered_nodes(_DiscoveredNodes, []) ->
836858
false.
837859

838860
-spec select_node_to_join(NodesAndProps) -> SelectedNode when
839-
NodesAndProps :: [node_and_props()],
861+
NodesAndProps :: nonempty_list(node_and_props()),
840862
SelectedNode :: node() | false.
841863
%% @doc Selects the node to join among the sorted list of nodes.
842864
%%
@@ -1140,10 +1162,10 @@ unlock(Backend, Data) ->
11401162
{Nodes :: [node()],
11411163
NodeType :: rabbit_types:node_type()} |
11421164
{ok, Nodes :: [node()]} |
1143-
{ok, {Nodes :: [node()],
1165+
{ok, {Nodes :: [node()] | node(),
11441166
NodeType :: rabbit_types:node_type()}} |
11451167
{error, Reason :: string()}) ->
1146-
{ok, {Nodes :: [node()], NodeType :: rabbit_types:node_type()}} |
1168+
{ok, {Nodes :: [node()] | node(), NodeType :: rabbit_types:node_type()}} |
11471169
{error, Reason :: string()}.
11481170

11491171
normalize(Nodes) when is_list(Nodes) ->
@@ -1154,6 +1176,9 @@ normalize({ok, Nodes}) when is_list(Nodes) ->
11541176
{ok, {Nodes, disc}};
11551177
normalize({ok, {Nodes, NodeType}}) when is_list(Nodes) andalso is_atom(NodeType) ->
11561178
{ok, {Nodes, NodeType}};
1179+
normalize({ok, {Node, NodeType}})
1180+
when is_atom(Node) andalso is_atom(NodeType) ->
1181+
{ok, {Node, NodeType}};
11571182
normalize({error, Reason}) ->
11581183
{error, Reason}.
11591184

deps/rabbit_common/src/rabbit_peer_discovery_backend.erl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141

4242
-callback init() -> ok | {error, Reason :: string()}.
4343

44-
-callback list_nodes() -> {ok, {Nodes :: list(), NodeType :: rabbit_types:node_type()}} |
44+
-callback list_nodes() -> {ok, {Nodes :: [node()] | node(), NodeType :: rabbit_types:node_type()}} |
4545
{error, Reason :: string()}.
4646

4747
-callback supports_registration() -> boolean().
@@ -57,3 +57,8 @@
5757
-callback unlock(Data :: term()) -> ok.
5858

5959
-optional_callbacks([init/0]).
60+
61+
-export([api_version/0]).
62+
63+
api_version() ->
64+
2.

deps/rabbitmq_ct_helpers/src/rabbit_ct_helpers.erl

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -885,7 +885,10 @@ exec([Cmd | Args], Options) when is_list(Cmd) orelse is_binary(Cmd) ->
885885
Env1 = [
886886
begin
887887
Key1 = format_arg(Key),
888-
Value1 = format_arg(Value),
888+
Value1 = case Value of
889+
false -> false;
890+
_ -> format_arg(Value)
891+
end,
889892
Value2 = case is_binary(Value1) of
890893
true -> binary_to_list(Value1);
891894
false -> Value1
@@ -899,8 +902,10 @@ exec([Cmd | Args], Options) when is_list(Cmd) orelse is_binary(Cmd) ->
899902
| proplists:delete(env, PortOptions1)],
900903
Log ++ "~n~nEnvironment variables:~n" ++
901904
string:join(
902-
[rabbit_misc:format(" ~ts=~ts", [K, string:replace(V, "~", "~~", all)])
903-
|| {K, V} <- Env1],
905+
[rabbit_misc:format(
906+
" ~ts=~ts",
907+
[K, string:replace(V, "~", "~~", all)])
908+
|| {K, V} <- Env1, is_list(V) ],
904909
"~n")
905910
}
906911
end,

deps/rabbitmq_peer_discovery_consul/BUILD.bazel

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,11 @@ rabbitmq_integration_suite(
7979
name = "config_schema_SUITE",
8080
)
8181

82+
rabbitmq_integration_suite(
83+
name = "system_SUITE",
84+
size = "large",
85+
)
86+
8287
rabbitmq_suite(
8388
name = "rabbitmq_peer_discovery_consul_SUITE",
8489
size = "medium",

deps/rabbitmq_peer_discovery_consul/app.bzl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,15 @@ def test_suite_beam_files(name = "test_suite_beam_files"):
9999
app_name = "rabbitmq_peer_discovery_consul",
100100
erlc_opts = "//:test_erlc_opts",
101101
)
102+
erlang_bytecode(
103+
name = "system_SUITE_beam_files",
104+
testonly = True,
105+
srcs = ["test/system_SUITE.erl"],
106+
outs = ["test/system_SUITE.beam"],
107+
hdrs = [],
108+
app_name = "rabbitmq_peer_discovery_consul",
109+
erlc_opts = "//:test_erlc_opts",
110+
)
102111
erlang_bytecode(
103112
name = "rabbitmq_peer_discovery_consul_SUITE_beam_files",
104113
testonly = True,

deps/rabbitmq_peer_discovery_consul/include/rabbit_peer_discovery_consul.hrl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,11 @@
6969
env_variable = "CONSUL_SVC_ADDR_NODENAME",
7070
default_value = false
7171
},
72+
consul_svc_id => #peer_discovery_config_entry_meta{
73+
type = string,
74+
env_variable = "CONSUL_SVC_ID",
75+
default_value = "undefined"
76+
},
7277
consul_svc_port => #peer_discovery_config_entry_meta{
7378
type = integer,
7479
env_variable = "CONSUL_SVC_PORT",

deps/rabbitmq_peer_discovery_consul/priv/schema/rabbitmq_peer_discovery_consul.schema

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ fun(Conf) ->
140140
end}.
141141

142142

143-
%% use (Erlang) node name when compuing service address?
143+
%% use (Erlang) node name when computing service address?
144144

145145
{mapping, "cluster_formation.consul.svc_addr_use_nodename", "rabbit.cluster_formation.peer_discovery_consul.consul_svc_addr_nodename", [
146146
{datatype, {enum, [true, false]}}
@@ -155,6 +155,21 @@ fun(Conf) ->
155155
end}.
156156

157157

158+
%% service ID
159+
160+
{mapping, "cluster_formation.consul.svc_id", "rabbit.cluster_formation.peer_discovery_consul.consul_svc_id", [
161+
{datatype, string}
162+
]}.
163+
164+
{translation, "rabbit.cluster_formation.peer_discovery_consul.consul_svc_id",
165+
fun(Conf) ->
166+
case cuttlefish:conf_get("cluster_formation.consul.svc_id", Conf, undefined) of
167+
undefined -> cuttlefish:unset();
168+
Value -> Value
169+
end
170+
end}.
171+
172+
158173
%% (optionally) append a suffix to node names retrieved from Consul
159174

160175
{mapping, "cluster_formation.consul.domain_suffix", "rabbit.cluster_formation.peer_discovery_consul.consul_domain", [

0 commit comments

Comments
 (0)