11
11
12
12
-include_lib (" rabbit_common/include/logging.hrl" ).
13
13
14
- -export ([join /2 ,
14
+ -export ([ensure_feature_flags_are_in_sync /2 ,
15
+ join /2 ,
15
16
forget_member /2 ]).
16
17
-export ([change_node_type /1 ]).
17
18
-export ([is_clustered /0 ,
18
19
members /0 ,
19
20
disc_members /0 ,
20
21
node_type /0 ,
22
+ check_compatibility /1 ,
21
23
check_consistency /0 ,
22
24
cli_cluster_status /0 ]).
23
25
35
37
% % Cluster formation.
36
38
% % -------------------------------------------------------------------
37
39
40
+ ensure_feature_flags_are_in_sync (Nodes , NodeIsVirgin ) ->
41
+ Ret = rabbit_feature_flags :sync_feature_flags_with_cluster (
42
+ Nodes , NodeIsVirgin ),
43
+ case Ret of
44
+ ok -> ok ;
45
+ {error , Reason } -> throw ({error , {incompatible_feature_flags , Reason }})
46
+ end .
47
+
48
+ -spec can_join (RemoteNode ) -> Ret when
49
+ RemoteNode :: node (),
50
+ Ret :: Ok | Error ,
51
+ Ok :: {ok , [node ()]} | {ok , already_member },
52
+ Error :: {error , {inconsistent_cluster , string ()}}.
53
+
54
+ can_join (RemoteNode ) ->
55
+ ? LOG_INFO (
56
+ " DB: checking if `~ts ` can join cluster using remote node `~ts `" ,
57
+ [node (), RemoteNode ],
58
+ #{domain => ? RMQLOG_DOMAIN_DB }),
59
+ case rabbit_feature_flags :check_node_compatibility (RemoteNode ) of
60
+ ok ->
61
+ rabbit_db :run (
62
+ #{mnesia => fun () -> can_join_using_mnesia (RemoteNode ) end });
63
+ Error ->
64
+ Error
65
+ end .
66
+
67
+ can_join_using_mnesia (RemoteNode ) ->
68
+ rabbit_mnesia :can_join_cluster (RemoteNode ).
69
+
38
70
-spec join (RemoteNode , NodeType ) -> Ret when
39
71
RemoteNode :: node (),
40
72
NodeType :: rabbit_db_cluster :node_type (),
45
77
46
78
join (RemoteNode , NodeType )
47
79
when is_atom (RemoteNode ) andalso ? IS_NODE_TYPE (NodeType ) ->
48
- ? LOG_DEBUG (
49
- " DB: joining cluster using remote node `~ts `" , [RemoteNode ],
50
- #{domain => ? RMQLOG_DOMAIN_DB }),
51
- join_using_mnesia (RemoteNode , NodeType ).
80
+ case can_join (RemoteNode ) of
81
+ {ok , ClusterNodes } when is_list (ClusterNodes ) ->
82
+ rabbit_db :reset (),
83
+
84
+ ? LOG_INFO (
85
+ " DB: joining cluster using remote nodes:~n~tp " , [ClusterNodes ],
86
+ #{domain => ? RMQLOG_DOMAIN_DB }),
87
+ Ret = rabbit_db :run (
88
+ #{mnesia =>
89
+ fun () -> join_using_mnesia (ClusterNodes , NodeType ) end }),
90
+ case Ret of
91
+ ok ->
92
+ rabbit_node_monitor :notify_joined_cluster (),
93
+ ok ;
94
+ {error , _ } = Error ->
95
+ Error
96
+ end ;
97
+ {ok , already_member } ->
98
+ {ok , already_member };
99
+ {error , _ } = Error ->
100
+ Error
101
+ end .
52
102
53
- join_using_mnesia (RemoteNode , NodeType ) ->
54
- rabbit_mnesia :join_cluster (RemoteNode , NodeType ).
103
+ join_using_mnesia (ClusterNodes , NodeType ) when is_list ( ClusterNodes ) ->
104
+ rabbit_mnesia :join_cluster (ClusterNodes , NodeType ).
55
105
56
106
-spec forget_member (Node , RemoveWhenOffline ) -> ok when
57
107
Node :: node (),
58
108
RemoveWhenOffline :: boolean ().
59
109
% % @doc Removes `Node' from the cluster.
60
110
61
111
forget_member (Node , RemoveWhenOffline ) ->
62
- forget_member_using_mnesia (Node , RemoveWhenOffline ).
112
+ rabbit_db :run (
113
+ #{mnesia =>
114
+ fun () -> forget_member_using_mnesia (Node , RemoveWhenOffline ) end }).
63
115
64
116
forget_member_using_mnesia (Node , RemoveWhenOffline ) ->
65
117
rabbit_mnesia :forget_cluster_node (Node , RemoveWhenOffline ).
@@ -75,7 +127,8 @@ forget_member_using_mnesia(Node, RemoveWhenOffline) ->
75
127
% % Node types may not all be valid with all databases.
76
128
77
129
change_node_type (NodeType ) ->
78
- change_node_type_using_mnesia (NodeType ).
130
+ rabbit_db :run (
131
+ #{mnesia => fun () -> change_node_type_using_mnesia (NodeType ) end }).
79
132
80
133
change_node_type_using_mnesia (NodeType ) ->
81
134
rabbit_mnesia :change_cluster_node_type (NodeType ).
@@ -89,7 +142,8 @@ change_node_type_using_mnesia(NodeType) ->
89
142
% % @doc Indicates if this node is clustered with other nodes or not.
90
143
91
144
is_clustered () ->
92
- is_clustered_using_mnesia ().
145
+ rabbit_db :run (
146
+ #{mnesia => fun is_clustered_using_mnesia /0 }).
93
147
94
148
is_clustered_using_mnesia () ->
95
149
rabbit_mnesia :is_clustered ().
@@ -99,7 +153,8 @@ is_clustered_using_mnesia() ->
99
153
% % @doc Returns the list of cluster members.
100
154
101
155
members () ->
102
- members_using_mnesia ().
156
+ rabbit_db :run (
157
+ #{mnesia => fun members_using_mnesia /0 }).
103
158
104
159
members_using_mnesia () ->
105
160
case rabbit_mnesia :is_running () andalso rabbit_table :is_present () of
@@ -127,7 +182,8 @@ members_using_mnesia() ->
127
182
% % @private
128
183
129
184
disc_members () ->
130
- disc_members_using_mnesia ().
185
+ rabbit_db :run (
186
+ #{mnesia => fun disc_members_using_mnesia /0 }).
131
187
132
188
disc_members_using_mnesia () ->
133
189
rabbit_mnesia :cluster_nodes (disc ).
@@ -139,16 +195,37 @@ disc_members_using_mnesia() ->
139
195
% % Node types may not all be relevant with all databases.
140
196
141
197
node_type () ->
142
- node_type_using_mnesia ().
198
+ rabbit_db :run (
199
+ #{mnesia => fun node_type_using_mnesia /0 }).
143
200
144
201
node_type_using_mnesia () ->
145
202
rabbit_mnesia :node_type ().
146
203
204
+ -spec check_compatibility (RemoteNode ) -> ok | {error , Reason } when
205
+ RemoteNode :: node (),
206
+ Reason :: any ().
207
+ % % @doc Ensures the given remote node is compatible with the node calling this
208
+ % % function.
209
+
210
+ check_compatibility (RemoteNode ) ->
211
+ case rabbit_feature_flags :check_node_compatibility (RemoteNode ) of
212
+ ok ->
213
+ rabbit_db :run (
214
+ #{mnesia =>
215
+ fun () -> check_compatibility_using_mnesia (RemoteNode ) end });
216
+ Error ->
217
+ Error
218
+ end .
219
+
220
+ check_compatibility_using_mnesia (RemoteNode ) ->
221
+ rabbit_mnesia :check_mnesia_consistency (RemoteNode ).
222
+
147
223
-spec check_consistency () -> ok .
148
224
% % @doc Ensures the cluster is consistent.
149
225
150
226
check_consistency () ->
151
- check_consistency_using_mnesia ().
227
+ rabbit_db :run (
228
+ #{mnesia => fun check_consistency_using_mnesia /0 }).
152
229
153
230
check_consistency_using_mnesia () ->
154
231
rabbit_mnesia :check_cluster_consistency ().
@@ -161,7 +238,8 @@ check_consistency_using_mnesia() ->
161
238
% % command.
162
239
163
240
cli_cluster_status () ->
164
- cli_cluster_status_using_mnesia ().
241
+ rabbit_db :run (
242
+ #{mnesia => fun cli_cluster_status_using_mnesia /0 }).
165
243
166
244
cli_cluster_status_using_mnesia () ->
167
245
rabbit_mnesia :status ().
0 commit comments