@@ -299,7 +299,9 @@ apply(#{index := Idx} = Meta,
299
299
credit = increase_credit (Con0 , 1 )},
300
300
State1 = State0 #? STATE {ra_indexes = rabbit_fifo_index :delete (OldIdx ,
301
301
Indexes0 ),
302
- messages = lqueue :in (? MSG (Idx , Header ), Messages ),
302
+ messages = rabbit_fifo_q :in (lo ,
303
+ ? MSG (Idx , Header ),
304
+ Messages ),
303
305
enqueue_count = EnqCount + 1 },
304
306
State2 = update_or_remove_con (Meta , ConsumerKey , Con , State1 ),
305
307
{State , Ret , Effs } = checkout (Meta , State0 , State2 , []),
@@ -566,7 +568,7 @@ apply(#{index := Index}, #purge{},
566
568
end , Indexes0 , Returns )
567
569
end ,
568
570
State1 = State0 #? STATE {ra_indexes = Indexes ,
569
- messages = lqueue :new (),
571
+ messages = rabbit_fifo_q :new (),
570
572
messages_total = Total - NumReady ,
571
573
returns = lqueue :new (),
572
574
msg_bytes_enqueue = 0
@@ -736,7 +738,10 @@ apply(_Meta, Cmd, State) ->
736
738
rabbit_log :debug (" rabbit_fifo: unhandled command ~W " , [Cmd , 10 ]),
737
739
{State , ok , []}.
738
740
739
- convert_v3_to_v4 (#{system_time := Ts }, # rabbit_fifo {consumers = Consumers0 } = StateV3 ) ->
741
+ convert_v3_to_v4 (#{system_time := Ts },
742
+ # rabbit_fifo {messages = Messages0 ,
743
+ consumers = Consumers0 } = StateV3 ) ->
744
+ Messages = rabbit_fifo_q :from_lqueue (Messages0 ),
740
745
Consumers = maps :map (
741
746
fun (_CKey , # consumer {checked_out = Ch0 } = C ) ->
742
747
Ch = maps :map (
@@ -745,7 +750,8 @@ convert_v3_to_v4(#{system_time := Ts}, #rabbit_fifo{consumers = Consumers0} = St
745
750
end , Ch0 ),
746
751
C # consumer {checked_out = Ch }
747
752
end , Consumers0 ),
748
- StateV3 #? MODULE {consumers = Consumers }.
753
+ StateV3 #? MODULE {messages = Messages ,
754
+ consumers = Consumers }.
749
755
750
756
purge_node (Meta , Node , State , Effects ) ->
751
757
lists :foldl (fun (Pid , {S0 , E0 }) ->
@@ -1348,7 +1354,7 @@ is_v4() ->
1348
1354
1349
1355
messages_ready (#? STATE {messages = M ,
1350
1356
returns = R }) ->
1351
- lqueue :len (M ) + lqueue :len (R ).
1357
+ rabbit_fifo_q :len (M ) + lqueue :len (R ).
1352
1358
1353
1359
messages_total (#? STATE {messages_total = Total ,
1354
1360
dlx = DlxState }) ->
@@ -1673,10 +1679,11 @@ maybe_enqueue(RaftIdx, Ts, undefined, undefined, RawMsg, Effects,
1673
1679
Size = message_size (RawMsg ),
1674
1680
Header = maybe_set_msg_ttl (RawMsg , Ts , Size , State0 ),
1675
1681
Msg = ? MSG (RaftIdx , Header ),
1682
+ PTag = priority_tag (RawMsg ),
1676
1683
State = State0 #? STATE {msg_bytes_enqueue = Enqueue + Size ,
1677
1684
enqueue_count = EnqCount + 1 ,
1678
1685
messages_total = Total + 1 ,
1679
- messages = lqueue :in (Msg , Messages )
1686
+ messages = rabbit_fifo_q :in (PTag , Msg , Messages )
1680
1687
},
1681
1688
{ok , State , Effects };
1682
1689
maybe_enqueue (RaftIdx , Ts , From , MsgSeqNo , RawMsg , Effects0 ,
@@ -1704,10 +1711,11 @@ maybe_enqueue(RaftIdx, Ts, From, MsgSeqNo, RawMsg, Effects0,
1704
1711
false ->
1705
1712
undefined
1706
1713
end ,
1714
+ PTag = priority_tag (RawMsg ),
1707
1715
State = State0 #? STATE {msg_bytes_enqueue = Enqueue + Size ,
1708
1716
enqueue_count = EnqCount + 1 ,
1709
1717
messages_total = Total + 1 ,
1710
- messages = lqueue :in (Msg , Messages ),
1718
+ messages = rabbit_fifo_q :in (PTag , Msg , Messages ),
1711
1719
enqueuers = Enqueuers0 #{From => Enq },
1712
1720
msg_cache = MsgCache
1713
1721
},
@@ -2066,7 +2074,7 @@ take_next_msg(#?STATE{returns = Returns0,
2066
2074
{{value , NextMsg }, Returns } ->
2067
2075
{NextMsg , State #? STATE {returns = Returns }};
2068
2076
{empty , _ } ->
2069
- case lqueue :out (Messages0 ) of
2077
+ case rabbit_fifo_q :out (Messages0 ) of
2070
2078
{empty , _ } ->
2071
2079
empty ;
2072
2080
{{value , ? MSG (RaftIdx , _ ) = Msg }, Messages } ->
@@ -2081,7 +2089,7 @@ get_next_msg(#?STATE{returns = Returns0,
2081
2089
messages = Messages0 }) ->
2082
2090
case lqueue :get (Returns0 , empty ) of
2083
2091
empty ->
2084
- lqueue :get (Messages0 , empty );
2092
+ rabbit_fifo_q :get (Messages0 );
2085
2093
Msg ->
2086
2094
Msg
2087
2095
end .
@@ -2176,7 +2184,7 @@ checkout_one(#{system_time := Ts} = Meta, ExpiredMsg0, InitState0, Effects0) ->
2176
2184
checkout_one (Meta , ExpiredMsg ,
2177
2185
InitState #? STATE {service_queue = SQ1 }, Effects1 );
2178
2186
{empty , _ } ->
2179
- case lqueue :len (Messages0 ) of
2187
+ case rabbit_fifo_q :len (Messages0 ) of
2180
2188
0 ->
2181
2189
{nochange , ExpiredMsg , InitState , Effects1 };
2182
2190
_ ->
@@ -2410,9 +2418,9 @@ normalize(#?STATE{ra_indexes = _Indexes,
2410
2418
release_cursors = Cursors ,
2411
2419
dlx = DlxState } = State ) ->
2412
2420
State #? STATE {returns = lqueue :from_list (lqueue :to_list (Returns )),
2413
- messages = lqueue : from_list ( lqueue : to_list ( Messages ) ),
2414
- release_cursors = lqueue :from_list (lqueue :to_list (Cursors )),
2415
- dlx = rabbit_fifo_dlx :normalize (DlxState )}.
2421
+ messages = rabbit_fifo_q : from_lqueue ( Messages ),
2422
+ release_cursors = lqueue :from_list (lqueue :to_list (Cursors )),
2423
+ dlx = rabbit_fifo_dlx :normalize (DlxState )}.
2416
2424
2417
2425
is_over_limit (#? STATE {cfg = # cfg {max_length = undefined ,
2418
2426
max_bytes = undefined }}) ->
@@ -2644,7 +2652,7 @@ smallest_raft_index(#?STATE{messages = Messages,
2644
2652
ra_indexes = Indexes ,
2645
2653
dlx = DlxState }) ->
2646
2654
SmallestDlxRaIdx = rabbit_fifo_dlx :smallest_raft_index (DlxState ),
2647
- SmallestMsgsRaIdx = case lqueue :get (Messages , undefined ) of
2655
+ SmallestMsgsRaIdx = case rabbit_fifo_q :get (Messages ) of
2648
2656
? MSG (I , _ ) when is_integer (I ) ->
2649
2657
I ;
2650
2658
_ ->
@@ -2791,3 +2799,16 @@ maps_search(Pred, {K, V, I}) ->
2791
2799
end ;
2792
2800
maps_search (Pred , Map ) when is_map (Map ) ->
2793
2801
maps_search (Pred , maps :next (maps :iterator (Map ))).
2802
+
2803
+ priority_tag (Msg ) ->
2804
+ case mc :is (Msg ) of
2805
+ true ->
2806
+ case mc :priority (Msg ) of
2807
+ P when P > 4 ->
2808
+ hi ;
2809
+ _ ->
2810
+ lo
2811
+ end ;
2812
+ false ->
2813
+ lo
2814
+ end .
0 commit comments