Skip to content

Commit aa88fd5

Browse files
committed
Make Osiris listener registration idempotent
Several listeners for the same offset can be registered, which causes problems for low rate, where consumers hit the end of the stream often. Then Osiris messages accumulate in the process mailbox, which slows it down considerably after some time. This commit makes the listener registration idempotent for a given offset.
1 parent 7a649ca commit aa88fd5

File tree

1 file changed

+71
-20
lines changed

1 file changed

+71
-20
lines changed

deps/rabbitmq_stream/src/rabbit_stream_reader.erl

Lines changed: 71 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,10 @@
4141
counters :: atomics:atomics_ref(),
4242
properties :: map()}).
4343
-record(consumer,
44-
{configuration :: #consumer_configuration{}, credit :: integer(),
45-
log :: osiris_log:state()}).
44+
{configuration :: #consumer_configuration{},
45+
credit :: integer(),
46+
log :: osiris_log:state(),
47+
last_listener_offset = undefined :: undefined | osiris:offset()}).
4648
-record(stream_connection_state,
4749
{data :: rabbit_stream_core:state(), blocked :: boolean(),
4850
consumers :: #{subscription_id() => #consumer{}}}).
@@ -1017,12 +1019,17 @@ open(cast,
10171019
%% likely a connection problem
10181020
Consumer;
10191021
{{segment, Log1},
1020-
{credit, Credit1}} ->
1022+
{credit, Credit1},
1023+
{last_listener_offset,
1024+
LLO1}} ->
10211025
Consumer#consumer{log =
10221026
Log1,
10231027
credit
10241028
=
1025-
Credit1}
1029+
Credit1,
1030+
last_listener_offset
1031+
=
1032+
LLO1}
10261033
end
10271034
end,
10281035
ConsumersAcc#{CorrelationId => Consumer1}
@@ -1850,11 +1857,13 @@ handle_frame_post_auth(Transport,
18501857
"peer",
18511858
[]),
18521859
throw({stop, normal});
1853-
{{segment, Log1}, {credit, Credit1}} ->
1860+
{{segment, Log1}, {credit, Credit1},
1861+
{last_listener_offset, LLO1}} ->
18541862
ConsumerState1 =
18551863
ConsumerState#consumer{log = Log1,
1856-
credit =
1857-
Credit1},
1864+
credit = Credit1,
1865+
last_listener_offset
1866+
= LLO1},
18581867
Consumers1 =
18591868
Consumers#{SubscriptionId =>
18601869
ConsumerState1},
@@ -1923,19 +1932,25 @@ handle_frame_post_auth(Transport,
19231932
{credit, SubscriptionId, Credit}) ->
19241933
case Consumers of
19251934
#{SubscriptionId := Consumer} ->
1926-
#consumer{credit = AvailableCredit} = Consumer,
1935+
#consumer{credit = AvailableCredit, last_listener_offset = LLO} =
1936+
Consumer,
19271937
case send_chunks(Transport,
19281938
Consumer,
19291939
AvailableCredit + Credit,
1940+
LLO,
19301941
SendFileOct)
19311942
of
19321943
{error, closed} ->
19331944
rabbit_log_connection:info("Stream protocol connection has been closed by "
19341945
"peer",
19351946
[]),
19361947
throw({stop, normal});
1937-
{{segment, Log1}, {credit, Credit1}} ->
1938-
Consumer1 = Consumer#consumer{log = Log1, credit = Credit1},
1948+
{{segment, Log1}, {credit, Credit1},
1949+
{last_listener_offset, LLO1}} ->
1950+
Consumer1 =
1951+
Consumer#consumer{log = Log1,
1952+
credit = Credit1,
1953+
last_listener_offset = LLO1},
19391954
{Connection,
19401955
State#stream_connection_state{consumers =
19411956
Consumers#{SubscriptionId
@@ -2704,36 +2719,59 @@ send_file_callback(Transport,
27042719
set_consumer_offset(Counters, FirstOffsetInChunk)
27052720
end.
27062721

2707-
send_chunks(Transport, #consumer{credit = Credit} = State, Counter) ->
2708-
send_chunks(Transport, State, Credit, Counter).
2722+
send_chunks(Transport,
2723+
#consumer{credit = Credit, last_listener_offset = LastLstOffset} =
2724+
State,
2725+
Counter) ->
2726+
send_chunks(Transport, State, Credit, LastLstOffset, Counter).
27092727

2710-
send_chunks(_Transport, #consumer{log = Log}, 0, _Counter) ->
2711-
{{segment, Log}, {credit, 0}};
2728+
send_chunks(_Transport,
2729+
#consumer{log = Log},
2730+
0,
2731+
LastLstOffset,
2732+
_Counter) ->
2733+
{{segment, Log}, {credit, 0}, {last_listener_offset, LastLstOffset}};
27122734
send_chunks(Transport,
27132735
#consumer{log = Log} = State,
27142736
Credit,
2737+
LastLstOffset,
27152738
Counter) ->
2716-
send_chunks(Transport, State, Log, Credit, true, Counter).
2739+
send_chunks(Transport,
2740+
State,
2741+
Log,
2742+
Credit,
2743+
LastLstOffset,
2744+
true,
2745+
Counter).
27172746

27182747
send_chunks(_Transport,
27192748
_State,
27202749
Segment,
27212750
0 = _Credit,
2751+
LastLstOffset,
27222752
_Retry,
27232753
_Counter) ->
2724-
{{segment, Segment}, {credit, 0}};
2754+
{{segment, Segment}, {credit, 0},
2755+
{last_listener_offset, LastLstOffset}};
27252756
send_chunks(Transport,
27262757
#consumer{configuration = #consumer_configuration{socket = S}} =
27272758
State,
27282759
Segment,
27292760
Credit,
2761+
LastLstOffset,
27302762
Retry,
27312763
Counter) ->
27322764
case osiris_log:send_file(S, Segment,
27332765
send_file_callback(Transport, State, Counter))
27342766
of
27352767
{ok, Segment1} ->
2736-
send_chunks(Transport, State, Segment1, Credit - 1, true, Counter);
2768+
send_chunks(Transport,
2769+
State,
2770+
Segment1,
2771+
Credit - 1,
2772+
LastLstOffset,
2773+
true,
2774+
Counter);
27372775
{error, closed} ->
27382776
{error, closed};
27392777
{error, enotconn} ->
@@ -2748,16 +2786,29 @@ send_chunks(Transport,
27482786
State,
27492787
Segment1,
27502788
Credit,
2789+
LastLstOffset,
27512790
false,
27522791
Counter);
27532792
false ->
27542793
#consumer{configuration =
27552794
#consumer_configuration{member_pid =
27562795
LocalMember}} =
27572796
State,
2758-
osiris:register_offset_listener(LocalMember,
2759-
osiris_log:next_offset(Segment1)),
2760-
{{segment, Segment1}, {credit, Credit}}
2797+
NextOffset = osiris_log:next_offset(Segment1),
2798+
LLO = case {LastLstOffset, NextOffset > LastLstOffset} of
2799+
{undefined, _} ->
2800+
osiris:register_offset_listener(LocalMember,
2801+
NextOffset),
2802+
NextOffset;
2803+
{_, true} ->
2804+
osiris:register_offset_listener(LocalMember,
2805+
NextOffset),
2806+
NextOffset;
2807+
_ ->
2808+
LastLstOffset
2809+
end,
2810+
{{segment, Segment1}, {credit, Credit},
2811+
{last_listener_offset, LLO}}
27612812
end
27622813
end.
27632814

0 commit comments

Comments
 (0)