34
34
35
35
-include_lib (" common_test/include/ct.hrl" ).
36
36
-include_lib (" amqp_client/include/amqp_client.hrl" ).
37
+ -include_lib (" eunit/include/eunit.hrl" ).
37
38
38
39
-compile (export_all ).
39
40
@@ -50,6 +51,9 @@ groups() ->
50
51
{cluster_size_3 , [], [
51
52
declare_args ,
52
53
declare_policy ,
54
+ declare_policy_nodes ,
55
+ declare_policy_all ,
56
+ declare_policy_exactly ,
53
57
declare_config ,
54
58
calculate_min_master ,
55
59
calculate_random ,
@@ -111,7 +115,7 @@ end_per_testcase(Testcase, Config) ->
111
115
declare_args (Config ) ->
112
116
setup_test_environment (Config ),
113
117
unset_location_config (Config ),
114
- QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
118
+ QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
115
119
Args = [{<<" x-queue-master-locator" >>, longstr , <<" min-masters" >>}],
116
120
declare (Config , QueueName , false , false , Args , none ),
117
121
verify_min_master (Config , Q ).
@@ -120,14 +124,75 @@ declare_policy(Config) ->
120
124
setup_test_environment (Config ),
121
125
unset_location_config (Config ),
122
126
set_location_policy (Config , ? POLICY , <<" min-masters" >>),
123
- QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
127
+ QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
124
128
declare (Config , QueueName , false , false , _Args = [], none ),
125
129
verify_min_master (Config , Q ).
126
130
131
+ declare_policy_nodes (Config ) ->
132
+ setup_test_environment (Config ),
133
+ unset_location_config (Config ),
134
+ % Note:
135
+ % Node0 has 15 queues, Node1 has 8 and Node2 has 1
136
+ Node0Name = rabbit_data_coercion :to_binary (
137
+ rabbit_ct_broker_helpers :get_node_config (Config , 0 , nodename )),
138
+ Node1 = rabbit_ct_broker_helpers :get_node_config (Config , 1 , nodename ),
139
+ Node1Name = rabbit_data_coercion :to_binary (Node1 ),
140
+ Nodes = [Node1Name , Node0Name ],
141
+ Policy = [{<<" queue-master-locator" >>, <<" min-masters" >>},
142
+ {<<" ha-mode" >>, <<" nodes" >>},
143
+ {<<" ha-params" >>, Nodes }],
144
+ ok = rabbit_ct_broker_helpers :set_policy (Config , 0 , ? POLICY ,
145
+ <<" .*" >>, <<" queues" >>, Policy ),
146
+ QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
147
+ declare (Config , QueueName , false , false , _Args = [], none ),
148
+ verify_min_master (Config , Q , Node1 ).
149
+
150
+ declare_policy_all (Config ) ->
151
+ setup_test_environment (Config ),
152
+ unset_location_config (Config ),
153
+ % Note:
154
+ % Node0 has 15 queues, Node1 has 8 and Node2 has 1
155
+ Policy = [{<<" queue-master-locator" >>, <<" min-masters" >>},
156
+ {<<" ha-mode" >>, <<" all" >>}],
157
+ ok = rabbit_ct_broker_helpers :set_policy (Config , 0 , ? POLICY ,
158
+ <<" .*" >>, <<" queues" >>, Policy ),
159
+ QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
160
+ declare (Config , QueueName , false , false , _Args = [], none ),
161
+ verify_min_master (Config , Q ).
162
+
163
+ declare_policy_exactly (Config ) ->
164
+ setup_test_environment (Config ),
165
+ unset_location_config (Config ),
166
+ Policy = [{<<" queue-master-locator" >>, <<" min-masters" >>},
167
+ {<<" ha-mode" >>, <<" exactly" >>},
168
+ {<<" ha-params" >>, 2 }],
169
+ ok = rabbit_ct_broker_helpers :set_policy (Config , 0 , ? POLICY ,
170
+ <<" .*" >>, <<" queues" >>, Policy ),
171
+ QueueRes = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
172
+ declare (Config , QueueRes , false , false , _Args = [], none ),
173
+
174
+ Node0 = rabbit_ct_broker_helpers :get_node_config (Config , 0 , nodename ),
175
+ rabbit_ct_broker_helpers :control_action (sync_queue , Node0 ,
176
+ [binary_to_list (Q )], [{" -p" , " /" }]),
177
+ wait_for_sync (Config , Node0 , QueueRes , 1 ),
178
+
179
+ {ok , Queue } = rabbit_ct_broker_helpers :rpc (Config , Node0 ,
180
+ rabbit_amqqueue , lookup , [QueueRes ]),
181
+ {MNode0 , [SNode ], [SSNode ]} = rabbit_ct_broker_helpers :rpc (Config , Node0 ,
182
+ rabbit_mirror_queue_misc ,
183
+ actual_queue_nodes , [Queue ]),
184
+ ? assertEqual (SNode , SSNode ),
185
+ {ok , MNode1 } = rabbit_ct_broker_helpers :rpc (Config , 0 ,
186
+ rabbit_queue_master_location_misc ,
187
+ lookup_master , [Q , ? DEFAULT_VHOST_PATH ]),
188
+ ? assertEqual (MNode0 , MNode1 ),
189
+ Node2 = rabbit_ct_broker_helpers :get_node_config (Config , 2 , nodename ),
190
+ ? assertEqual (MNode1 , Node2 ).
191
+
127
192
declare_config (Config ) ->
128
193
setup_test_environment (Config ),
129
194
set_location_config (Config , <<" min-masters" >>),
130
- QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
195
+ QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
131
196
declare (Config , QueueName , false , false , _Args = [], none ),
132
197
verify_min_master (Config , Q ),
133
198
unset_location_config (Config ),
@@ -139,23 +204,23 @@ declare_config(Config) ->
139
204
140
205
calculate_min_master (Config ) ->
141
206
setup_test_environment (Config ),
142
- QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
207
+ QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
143
208
Args = [{<<" x-queue-master-locator" >>, longstr , <<" min-masters" >>}],
144
209
declare (Config , QueueName , false , false , Args , none ),
145
210
verify_min_master (Config , Q ),
146
211
ok .
147
212
148
213
calculate_random (Config ) ->
149
214
setup_test_environment (Config ),
150
- QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
215
+ QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
151
216
Args = [{<<" x-queue-master-locator" >>, longstr , <<" random" >>}],
152
217
declare (Config , QueueName , false , false , Args , none ),
153
218
verify_random (Config , Q ),
154
219
ok .
155
220
156
221
calculate_client_local (Config ) ->
157
222
setup_test_environment (Config ),
158
- QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
223
+ QueueName = rabbit_misc :r (<<" /" >>, queue , Q = <<" qm.test" >>),
159
224
Args = [{<<" x-queue-master-locator" >>, longstr , <<" client-local" >>}],
160
225
declare (Config , QueueName , false , false , Args , none ),
161
226
verify_client_local (Config , Q ),
@@ -232,41 +297,66 @@ min_master_node(Config) ->
232
297
233
298
set_location_config (Config , Strategy ) ->
234
299
Nodes = rabbit_ct_broker_helpers :get_node_configs (Config , nodename ),
235
- [ok = rpc :call (Node , application , set_env ,
236
- [rabbit , queue_master_locator , Strategy ]) || Node <- Nodes ],
300
+ [ok = rabbit_ct_broker_helpers :rpc (Config , Node ,
301
+ application , set_env ,
302
+ [rabbit , queue_master_locator , Strategy ]) || Node <- Nodes ],
237
303
ok .
238
304
239
305
unset_location_config (Config ) ->
240
306
Nodes = rabbit_ct_broker_helpers :get_node_configs (Config , nodename ),
241
- [ok = rpc :call (Node , application , unset_env ,
242
- [rabbit , queue_master_locator ]) || Node <- Nodes ],
307
+ [ok = rabbit_ct_broker_helpers :rpc (Config , Node ,
308
+ application , unset_env ,
309
+ [rabbit , queue_master_locator ]) || Node <- Nodes ],
243
310
ok .
244
311
245
- declare (Config , QueueName , Durable , AutoDelete , Args , Owner ) ->
246
- Node = rabbit_ct_broker_helpers :get_node_config (Config , 0 , nodename ),
247
- {new , Queue } = rpc :call (Node , rabbit_amqqueue , declare ,
248
- [QueueName , Durable , AutoDelete , Args , Owner ]),
312
+ declare (Config , QueueName , Durable , AutoDelete , Args0 , Owner ) ->
313
+ Args1 = [QueueName , Durable , AutoDelete , Args0 , Owner ],
314
+ {new , Queue } = rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_amqqueue , declare , Args1 ),
249
315
Queue .
250
316
317
+ verify_min_master (Config , Q , MinMasterNode ) ->
318
+ Rpc = rabbit_ct_broker_helpers :rpc (Config , 0 ,
319
+ rabbit_queue_master_location_misc ,
320
+ lookup_master , [Q , ? DEFAULT_VHOST_PATH ]),
321
+ ? assertEqual ({ok , MinMasterNode }, Rpc ).
322
+
251
323
verify_min_master (Config , Q ) ->
252
- Node = rabbit_ct_broker_helpers :get_node_config (Config , 0 , nodename ),
253
324
MinMaster = min_master_node (Config ),
254
- ct :pal (" Expecting min master ~p~n " , [MinMaster ]),
255
- {ok , MinMaster } = rpc :call (Node , rabbit_queue_master_location_misc ,
256
- lookup_master , [Q , ? DEFAULT_VHOST_PATH ]).
325
+ verify_min_master (Config , Q , MinMaster ).
257
326
258
327
verify_random (Config , Q ) ->
259
- [Node | _ ] = Nodes = rabbit_ct_broker_helpers :get_node_configs (Config ,
260
- nodename ) ,
261
- { ok , Master } = rpc : call ( Node , rabbit_queue_master_location_misc ,
262
- lookup_master , [Q , ? DEFAULT_VHOST_PATH ]),
263
- true = lists :member (Master , Nodes ).
328
+ [Node | _ ] = Nodes = rabbit_ct_broker_helpers :get_node_configs (Config , nodename ),
329
+ { ok , Master } = rabbit_ct_broker_helpers : rpc ( Config , Node ,
330
+ rabbit_queue_master_location_misc ,
331
+ lookup_master , [Q , ? DEFAULT_VHOST_PATH ]),
332
+ ? assert ( lists :member (Master , Nodes ) ).
264
333
265
334
verify_client_local (Config , Q ) ->
266
335
Node = rabbit_ct_broker_helpers :get_node_config (Config , 0 , nodename ),
267
- {ok , Node } = rpc :call (Node , rabbit_queue_master_location_misc ,
268
- lookup_master , [Q , ? DEFAULT_VHOST_PATH ]).
336
+ Rpc = rabbit_ct_broker_helpers :rpc (Config , Node ,
337
+ rabbit_queue_master_location_misc ,
338
+ lookup_master , [Q , ? DEFAULT_VHOST_PATH ]),
339
+ ? assertEqual ({ok , Node }, Rpc ).
269
340
270
341
set_location_policy (Config , Name , Strategy ) ->
271
342
ok = rabbit_ct_broker_helpers :set_policy (Config , 0 ,
272
343
Name , <<" .*" >>, <<" queues" >>, [{<<" queue-master-locator" >>, Strategy }]).
344
+
345
+ wait_for_sync (Config , Nodename , Q , ExpectedSSPidLen ) ->
346
+ wait_for_sync (Config , Nodename , Q , ExpectedSSPidLen , 600 ).
347
+
348
+ wait_for_sync (_ , _ , _ , _ , 0 ) ->
349
+ throw (sync_timeout );
350
+ wait_for_sync (Config , Nodename , Q , ExpectedSSPidLen , N ) ->
351
+ case synced (Config , Nodename , Q , ExpectedSSPidLen ) of
352
+ true -> ok ;
353
+ false -> timer :sleep (100 ),
354
+ wait_for_sync (Config , Nodename , Q , ExpectedSSPidLen , N - 1 )
355
+ end .
356
+
357
+ synced (Config , Nodename , Q , ExpectedSSPidLen ) ->
358
+ Args = [<<" /" >>, [name , synchronised_slave_pids ]],
359
+ Info = rabbit_ct_broker_helpers :rpc (Config , Nodename ,
360
+ rabbit_amqqueue , info_all , Args ),
361
+ [SSPids ] = [Pids || [{name , Q1 }, {synchronised_slave_pids , Pids }] <- Info , Q =:= Q1 ],
362
+ length (SSPids ) =:= ExpectedSSPidLen .
0 commit comments