@@ -45,6 +45,28 @@ ensure_feature_flags_are_in_sync(Nodes, NodeIsVirgin) ->
45
45
{error , Reason } -> throw ({error , {incompatible_feature_flags , Reason }})
46
46
end .
47
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
+
48
70
-spec join (RemoteNode , NodeType ) -> Ret when
49
71
RemoteNode :: node (),
50
72
NodeType :: rabbit_db_cluster :node_type (),
@@ -55,21 +77,41 @@ ensure_feature_flags_are_in_sync(Nodes, NodeIsVirgin) ->
55
77
56
78
join (RemoteNode , NodeType )
57
79
when is_atom (RemoteNode ) andalso ? IS_NODE_TYPE (NodeType ) ->
58
- ? LOG_DEBUG (
59
- " DB: joining cluster using remote node `~ts `" , [RemoteNode ],
60
- #{domain => ? RMQLOG_DOMAIN_DB }),
61
- 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 .
62
102
63
- join_using_mnesia (RemoteNode , NodeType ) ->
64
- rabbit_mnesia :join_cluster (RemoteNode , NodeType ).
103
+ join_using_mnesia (ClusterNodes , NodeType ) when is_list ( ClusterNodes ) ->
104
+ rabbit_mnesia :join_cluster (ClusterNodes , NodeType ).
65
105
66
106
-spec forget_member (Node , RemoveWhenOffline ) -> ok when
67
107
Node :: node (),
68
108
RemoveWhenOffline :: boolean ().
69
109
% % @doc Removes `Node' from the cluster.
70
110
71
111
forget_member (Node , RemoveWhenOffline ) ->
72
- forget_member_using_mnesia (Node , RemoveWhenOffline ).
112
+ rabbit_db :run (
113
+ #{mnesia =>
114
+ fun () -> forget_member_using_mnesia (Node , RemoveWhenOffline ) end }).
73
115
74
116
forget_member_using_mnesia (Node , RemoveWhenOffline ) ->
75
117
rabbit_mnesia :forget_cluster_node (Node , RemoveWhenOffline ).
@@ -85,7 +127,8 @@ forget_member_using_mnesia(Node, RemoveWhenOffline) ->
85
127
% % Node types may not all be valid with all databases.
86
128
87
129
change_node_type (NodeType ) ->
88
- change_node_type_using_mnesia (NodeType ).
130
+ rabbit_db :run (
131
+ #{mnesia => fun () -> change_node_type_using_mnesia (NodeType ) end }).
89
132
90
133
change_node_type_using_mnesia (NodeType ) ->
91
134
rabbit_mnesia :change_cluster_node_type (NodeType ).
@@ -99,7 +142,8 @@ change_node_type_using_mnesia(NodeType) ->
99
142
% % @doc Indicates if this node is clustered with other nodes or not.
100
143
101
144
is_clustered () ->
102
- is_clustered_using_mnesia ().
145
+ rabbit_db :run (
146
+ #{mnesia => fun is_clustered_using_mnesia /0 }).
103
147
104
148
is_clustered_using_mnesia () ->
105
149
rabbit_mnesia :is_clustered ().
@@ -109,7 +153,8 @@ is_clustered_using_mnesia() ->
109
153
% % @doc Returns the list of cluster members.
110
154
111
155
members () ->
112
- members_using_mnesia ().
156
+ rabbit_db :run (
157
+ #{mnesia => fun members_using_mnesia /0 }).
113
158
114
159
members_using_mnesia () ->
115
160
case rabbit_mnesia :is_running () andalso rabbit_table :is_present () of
@@ -137,7 +182,8 @@ members_using_mnesia() ->
137
182
% % @private
138
183
139
184
disc_members () ->
140
- disc_members_using_mnesia ().
185
+ rabbit_db :run (
186
+ #{mnesia => fun disc_members_using_mnesia /0 }).
141
187
142
188
disc_members_using_mnesia () ->
143
189
rabbit_mnesia :cluster_nodes (disc ).
@@ -149,7 +195,8 @@ disc_members_using_mnesia() ->
149
195
% % Node types may not all be relevant with all databases.
150
196
151
197
node_type () ->
152
- node_type_using_mnesia ().
198
+ rabbit_db :run (
199
+ #{mnesia => fun node_type_using_mnesia /0 }).
153
200
154
201
node_type_using_mnesia () ->
155
202
rabbit_mnesia :node_type ().
@@ -177,7 +224,8 @@ check_compatibility_using_mnesia(RemoteNode) ->
177
224
% % @doc Ensures the cluster is consistent.
178
225
179
226
check_consistency () ->
180
- check_consistency_using_mnesia ().
227
+ rabbit_db :run (
228
+ #{mnesia => fun check_consistency_using_mnesia /0 }).
181
229
182
230
check_consistency_using_mnesia () ->
183
231
rabbit_mnesia :check_cluster_consistency ().
@@ -190,7 +238,8 @@ check_consistency_using_mnesia() ->
190
238
% % command.
191
239
192
240
cli_cluster_status () ->
193
- cli_cluster_status_using_mnesia ().
241
+ rabbit_db :run (
242
+ #{mnesia => fun cli_cluster_status_using_mnesia /0 }).
194
243
195
244
cli_cluster_status_using_mnesia () ->
196
245
rabbit_mnesia :status ().
0 commit comments