2222
2323-import (quorum_queue_utils , [wait_for_messages_ready /3 ,
2424 wait_for_messages_pending_ack /3 ,
25+ wait_for_messages_total /3 ,
2526 dirty_query /3 ,
2627 ra_name /1 ]).
2728
@@ -37,6 +38,7 @@ all() ->
3738groups () ->
3839 [
3940 {single_node , [], all_tests ()},
41+ {single_node , [], memory_tests ()},
4042 {unclustered , [], [
4143 {cluster_size_2 , [], [add_member ]}
4244 ]},
@@ -51,6 +53,7 @@ groups() ->
5153 delete_member_not_found ,
5254 delete_member ]
5355 ++ all_tests ()},
56+ {cluster_size_2 , [], memory_tests ()},
5457 {cluster_size_3 , [], [
5558 declare_during_node_down ,
5659 simple_confirm_availability_on_leader_change ,
@@ -61,7 +64,8 @@ groups() ->
6164 delete_declare ,
6265 metrics_cleanup_on_leadership_takeover ,
6366 metrics_cleanup_on_leader_crash ,
64- consume_in_minority ]},
67+ consume_in_minority
68+ ]},
6569 {cluster_size_5 , [], [start_queue ,
6670 start_queue_concurrent ,
6771 quorum_cluster_size_3 ,
@@ -126,6 +130,11 @@ all_tests() ->
126130 consume_redelivery_count ,
127131 subscribe_redelivery_count ,
128132 message_bytes_metrics ,
133+ queue_length_limit_drop_head
134+ ].
135+
136+ memory_tests () ->
137+ [
129138 memory_alarm_rolls_wal
130139 ].
131140
@@ -240,7 +249,9 @@ declare_args(Config) ->
240249
241250 Ch = rabbit_ct_client_helpers :open_channel (Config , Server ),
242251 LQ = ? config (queue_name , Config ),
243- declare (Ch , LQ , [{<<" x-queue-type" >>, longstr , <<" quorum" >>}]),
252+ declare (Ch , LQ , [{<<" x-queue-type" >>, longstr , <<" quorum" >>},
253+ {<<" x-max-length" >>, long , 2000 },
254+ {<<" x-max-length-bytes" >>, long , 2000 }]),
244255 assert_queue_type (Server , LQ , quorum ),
245256
246257 DQ = <<" classic-declare-args-q" >>,
@@ -293,16 +304,6 @@ declare_invalid_args(Config) ->
293304 declare (rabbit_ct_client_helpers :open_channel (Config , Server ),
294305 LQ , [{<<" x-queue-type" >>, longstr , <<" quorum" >>},
295306 {<<" x-message-ttl" >>, long , 2000 }])),
296- ? assertExit (
297- {{shutdown , {server_initiated_close , 406 , _ }}, _ },
298- declare (rabbit_ct_client_helpers :open_channel (Config , Server ),
299- LQ , [{<<" x-queue-type" >>, longstr , <<" quorum" >>},
300- {<<" x-max-length" >>, long , 2000 }])),
301- ? assertExit (
302- {{shutdown , {server_initiated_close , 406 , _ }}, _ },
303- declare (rabbit_ct_client_helpers :open_channel (Config , Server ),
304- LQ , [{<<" x-queue-type" >>, longstr , <<" quorum" >>},
305- {<<" x-max-length-bytes" >>, long , 2000 }])),
306307
307308 ? assertExit (
308309 {{shutdown , {server_initiated_close , 406 , _ }}, _ },
@@ -314,7 +315,7 @@ declare_invalid_args(Config) ->
314315 {{shutdown , {server_initiated_close , 406 , _ }}, _ },
315316 declare (rabbit_ct_client_helpers :open_channel (Config , Server ),
316317 LQ , [{<<" x-queue-type" >>, longstr , <<" quorum" >>},
317- {<<" x-overflow" >>, longstr , <<" drop-head " >>}])),
318+ {<<" x-overflow" >>, longstr , <<" reject-publish " >>}])),
318319
319320 ? assertExit (
320321 {{shutdown , {server_initiated_close , 406 , _ }}, _ },
@@ -1422,7 +1423,7 @@ metrics_cleanup_on_leadership_takeover(Config) ->
14221423 _ -> false
14231424 end
14241425 end ),
1425- force_leader_change (Leader , Servers , QQ ),
1426+ force_leader_change (Servers , QQ ),
14261427 wait_until (fun () ->
14271428 [] =:= rpc :call (Leader , ets , lookup , [queue_coarse_metrics , QRes ]) andalso
14281429 [] =:= rpc :call (Leader , ets , lookup , [queue_metrics , QRes ])
@@ -2151,6 +2152,32 @@ memory_alarm_rolls_wal(Config) ->
21512152 timer :sleep (1000 ),
21522153 ok .
21532154
2155+ queue_length_limit_drop_head (Config ) ->
2156+ [Server | _ ] = Servers = rabbit_ct_broker_helpers :get_node_configs (Config , nodename ),
2157+
2158+ Ch = rabbit_ct_client_helpers :open_channel (Config , Server ),
2159+ QQ = ? config (queue_name , Config ),
2160+ ? assertEqual ({'queue.declare_ok' , QQ , 0 , 0 },
2161+ declare (Ch , QQ , [{<<" x-queue-type" >>, longstr , <<" quorum" >>},
2162+ {<<" x-max-length" >>, long , 1 }])),
2163+
2164+ RaName = ra_name (QQ ),
2165+ ok = amqp_channel :cast (Ch ,
2166+ # 'basic.publish' {routing_key = QQ },
2167+ # amqp_msg {props = # 'P_basic' {delivery_mode = 2 },
2168+ payload = <<" msg1" >>}),
2169+ ok = amqp_channel :cast (Ch ,
2170+ # 'basic.publish' {routing_key = QQ },
2171+ # amqp_msg {props = # 'P_basic' {delivery_mode = 2 },
2172+ payload = <<" msg2" >>}),
2173+ wait_for_consensus (QQ , Config ),
2174+ wait_for_messages_ready (Servers , RaName , 1 ),
2175+ wait_for_messages_pending_ack (Servers , RaName , 0 ),
2176+ wait_for_messages_total (Servers , RaName , 1 ),
2177+ ? assertMatch ({# 'basic.get_ok' {}, # amqp_msg {payload = <<" msg2" >>}},
2178+ amqp_channel :call (Ch , # 'basic.get' {queue = QQ ,
2179+ no_ack = true })).
2180+
21542181% %----------------------------------------------------------------------------
21552182
21562183declare (Ch , Q ) ->
@@ -2201,6 +2228,9 @@ filter_queues(Expected, Got) ->
22012228 lists :member (K , Keys )
22022229 end , Got ).
22032230
2231+ publish_many (Ch , Queue , Count ) ->
2232+ [publish (Ch , Queue ) || _ <- lists :seq (1 , Count )].
2233+
22042234publish (Ch , Queue ) ->
22052235 ok = amqp_channel :cast (Ch ,
22062236 # 'basic.publish' {routing_key = Queue },
@@ -2268,14 +2298,16 @@ wait_until(Condition, N) ->
22682298 wait_until (Condition , N - 1 )
22692299 end .
22702300
2271- force_leader_change (Leader , Servers , Q ) ->
2301+
2302+ force_leader_change ([Server | _ ] = Servers , Q ) ->
22722303 RaName = ra_name (Q ),
2304+ {ok , _ , {_ , Leader }} = ra :members ({RaName , Server }),
22732305 [F1 , _ ] = Servers -- [Leader ],
22742306 ok = rpc :call (F1 , ra , trigger_election , [{RaName , F1 }]),
22752307 case ra :members ({RaName , Leader }) of
22762308 {ok , _ , {_ , Leader }} ->
22772309 % % Leader has been re-elected
2278- force_leader_change (Leader , Servers , Q );
2310+ force_leader_change (Servers , Q );
22792311 {ok , _ , _ } ->
22802312 % % Leader has changed
22812313 ok
@@ -2297,3 +2329,8 @@ get_message_bytes(Leader, QRes) ->
22972329 _ ->
22982330 []
22992331 end .
2332+
2333+ wait_for_consensus (Name , Config ) ->
2334+ Server = rabbit_ct_broker_helpers :get_node_config (Config , 0 , nodename ),
2335+ RaName = ra_name (Name ),
2336+ {ok , _ , _ } = ra :members ({RaName , Server }).
0 commit comments