45
45
dehydrate_state /1
46
46
]).
47
47
48
- -ifdef (TEST ).
49
- -export ([
50
- metrics_handler /1
51
- ]).
52
- -endif .
53
-
54
48
-type raw_msg () :: term ().
55
49
% % The raw message. It is opaque to rabbit_fifo.
56
50
153
147
154
148
- record (state ,
155
149
{name :: atom (),
150
+ queue_resource :: rabbit_types :r ('queue' ),
156
151
shadow_copy_interval = ? SHADOW_COPY_INTERVAL :: non_neg_integer (),
157
152
% unassigned messages
158
153
messages = #{} :: #{msg_in_id () => indexed_msg ()},
183
178
% needs to be part of snapshot
184
179
service_queue = queue :new () :: queue :queue (consumer_id ()),
185
180
dead_letter_handler :: maybe (applied_mfa ()),
186
- cancel_consumer_handler :: maybe (applied_mfa ()),
187
181
become_leader_handler :: maybe (applied_mfa ()),
188
- metrics_handler :: maybe (applied_mfa ()),
189
182
% % This is a special field that is only used for snapshots
190
183
% % It represents the number of queued messages at the time the
191
184
% % dehydrated snapshot state was cached.
205
198
- type config () :: #{name := atom (),
206
199
dead_letter_handler => applied_mfa (),
207
200
become_leader_handler => applied_mfa (),
208
- cancel_consumer_handler => applied_mfa (),
209
- metrics_handler => applied_mfa (),
210
201
shadow_copy_interval => non_neg_integer ()}.
211
202
212
203
- export_type ([protocol / 0 ,
223
214
config / 0 ]).
224
215
225
216
- spec init (config ()) -> {state (), ra_machine :effects ()}.
226
- init (#{name := Name } = Conf ) ->
227
- update_state (Conf , # state {name = Name }).
217
+ init (#{name := Name ,
218
+ queue_resource := Resource } = Conf ) ->
219
+ update_state (Conf , # state {name = Name ,
220
+ queue_resource = Resource }).
228
221
229
222
update_state (Conf , State ) ->
230
223
DLH = maps :get (dead_letter_handler , Conf , undefined ),
231
- CCH = maps :get (cancel_consumer_handler , Conf , undefined ),
232
224
BLH = maps :get (become_leader_handler , Conf , undefined ),
233
- MH = maps :get (metrics_handler , Conf , undefined ),
234
225
SHI = maps :get (shadow_copy_interval , Conf , ? SHADOW_COPY_INTERVAL ),
235
226
State # state {dead_letter_handler = DLH ,
236
- cancel_consumer_handler = CCH ,
237
227
become_leader_handler = BLH ,
238
- metrics_handler = MH ,
239
228
shadow_copy_interval = SHI }.
240
229
241
230
% msg_ids are scoped per consumer
@@ -504,21 +493,17 @@ state_enter(_, _) ->
504
493
505
494
- spec tick (non_neg_integer (), state ()) -> ra_machine :effects ().
506
495
tick (_Ts , # state {name = Name ,
496
+ queue_resource = QName ,
507
497
messages = Messages ,
508
498
ra_indexes = Indexes ,
509
- metrics_handler = MH ,
510
499
consumers = Cons } = State ) ->
511
500
Metrics = {Name ,
512
501
maps :size (Messages ), % Ready
513
502
num_checked_out (State ), % checked out
514
503
rabbit_fifo_index :size (Indexes ), % % Total
515
504
maps :size (Cons )}, % Consumers
516
- case MH of
517
- undefined ->
518
- [{aux , emit }];
519
- {Mod , Fun , Args } ->
520
- [{mod_call , Mod , Fun , Args ++ [Metrics ]}, {aux , emit }]
521
- end .
505
+ [{mod_call , rabbit_quorum_queue ,
506
+ update_metrics , [QName , Metrics ]}, {aux , emit }].
522
507
523
508
- spec overview (state ()) -> map ().
524
509
overview (# state {consumers = Cons ,
@@ -627,11 +612,11 @@ num_checked_out(#state{consumers = Cons}) ->
627
612
end , 0 , maps :values (Cons )).
628
613
629
614
cancel_consumer (ConsumerId ,
630
- {Effects0 , # state {consumers = C0 , name = Name } = S0 }) ->
615
+ {Effects0 , # state {consumers = C0 } = S0 }) ->
631
616
case maps :take (ConsumerId , C0 ) of
632
617
{# consumer {checked_out = Checked0 }, Cons } ->
633
618
S = return_all (S0 , Checked0 ),
634
- Effects = cancel_consumer_effects (ConsumerId , Name , S , Effects0 ),
619
+ Effects = cancel_consumer_effects (ConsumerId , S , Effects0 ),
635
620
case maps :size (Cons ) of
636
621
0 ->
637
622
{[{aux , inactive } | Effects ], S # state {consumers = Cons }};
@@ -787,13 +772,9 @@ dead_letter_effects(Discarded,
787
772
end , [], Discarded ),
788
773
[{mod_call , Mod , Fun , Args ++ [DeadLetters ]} | Effects ].
789
774
790
- cancel_consumer_effects (_ , _ , # state {cancel_consumer_handler = undefined },
791
- Effects ) ->
792
- Effects ;
793
- cancel_consumer_effects (Pid , Name ,
794
- # state {cancel_consumer_handler = {Mod , Fun , Args }},
795
- Effects ) ->
796
- [{mod_call , Mod , Fun , Args ++ [Pid , Name ]} | Effects ].
775
+ cancel_consumer_effects (ConsumerId , # state {queue_resource = QName }, Effects ) ->
776
+ [{mod_call , rabbit_quorum_queue ,
777
+ cancel_consumer_handler , [QName , ConsumerId ]} | Effects ].
797
778
798
779
update_smallest_raft_index (IncomingRaftIdx , OldIndexes ,
799
780
# state {ra_indexes = Indexes ,
@@ -1098,11 +1079,8 @@ dehydrate_consumer(#consumer{checked_out = Checked0} = Con) ->
1098
1079
1099
1080
test_init (Name ) ->
1100
1081
init (#{name => Name ,
1101
- shadow_copy_interval => 0 ,
1102
- metrics_handler => {? MODULE , metrics_handler , []}}).
1103
-
1104
- metrics_handler (_ ) ->
1105
- ok .
1082
+ queue_resource => queue_resource ,
1083
+ shadow_copy_interval => 0 }).
1106
1084
1107
1085
enq_enq_checkout_test () ->
1108
1086
Cid = {<<" enq_enq_checkout_test" >>, self ()},
@@ -1347,7 +1325,7 @@ down_with_noproc_consumer_returns_unsettled_test() ->
1347
1325
Cid = {<<" down_consumer_returns_unsettled_test" >>, self ()},
1348
1326
{State0 , [_ , _ ]} = enq (1 , 1 , second , test_init (test )),
1349
1327
{State1 , [{monitor , process , Pid } | _ ]} = check (Cid , 2 , State0 ),
1350
- {State2 , [ _ , _ ] , _ } = apply (meta (3 ), {down , Pid , noproc }, [], State1 ),
1328
+ {State2 , _ , _ } = apply (meta (3 ), {down , Pid , noproc }, [], State1 ),
1351
1329
{_State , Effects } = check (Cid , 4 , State2 ),
1352
1330
? ASSERT_EFF ({monitor , process , _ }, Effects ),
1353
1331
ok .
@@ -1425,6 +1403,7 @@ discarded_message_without_dead_letter_handler_is_removed_test() ->
1425
1403
discarded_message_with_dead_letter_handler_emits_mod_call_effect_test () ->
1426
1404
Cid = {<<" completed_consumer_yields_demonitor_effect_test" >>, self ()},
1427
1405
State00 = init (#{name => test ,
1406
+ queue_resource => rabbit_misc :r (<<" /" >>, queue , <<" test" >>),
1428
1407
dead_letter_handler =>
1429
1408
{somemod , somefun , [somearg ]}}),
1430
1409
{State0 , [_ , _ ]} = enq (1 , 1 , first , State00 ),
@@ -1447,14 +1426,12 @@ tick_test() ->
1447
1426
{S3 , {_ , _ }} = deq (4 , Cid2 , unsettled , S2 ),
1448
1427
{S4 , _ , _ } = apply (meta (5 ), {return , [MsgId ], Cid }, [], S3 ),
1449
1428
1450
- [{mod_call , _ , _ , [{test , 1 , 1 , 2 , 1 }]}, {aux , emit }] = tick (1 , S4 ),
1429
+ [{mod_call , _ , _ , [_ , {test , 1 , 1 , 2 , 1 }]}, {aux , emit }] = tick (1 , S4 ),
1451
1430
ok .
1452
1431
1453
1432
enq_deq_snapshot_recover_test () ->
1454
1433
Tag = atom_to_binary (? FUNCTION_NAME , utf8 ),
1455
1434
Cid = {Tag , self ()},
1456
- % OthPid = spawn(fun () -> ok end),
1457
- % Oth = {<<"oth">>, OthPid},
1458
1435
Commands = [
1459
1436
{enqueue , self (), 1 , one },
1460
1437
{enqueue , self (), 2 , two },
@@ -1690,6 +1667,7 @@ duplicate_delivery_test() ->
1690
1667
1691
1668
state_enter_test () ->
1692
1669
S0 = init (#{name => the_name ,
1670
+ queue_resource => rabbit_misc :r (<<" /" >>, queue , <<" test" >>),
1693
1671
become_leader_handler => {m , f , [a ]}}),
1694
1672
[{mod_call , m , f , [a , the_name ]}] = state_enter (leader , S0 ),
1695
1673
ok .
@@ -1789,7 +1767,9 @@ run_log(InitState, Entries) ->
1789
1767
aux_test () ->
1790
1768
_ = ra_machine_ets :start_link (),
1791
1769
Aux0 = init_aux (aux_test ),
1792
- MacState = init (#{name => aux_test }),
1770
+ MacState = init (#{name => aux_test ,
1771
+ queue_resource =>
1772
+ rabbit_misc :r (<<" /" >>, queue , <<" test" >>)}),
1793
1773
Log = undefined ,
1794
1774
{no_reply , Aux , undefined } = handle_aux (leader , cast , active , Aux0 ,
1795
1775
Log , MacState ),
0 commit comments