Skip to content

Commit 5157f25

Browse files
authored
Merge pull request #9797 from rabbitmq/use-join_cluster-in-peer-discovery
rabbit_peer_discovery: Rewrite the core logic
2 parents 934337e + e1261b9 commit 5157f25

24 files changed

+1235
-465
lines changed

deps/rabbit/BUILD.bazel

+8
Original file line numberDiff line numberDiff line change
@@ -958,6 +958,14 @@ rabbitmq_suite(
958958
],
959959
)
960960

961+
rabbitmq_suite(
962+
name = "unit_cluster_formation_sort_nodes_SUITE",
963+
size = "small",
964+
deps = [
965+
"@meck//:erlang_app",
966+
],
967+
)
968+
961969
rabbitmq_suite(
962970
name = "unit_collections_SUITE",
963971
size = "small",

deps/rabbit/app.bzl

+8
Original file line numberDiff line numberDiff line change
@@ -1735,6 +1735,14 @@ def test_suite_beam_files(name = "test_suite_beam_files"):
17351735
app_name = "rabbit",
17361736
erlc_opts = "//:test_erlc_opts",
17371737
)
1738+
erlang_bytecode(
1739+
name = "unit_cluster_formation_sort_nodes_SUITE_beam_files",
1740+
testonly = True,
1741+
srcs = ["test/unit_cluster_formation_sort_nodes_SUITE.erl"],
1742+
outs = ["test/unit_cluster_formation_sort_nodes_SUITE.beam"],
1743+
app_name = "rabbit",
1744+
erlc_opts = "//:test_erlc_opts",
1745+
)
17381746
erlang_bytecode(
17391747
name = "unit_collections_SUITE_beam_files",
17401748
testonly = True,

deps/rabbit/src/rabbit_db.erl

+13-8
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,22 @@ init() ->
5151
#{domain => ?RMQLOG_DOMAIN_DB}),
5252

5353
ensure_dir_exists(),
54-
rabbit_peer_discovery:log_configured_backend(),
5554
rabbit_peer_discovery:maybe_init(),
5655

5756
pre_init(IsVirgin),
5857

58+
case IsVirgin of
59+
true ->
60+
%% At this point, the database backend could change if the node
61+
%% joins a cluster and that cluster uses a different database.
62+
?LOG_INFO(
63+
"DB: virgin node -> run peer discovery",
64+
#{domain => ?RMQLOG_DOMAIN_DB}),
65+
rabbit_peer_discovery:sync_desired_cluster();
66+
false ->
67+
ok
68+
end,
69+
5970
Ret = case rabbit_khepri:is_enabled() of
6071
true -> init_using_khepri();
6172
false -> init_using_mnesia()
@@ -66,8 +77,8 @@ init() ->
6677
"DB: initialization successeful",
6778
#{domain => ?RMQLOG_DOMAIN_DB}),
6879

80+
rabbit_peer_discovery:maybe_register(),
6981
init_finished(),
70-
post_init(IsVirgin),
7182

7283
ok;
7384
Error ->
@@ -82,12 +93,6 @@ pre_init(IsVirgin) ->
8293
OtherMembers = rabbit_nodes:nodes_excl_me(Members),
8394
rabbit_db_cluster:ensure_feature_flags_are_in_sync(OtherMembers, IsVirgin).
8495

85-
post_init(false = _IsVirgin) ->
86-
rabbit_peer_discovery:maybe_register();
87-
post_init(true = _IsVirgin) ->
88-
%% Registration handled by rabbit_peer_discovery.
89-
ok.
90-
9196
init_using_mnesia() ->
9297
?LOG_DEBUG(
9398
"DB: initialize Mnesia",

deps/rabbit/src/rabbit_mnesia.erl

+6-23
Original file line numberDiff line numberDiff line change
@@ -114,13 +114,13 @@
114114
init() ->
115115
ensure_mnesia_running(),
116116
ensure_mnesia_dir(),
117+
%% Peer discovery may have been a no-op if it decided that all other nodes
118+
%% should join this one. Therefore, we need to look at if this node is
119+
%% still virgin and finish our init of Mnesia accordingly. In particular,
120+
%% this second part crates all our Mnesia tables.
117121
case is_virgin_node() of
118-
true ->
119-
rabbit_log:info("Node database directory at ~ts is empty. "
120-
"Assuming we need to join an existing cluster or initialise from scratch...",
121-
[dir()]),
122-
rabbit_peer_discovery:maybe_create_cluster(
123-
fun create_cluster_callback/2);
122+
true ->
123+
init_db_and_upgrade([node()], disc, true, _Retry = true);
124124
false ->
125125
NodeType = node_type(),
126126
case is_node_type_permitted(NodeType) of
@@ -141,23 +141,6 @@ init() ->
141141
ok = rabbit_node_monitor:global_sync(),
142142
ok.
143143

144-
create_cluster_callback(none, NodeType) ->
145-
DiscNodes = [node()],
146-
NodeType1 = case is_node_type_permitted(NodeType) of
147-
false -> disc;
148-
true -> NodeType
149-
end,
150-
init_db_and_upgrade(DiscNodes, NodeType1, true, _Retry = true),
151-
ok;
152-
create_cluster_callback(RemoteNode, NodeType) ->
153-
{ok, {_, DiscNodes, _}} = discover_cluster0(RemoteNode),
154-
NodeType1 = case is_node_type_permitted(NodeType) of
155-
false -> disc;
156-
true -> NodeType
157-
end,
158-
init_db_and_upgrade(DiscNodes, NodeType1, true, _Retry = true),
159-
ok.
160-
161144
%% Make the node join a cluster. The node will be reset automatically
162145
%% before we actually cluster it. The nodes provided will be used to
163146
%% find out about the nodes in the cluster.

0 commit comments

Comments
 (0)