@@ -154,7 +154,8 @@ impl EventReader {
154
154
. lock ( )
155
155
. await
156
156
. compute_segments_to_acquire_or_release ( & reader)
157
- . await ;
157
+ . await
158
+ . expect ( "should compute segments" ) ;
158
159
// attempt acquiring the desired number of segments.
159
160
if new_segments_to_acquire > 0 {
160
161
for _ in 0 ..new_segments_to_acquire {
@@ -267,9 +268,20 @@ impl EventReader {
267
268
/// is assumed dead.
268
269
pub async fn release_segment ( & mut self , mut slice : SegmentSlice ) -> Result < ( ) , EventReaderError > {
269
270
info ! (
270
- "releasing segment slice {} from reader {}" ,
271
+ "releasing segment slice {} from reader {:? }" ,
271
272
slice. meta. scoped_segment, self . id
272
273
) ;
274
+ // check if the reader is already offline.
275
+ if self . meta . reader_offline {
276
+ return Err ( EventReaderError :: StateError {
277
+ source : ReaderGroupStateError :: ReaderAlreadyOfflineError {
278
+ error_msg : format ! ( "Reader already marked offline {:?}" , self . id) ,
279
+ source : SynchronizerError :: SyncPreconditionError {
280
+ error_msg : String :: from ( "Precondition failure" ) ,
281
+ } ,
282
+ } ,
283
+ } ) ;
284
+ }
273
285
//update meta data.
274
286
let scoped_segment = ScopedSegment :: from ( slice. meta . scoped_segment . clone ( ) . as_str ( ) ) ;
275
287
self . meta . add_slices ( slice. meta . clone ( ) ) ;
@@ -322,6 +334,16 @@ impl EventReader {
322
334
slice. meta. end_offset >= offset,
323
335
"the offset where the segment slice is released should be less than the end offset"
324
336
) ;
337
+ if self . meta . reader_offline {
338
+ return Err ( EventReaderError :: StateError {
339
+ source : ReaderGroupStateError :: ReaderAlreadyOfflineError {
340
+ error_msg : format ! ( "Reader already marked offline {:?}" , self . id) ,
341
+ source : SynchronizerError :: SyncPreconditionError {
342
+ error_msg : String :: from ( "Precondition failure" ) ,
343
+ } ,
344
+ } ,
345
+ } ) ;
346
+ }
325
347
let segment = ScopedSegment :: from ( slice. meta . scoped_segment . as_str ( ) ) ;
326
348
if slice. meta . read_offset != offset {
327
349
self . meta . stop_reading ( & segment) ;
@@ -361,7 +383,7 @@ impl EventReader {
361
383
/// that another thread removes this reader from the ReaderGroup probably due to the host of this reader
362
384
/// is assumed dead.
363
385
pub async fn reader_offline ( & mut self ) -> Result < ( ) , EventReaderError > {
364
- if !self . meta . reader_offline {
386
+ if !self . meta . reader_offline && self . rg_state . lock ( ) . await . check_online ( & self . id ) . await {
365
387
info ! ( "Putting reader {:?} offline" , self . id) ;
366
388
// stop reading from all the segments.
367
389
self . meta . stop_reading_all ( ) ;
@@ -411,12 +433,23 @@ impl EventReader {
411
433
mut slice : SegmentSlice ,
412
434
read_offset : i64 ,
413
435
) -> Result < ( ) , EventReaderError > {
436
+ if self . meta . reader_offline {
437
+ return Err ( EventReaderError :: StateError {
438
+ source : ReaderGroupStateError :: ReaderAlreadyOfflineError {
439
+ error_msg : format ! ( "Reader already marked offline {:?}" , self . id) ,
440
+ source : SynchronizerError :: SyncPreconditionError {
441
+ error_msg : String :: from ( "Precondition failure" ) ,
442
+ } ,
443
+ } ,
444
+ } ) ;
445
+ }
414
446
let new_segments_to_release = self
415
447
. rg_state
416
448
. lock ( )
417
449
. await
418
450
. compute_segments_to_acquire_or_release ( & self . id )
419
- . await ;
451
+ . await
452
+ . map_err ( |err| EventReaderError :: StateError { source : err } ) ?;
420
453
let segment = ScopedSegment :: from ( slice. meta . scoped_segment . as_str ( ) ) ;
421
454
// check if segments needs to be released from the reader
422
455
if new_segments_to_release < 0 {
@@ -462,7 +495,10 @@ impl EventReader {
462
495
if self . meta . reader_offline || !self . rg_state . lock ( ) . await . check_online ( & self . id ) . await {
463
496
return Err ( EventReaderError :: StateError {
464
497
source : ReaderGroupStateError :: ReaderAlreadyOfflineError {
465
- error_msg : format ! ( "Reader already marked offline {:?}" , self . id) ,
498
+ error_msg : format ! (
499
+ "Reader already marked offline {:?} or the ReaderGroup is deleted" ,
500
+ self . id
501
+ ) ,
466
502
source : SynchronizerError :: SyncPreconditionError {
467
503
error_msg : String :: from ( "Precondition failure" ) ,
468
504
} ,
@@ -666,7 +702,8 @@ impl EventReader {
666
702
. lock ( )
667
703
. await
668
704
. compute_segments_to_acquire_or_release ( & self . id )
669
- . await ;
705
+ . await
706
+ . expect ( "should compute segments" ) ;
670
707
if new_segments_to_acquire <= 0 {
671
708
Ok ( None )
672
709
} else {
@@ -1288,7 +1325,7 @@ mod tests {
1288
1325
rg_mock. expect_check_online ( ) . return_const ( true ) ;
1289
1326
rg_mock
1290
1327
. expect_compute_segments_to_acquire_or_release ( )
1291
- . return_const ( 0 as isize ) ;
1328
+ . return_once ( move |_| Ok ( 0 as isize ) ) ;
1292
1329
rg_mock. expect_remove_reader ( ) . return_once ( move |_, _| Ok ( ( ) ) ) ;
1293
1330
// create a new Event Reader with the segment slice data.
1294
1331
let mut reader = EventReader :: init_event_reader (
@@ -1356,7 +1393,7 @@ mod tests {
1356
1393
rg_mock
1357
1394
. expect_compute_segments_to_acquire_or_release ( )
1358
1395
. with ( predicate:: eq ( Reader :: from ( "r1" . to_string ( ) ) ) )
1359
- . return_const ( 1 as isize ) ;
1396
+ . return_once ( move |_| Ok ( 1 as isize ) ) ;
1360
1397
rg_mock. expect_remove_reader ( ) . return_once ( move |_, _| Ok ( ( ) ) ) ;
1361
1398
rg_mock. expect_check_online ( ) . return_const ( true ) ;
1362
1399
@@ -1460,7 +1497,7 @@ mod tests {
1460
1497
let mut rg_mock: ReaderGroupState = ReaderGroupState :: default ( ) ;
1461
1498
rg_mock
1462
1499
. expect_compute_segments_to_acquire_or_release ( )
1463
- . return_const ( 0 as isize ) ;
1500
+ . return_once ( move |_| Ok ( 0 as isize ) ) ;
1464
1501
rg_mock. expect_check_online ( ) . return_const ( true ) ;
1465
1502
rg_mock. expect_remove_reader ( ) . return_once ( move |_, _| Ok ( ( ) ) ) ;
1466
1503
// create a new Event Reader with the segment slice data.
@@ -1535,7 +1572,7 @@ mod tests {
1535
1572
rg_mock. expect_check_online ( ) . return_const ( true ) ;
1536
1573
rg_mock
1537
1574
. expect_compute_segments_to_acquire_or_release ( )
1538
- . return_const ( 0 as isize ) ;
1575
+ . return_once ( move |_| Ok ( 0 as isize ) ) ;
1539
1576
rg_mock. expect_remove_reader ( ) . return_once ( move |_, _| Ok ( ( ) ) ) ;
1540
1577
// create a new Event Reader with the segment slice data.
1541
1578
let mut reader = EventReader :: init_event_reader (
@@ -1619,7 +1656,7 @@ mod tests {
1619
1656
rg_mock. expect_check_online ( ) . return_const ( true ) ;
1620
1657
rg_mock
1621
1658
. expect_compute_segments_to_acquire_or_release ( )
1622
- . return_const ( 0 as isize ) ;
1659
+ . return_once ( move |_| Ok ( 0 as isize ) ) ;
1623
1660
rg_mock. expect_remove_reader ( ) . return_once ( move |_, _| Ok ( ( ) ) ) ;
1624
1661
// create a new Event Reader with the segment slice data.
1625
1662
let mut reader = EventReader :: init_event_reader (
0 commit comments