51
51
-export ([format_osiris_event /2 ]).
52
52
-export ([update_stream_conf /2 ]).
53
53
-export ([readers /1 ]).
54
+ -export ([read_ahead_on /0 ]).
54
55
55
56
-export ([parse_offset_arg /1 ,
56
57
filter_spec /1 ]).
@@ -463,10 +464,11 @@ query_local_pid(#stream_client{stream_id = StreamId} = State) ->
463
464
begin_stream (# stream_client {name = QName ,
464
465
readers = Readers0 ,
465
466
local_pid = LocalPid } = State ,
466
- Tag , Offset , Mode , AckRequired , Filter , Options )
467
+ Tag , Offset , Mode , AckRequired , Filter , Options0 )
467
468
when is_pid (LocalPid ) ->
468
469
CounterSpec = {{? MODULE , QName , Tag , self ()}, []},
469
- {ok , Seg0 } = osiris :init_reader (LocalPid , Offset , CounterSpec , Options ),
470
+ Options1 = Options0 #{read_ahead => read_ahead_on ()},
471
+ {ok , Seg0 } = osiris :init_reader (LocalPid , Offset , CounterSpec , Options1 ),
470
472
NextOffset = osiris_log :next_offset (Seg0 ) - 1 ,
471
473
osiris :register_offset_listener (LocalPid , NextOffset ),
472
474
StartOffset = case Offset of
@@ -491,7 +493,7 @@ begin_stream(#stream_client{name = QName,
491
493
last_consumed_offset = StartOffset ,
492
494
log = Seg0 ,
493
495
filter = Filter ,
494
- reader_options = Options },
496
+ reader_options = Options1 },
495
497
{ok , State # stream_client {readers = Readers0 #{Tag => Str0 }}}.
496
498
497
499
cancel (_Q , #{consumer_tag := ConsumerTag ,
@@ -659,8 +661,8 @@ handle_event(_QName, {stream_local_member_change, Pid},
659
661
osiris_log :close (Log0 ),
660
662
CounterSpec = {{? MODULE , QName , self ()}, []},
661
663
? LOG_DEBUG (" Re-creating Osiris reader for consumer ~tp at offset ~tp "
662
- " with options ~tp " ,
663
- [T , Offset , Options ]),
664
+ " with options ~tp " ,
665
+ [T , Offset , Options ]),
664
666
{ok , Log1 } = osiris :init_reader (Pid , Offset , CounterSpec , Options ),
665
667
NextOffset = osiris_log :next_offset (Log1 ) - 1 ,
666
668
? LOG_DEBUG (" Registering offset listener at offset ~tp " , [NextOffset ]),
@@ -1176,7 +1178,7 @@ stream_entries(QName, Name, CTag, LocalPid,
1176
1178
credit = Credit } = Str0 ) ->
1177
1179
case Credit > 0 of
1178
1180
true ->
1179
- case chunk_iterator (Str0 , LocalPid ) of
1181
+ case chunk_iterator (Str0 , LocalPid , undefined ) of
1180
1182
{ok , Str } ->
1181
1183
stream_entries (QName , Name , CTag , LocalPid , Str );
1182
1184
{end_of_stream , Str } ->
@@ -1229,7 +1231,7 @@ stream_entries(QName, Name, CTag, LocalPid,
1229
1231
gen_server :cast (self (), queue_event (QName , {resume_filtering , CTag })),
1230
1232
{Str0 # stream {filtering_paused = true }, lists :reverse (Acc0 )};
1231
1233
end_of_chunk ->
1232
- case chunk_iterator (Str0 , LocalPid ) of
1234
+ case chunk_iterator (Str0 , LocalPid , Iter0 ) of
1233
1235
{ok , Str } ->
1234
1236
stream_entries (QName , Name , CTag , LocalPid , Str , Acc0 );
1235
1237
{end_of_stream , Str } ->
@@ -1294,8 +1296,8 @@ stream_entries(QName, Name, CTag, LocalPid,
1294
1296
1295
1297
chunk_iterator (# stream {credit = Credit ,
1296
1298
listening_offset = LOffs ,
1297
- log = Log0 } = Str0 , LocalPid ) ->
1298
- case osiris_log :chunk_iterator (Log0 , Credit ) of
1299
+ log = Log0 } = Str0 , LocalPid , PrevIterator ) ->
1300
+ case osiris_log :chunk_iterator (Log0 , Credit , PrevIterator ) of
1299
1301
{ok , _ChunkHeader , Iter , Log } ->
1300
1302
{ok , Str0 # stream {chunk_iterator = Iter ,
1301
1303
log = Log }};
@@ -1527,3 +1529,6 @@ queue_vm_stats_sups() ->
1527
1529
queue_vm_ets () ->
1528
1530
{[],
1529
1531
[]}.
1532
+
1533
+ read_ahead_on () ->
1534
+ application :get_env (rabbit , stream_read_ahead , true ).
0 commit comments