@@ -654,7 +654,7 @@ impl Region {
654
654
let mut all_segments = HashMap :: new ( ) ;
655
655
656
656
// Scan the directory for existing WAL files
657
- let mut max_segment_id: i32 = - 1 ;
657
+ let mut max_segment_id: u64 = 0 ;
658
658
let mut next_sequence_num: u64 = MIN_SEQUENCE_NUMBER + 1 ;
659
659
660
660
// Segment file naming convention: {SEGMENT_NAME_PREFIX}{id}
@@ -671,27 +671,26 @@ impl Region {
671
671
. map_err ( anyhow:: Error :: new)
672
672
. context ( Internal ) ?;
673
673
674
- let segment = Segment :: new ( filename. to_string ( ) , segment_id, segment_size) ?;
674
+ let segment = Segment :: new (
675
+ entry. path ( ) . to_string_lossy ( ) . to_string ( ) ,
676
+ segment_id,
677
+ segment_size,
678
+ ) ?;
675
679
next_sequence_num = next_sequence_num. max ( segment. max_seq + 1 ) ;
680
+ max_segment_id = max_segment_id. max ( segment_id) ;
676
681
let segment = Arc :: new ( Mutex :: new ( segment) ) ;
677
-
678
- if segment_id as i32 > max_segment_id {
679
- max_segment_id = segment_id as i32 ;
680
- }
681
682
all_segments. insert ( segment_id, segment) ;
682
683
}
683
684
684
685
// If no existing segments, create a new one
685
- if max_segment_id == -1 {
686
- max_segment_id = 0 ;
687
- let path = format ! ( "{region_dir}/{SEGMENT_NAME_PREFIX}{max_segment_id}" ) ;
688
- let new_segment = Segment :: new ( path, max_segment_id as u64 , segment_size) ?;
689
- let new_segment = Arc :: new ( Mutex :: new ( new_segment) ) ;
690
- all_segments. insert ( 0 , new_segment) ;
686
+ if all_segments. is_empty ( ) {
687
+ all_segments. insert (
688
+ max_segment_id,
689
+ Self :: create_new_segment ( & region_dir, max_segment_id, segment_size) ?,
690
+ ) ;
691
691
}
692
692
693
- let latest_segment = all_segments. get ( & ( max_segment_id as u64 ) ) . unwrap ( ) . clone ( ) ;
694
-
693
+ let latest_segment = all_segments. get ( & max_segment_id) . unwrap ( ) . clone ( ) ;
695
694
let segment_manager = SegmentManager {
696
695
all_segments : Mutex :: new ( all_segments) ,
697
696
cache : Mutex :: new ( VecDeque :: new ( ) ) ,
@@ -711,17 +710,9 @@ impl Region {
711
710
} )
712
711
}
713
712
714
- fn create_new_segment ( & self , id : u64 ) -> Result < Arc < Mutex < Segment > > > {
715
- // Create a new segment
716
- let new_segment = Segment :: new (
717
- format ! ( "{}/segment_{}.wal" , self . region_dir, id) ,
718
- id,
719
- self . segment_size ,
720
- ) ?;
721
- let new_segment = Arc :: new ( Mutex :: new ( new_segment) ) ;
722
- self . segment_manager . add_segment ( id, new_segment. clone ( ) ) ?;
723
-
724
- Ok ( new_segment)
713
+ fn create_new_segment ( dir : & str , id : u64 , size : usize ) -> Result < Arc < Mutex < Segment > > > {
714
+ let new_segment = Segment :: new ( format ! ( "{dir}/{SEGMENT_NAME_PREFIX}{id}" ) , id, size) ?;
715
+ Ok ( Arc :: new ( Mutex :: new ( new_segment) ) )
725
716
}
726
717
727
718
pub fn write ( & self , _ctx : & WriteContext , batch : & LogWriteBatch ) -> Result < SequenceNumber > {
@@ -766,7 +757,10 @@ impl Region {
766
757
let new_segment_id = guard. id + 1 ;
767
758
drop ( guard) ;
768
759
769
- * current_segment = self . create_new_segment ( new_segment_id) ?;
760
+ * current_segment =
761
+ Self :: create_new_segment ( & self . region_dir , new_segment_id, self . segment_size ) ?;
762
+ self . segment_manager
763
+ . add_segment ( new_segment_id, current_segment. clone ( ) ) ?;
770
764
}
771
765
}
772
766
0 commit comments