@@ -15,6 +15,7 @@ use crate::error::Result;
1515use crate :: io:: buf:: { ZeroCopyBoxIoBuf , ZeroCopyBuf } ;
1616use crate :: io:: { FileExt , Io } ;
1717use crate :: segment:: Frame ;
18+ use crate :: transaction:: ReadTransaction ;
1819use crate :: { LibsqlFooter , LIBSQL_MAGIC , LIBSQL_PAGE_SIZE , LIBSQL_WAL_VERSION } ;
1920
2021use super :: Segment ;
@@ -209,11 +210,13 @@ where
209210 /// returns a stream of pages from the sealed segment list, and what's the lowest replication index
210211 /// that was covered. If the returned index is less than start frame_no, the missing frames
211212 /// must be read somewhere else.
212- pub async fn stream_pages_from < ' a > (
213+ pub async fn stream_pages_from < ' a , F > (
213214 & self ,
214215 current_fno : u64 ,
215216 until_fno : u64 ,
216217 seen : & ' a mut RoaringBitmap ,
218+ // not actually used, but ensures that a read lock is held while this method id called
219+ _tx : & ReadTransaction < F > ,
217220 ) -> (
218221 impl Stream < Item = crate :: error:: Result < Box < Frame > > > + ' a ,
219222 u64 ,
@@ -434,10 +437,13 @@ mod test {
434437
435438 seal_current_segment ( & shared) ;
436439
437- let current = shared. current . load ( ) ;
438- let segment_list = current. tail ( ) ;
440+ let tx = shared. begin_read ( u64:: MAX ) ;
439441 let mut seen = RoaringBitmap :: new ( ) ;
440- let ( stream, _) = segment_list. stream_pages_from ( 0 , 0 , & mut seen) . await ;
442+ let ( stream, _) = tx
443+ . current
444+ . tail ( )
445+ . stream_pages_from ( 0 , 0 , & mut seen, & tx)
446+ . await ;
441447 tokio:: pin!( stream) ;
442448
443449 let mut file = NamedTempFile :: new ( ) . unwrap ( ) ;
@@ -485,10 +491,13 @@ mod test {
485491
486492 seal_current_segment ( & shared) ;
487493
488- let current = shared. current . load ( ) ;
489- let segment_list = current. tail ( ) ;
494+ let tx = shared. begin_read ( u64:: MAX ) ;
490495 let mut seen = RoaringBitmap :: new ( ) ;
491- let ( stream, replicated_until) = segment_list. stream_pages_from ( 0 , 10 , & mut seen) . await ;
496+ let ( stream, replicated_until) = tx
497+ . current
498+ . tail ( )
499+ . stream_pages_from ( 0 , 10 , & mut seen, & tx)
500+ . await ;
492501 tokio:: pin!( stream) ;
493502
494503 assert_eq ! ( replicated_until, 10 ) ;
@@ -513,10 +522,13 @@ mod test {
513522
514523 seal_current_segment ( & shared) ;
515524
516- let current = shared. current . load ( ) ;
517- let segment_list = current. tail ( ) ;
525+ let tx = shared. begin_read ( u64:: MAX ) ;
518526 let mut seen = RoaringBitmap :: from_sorted_iter ( [ 1 ] ) . unwrap ( ) ;
519- let ( stream, replicated_until) = segment_list. stream_pages_from ( 0 , 1 , & mut seen) . await ;
527+ let ( stream, replicated_until) = tx
528+ . current
529+ . tail ( )
530+ . stream_pages_from ( 0 , 1 , & mut seen, & tx)
531+ . await ;
520532 tokio:: pin!( stream) ;
521533
522534 assert_eq ! ( replicated_until, 1 ) ;
@@ -541,22 +553,27 @@ mod test {
541553
542554 seal_current_segment ( & shared) ;
543555
544- let current = shared. current . load ( ) ;
545- let segment_list = current. tail ( ) ;
546- let mut seen = RoaringBitmap :: new ( ) ;
547- let ( stream, replicated_until) = segment_list. stream_pages_from ( 0 , 1 , & mut seen) . await ;
548- tokio:: pin!( stream) ;
556+ let mut tmp = tempfile ( ) . unwrap ( ) ;
557+ let mut last_offset = 0 ;
549558
550- assert_eq ! ( replicated_until, 1 ) ;
559+ {
560+ let tx = shared. begin_read ( u64:: MAX ) ;
561+ let mut seen = RoaringBitmap :: new ( ) ;
562+ let ( stream, replicated_until) = tx
563+ . current
564+ . tail ( )
565+ . stream_pages_from ( 0 , 1 , & mut seen, & tx)
566+ . await ;
567+ tokio:: pin!( stream) ;
551568
552- let mut tmp = tempfile ( ) . unwrap ( ) ;
569+ assert_eq ! ( replicated_until , 1 ) ;
553570
554- let mut last_offset = 0 ;
555- while let Some ( frame) = stream . next ( ) . await {
556- let frame = frame. unwrap ( ) ;
557- let offset = ( frame. header ( ) . page_no ( ) - 1 ) * 4096 ;
558- tmp . write_all_at ( frame. data ( ) , offset as u64 ) . unwrap ( ) ;
559- last_offset = last_offset . max ( frame . header ( ) . frame_no ( ) ) ;
571+ while let Some ( frame ) = stream . next ( ) . await {
572+ let frame = frame . unwrap ( ) ;
573+ let offset = ( frame. header ( ) . page_no ( ) - 1 ) * 4096 ;
574+ tmp . write_all_at ( frame. data ( ) , offset as u64 ) . unwrap ( ) ;
575+ last_offset = last_offset . max ( frame. header ( ) . frame_no ( ) ) ;
576+ }
560577 }
561578
562579 for _ in 0 ..10 {
@@ -565,21 +582,26 @@ mod test {
565582
566583 seal_current_segment ( & shared) ;
567584
568- let mut seen = RoaringBitmap :: new ( ) ;
569- let ( stream, replicated_until) = segment_list
570- . stream_pages_from ( 0 , last_offset, & mut seen)
571- . await ;
572- tokio:: pin!( stream) ;
585+ {
586+ let tx = shared. begin_read ( u64:: MAX ) ;
587+ let mut seen = RoaringBitmap :: new ( ) ;
588+ let ( stream, replicated_until) = tx
589+ . current
590+ . tail ( )
591+ . stream_pages_from ( 0 , last_offset, & mut seen, & tx)
592+ . await ;
593+ tokio:: pin!( stream) ;
573594
574- assert_eq ! ( replicated_until, last_offset) ;
595+ assert_eq ! ( replicated_until, last_offset) ;
575596
576- while let Some ( frame) = stream. next ( ) . await {
577- let frame = frame. unwrap ( ) ;
578- let offset = ( frame. header ( ) . page_no ( ) - 1 ) * 4096 ;
579- tmp. write_all_at ( frame. data ( ) , offset as u64 ) . unwrap ( ) ;
580- }
597+ while let Some ( frame) = stream. next ( ) . await {
598+ let frame = frame. unwrap ( ) ;
599+ let offset = ( frame. header ( ) . page_no ( ) - 1 ) * 4096 ;
600+ tmp. write_all_at ( frame. data ( ) , offset as u64 ) . unwrap ( ) ;
601+ }
581602
582- * shared. durable_frame_no . lock ( ) = 999999 ;
603+ * shared. durable_frame_no . lock ( ) = 999999 ;
604+ }
583605
584606 shared. checkpoint ( ) . await . unwrap ( ) ;
585607 tmp. seek ( std:: io:: SeekFrom :: Start ( 0 ) ) . unwrap ( ) ;
@@ -618,10 +640,13 @@ mod test {
618640 }
619641 seal_current_segment ( & shared) ;
620642
621- let current = shared. current . load ( ) ;
622- let segment_list = current. tail ( ) ;
643+ let tx = shared. begin_read ( u64:: MAX ) ;
623644 let mut seen = RoaringBitmap :: new ( ) ;
624- let ( stream, replicated_from) = segment_list. stream_pages_from ( 0 , 0 , & mut seen) . await ;
645+ let ( stream, replicated_from) = tx
646+ . current
647+ . tail ( )
648+ . stream_pages_from ( 0 , 0 , & mut seen, & tx)
649+ . await ;
625650 tokio:: pin!( stream) ;
626651
627652 let mut count = 0 ;
@@ -633,8 +658,8 @@ mod test {
633658 assert_eq ! ( replicated_from, 13 ) ;
634659 }
635660
636- fn db_payload ( db : & [ u8 ] ) -> & [ u8 ] {
661+ fn db_payload ( db : & [ u8 ] ) -> u32 {
637662 let size = ( db. len ( ) / 4096 ) * 4096 ;
638- & db[ ..size]
663+ crc32fast :: hash ( & db[ ..size] )
639664 }
640665}
0 commit comments