Skip to content

Commit 5928e6c

Browse files
committed
QQ: Avoid using mc:size/1 inside rabbit_fifo
As we dont want to depend on external functions for things that may change the state of the queue.
1 parent 2025af8 commit 5928e6c

File tree

1 file changed

+29
-21
lines changed

1 file changed

+29
-21
lines changed

deps/rabbit/src/rabbit_fifo.erl

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@
9292
seq :: option(msg_seqno()),
9393
msg :: raw_msg()}).
9494
-record(?ENQ_V2, {seq :: option(msg_seqno()),
95-
msg :: raw_msg()}).
95+
msg :: raw_msg(),
96+
size :: {MetadataSize :: non_neg_integer(),
97+
PayloadSize :: non_neg_integer()}}).
9698
-record(requeue, {consumer_key :: consumer_key(),
9799
msg_id :: msg_id(),
98100
index :: ra:index(),
@@ -208,10 +210,10 @@ update_config(Conf, State) ->
208210
{state(), ra_machine:reply()}.
209211
apply(Meta, #enqueue{pid = From, seq = Seq,
210212
msg = RawMsg}, State00) ->
211-
apply_enqueue(Meta, From, Seq, RawMsg, State00);
213+
apply_enqueue(Meta, From, Seq, RawMsg, message_size(RawMsg), State00);
212214
apply(#{reply_mode := {notify, _Corr, EnqPid}} = Meta,
213-
#?ENQ_V2{seq = Seq, msg = RawMsg}, State00) ->
214-
apply_enqueue(Meta, EnqPid, Seq, RawMsg, State00);
215+
#?ENQ_V2{seq = Seq, msg = RawMsg, size = Size}, State00) ->
216+
apply_enqueue(Meta, EnqPid, Seq, RawMsg, Size, State00);
215217
apply(_Meta, #register_enqueuer{pid = Pid},
216218
#?STATE{enqueuers = Enqueuers0,
217219
cfg = #cfg{overflow_strategy = Overflow}} = State0) ->
@@ -1592,8 +1594,9 @@ maybe_return_all(#{system_time := Ts} = Meta, ConsumerKey,
15921594
end.
15931595

15941596
apply_enqueue(#{index := RaftIdx,
1595-
system_time := Ts} = Meta, From, Seq, RawMsg, State0) ->
1596-
case maybe_enqueue(RaftIdx, Ts, From, Seq, RawMsg, [], State0) of
1597+
system_time := Ts} = Meta, From,
1598+
Seq, RawMsg, Size, State0) ->
1599+
case maybe_enqueue(RaftIdx, Ts, From, Seq, RawMsg, Size, [], State0) of
15971600
{ok, State1, Effects1} ->
15981601
{State, ok, Effects} = checkout(Meta, State0, State1, Effects1),
15991602
{maybe_store_release_cursor(RaftIdx, State), ok, Effects};
@@ -1672,13 +1675,14 @@ maybe_store_release_cursor(RaftIdx,
16721675
maybe_store_release_cursor(_RaftIdx, State) ->
16731676
State.
16741677

1675-
maybe_enqueue(RaftIdx, Ts, undefined, undefined, RawMsg, Effects,
1676-
#?STATE{msg_bytes_enqueue = Enqueue,
1677-
enqueue_count = EnqCount,
1678-
messages = Messages,
1679-
messages_total = Total} = State0) ->
1678+
maybe_enqueue(RaftIdx, Ts, undefined, undefined, RawMsg,
1679+
{_MetaSize, BodySize},
1680+
Effects, #?STATE{msg_bytes_enqueue = Enqueue,
1681+
enqueue_count = EnqCount,
1682+
messages = Messages,
1683+
messages_total = Total} = State0) ->
16801684
% direct enqueue without tracking
1681-
Size = message_size(RawMsg),
1685+
Size = BodySize,
16821686
Header = maybe_set_msg_ttl(RawMsg, Ts, Size, State0),
16831687
Msg = ?MSG(RaftIdx, Header),
16841688
PTag = priority_tag(RawMsg),
@@ -1688,22 +1692,24 @@ maybe_enqueue(RaftIdx, Ts, undefined, undefined, RawMsg, Effects,
16881692
messages = rabbit_fifo_q:in(PTag, Msg, Messages)
16891693
},
16901694
{ok, State, Effects};
1691-
maybe_enqueue(RaftIdx, Ts, From, MsgSeqNo, RawMsg, Effects0,
1692-
#?STATE{msg_bytes_enqueue = Enqueue,
1693-
enqueue_count = EnqCount,
1694-
enqueuers = Enqueuers0,
1695-
messages = Messages,
1696-
messages_total = Total} = State0) ->
1695+
maybe_enqueue(RaftIdx, Ts, From, MsgSeqNo, RawMsg,
1696+
{_MetaSize, BodySize} = Size,
1697+
Effects0, #?STATE{msg_bytes_enqueue = Enqueue,
1698+
enqueue_count = EnqCount,
1699+
enqueuers = Enqueuers0,
1700+
messages = Messages,
1701+
messages_total = Total} = State0) ->
16971702

16981703
case maps:get(From, Enqueuers0, undefined) of
16991704
undefined ->
17001705
State1 = State0#?STATE{enqueuers = Enqueuers0#{From => #enqueuer{}}},
17011706
{Res, State, Effects} = maybe_enqueue(RaftIdx, Ts, From, MsgSeqNo,
1702-
RawMsg, Effects0, State1),
1707+
RawMsg, Size, Effects0,
1708+
State1),
17031709
{Res, State, [{monitor, process, From} | Effects]};
17041710
#enqueuer{next_seqno = MsgSeqNo} = Enq0 ->
17051711
% it is the next expected seqno
1706-
Size = message_size(RawMsg),
1712+
Size = BodySize,
17071713
Header = maybe_set_msg_ttl(RawMsg, Ts, Size, State0),
17081714
Msg = ?MSG(RaftIdx, Header),
17091715
Enq = Enq0#enqueuer{next_seqno = MsgSeqNo + 1},
@@ -2458,7 +2464,9 @@ make_enqueue(Pid, Seq, Msg) ->
24582464
true when is_pid(Pid) andalso
24592465
is_integer(Seq) ->
24602466
%% more compact format
2461-
#?ENQ_V2{seq = Seq, msg = Msg};
2467+
#?ENQ_V2{seq = Seq,
2468+
msg = Msg,
2469+
size = mc:size(Msg)};
24622470
_ ->
24632471
#enqueue{pid = Pid, seq = Seq, msg = Msg}
24642472
end.

0 commit comments

Comments
 (0)