@@ -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}
@@ -673,25 +673,20 @@ impl Region {
673
673
674
674
let segment = Segment :: new ( filename. to_string ( ) , segment_id, segment_size) ?;
675
675
next_sequence_num = next_sequence_num. max ( segment. max_seq + 1 ) ;
676
+ max_segment_id = max_segment_id. max ( segment_id) ;
676
677
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
678
all_segments. insert ( segment_id, segment) ;
682
679
}
683
680
684
681
// 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) ;
682
+ if all_segments. is_empty ( ) {
683
+ all_segments. insert (
684
+ max_segment_id,
685
+ Self :: create_new_segment ( & region_dir, max_segment_id, segment_size) ?,
686
+ ) ;
691
687
}
692
688
693
- let latest_segment = all_segments. get ( & ( max_segment_id as u64 ) ) . unwrap ( ) . clone ( ) ;
694
-
689
+ let latest_segment = all_segments. get ( & max_segment_id) . unwrap ( ) . clone ( ) ;
695
690
let segment_manager = SegmentManager {
696
691
all_segments : Mutex :: new ( all_segments) ,
697
692
cache : Mutex :: new ( VecDeque :: new ( ) ) ,
@@ -711,17 +706,9 @@ impl Region {
711
706
} )
712
707
}
713
708
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)
709
+ fn create_new_segment ( dir : & str , id : u64 , size : usize ) -> Result < Arc < Mutex < Segment > > > {
710
+ let new_segment = Segment :: new ( format ! ( "{dir}/{SEGMENT_NAME_PREFIX}{id}" ) , id, size) ?;
711
+ Ok ( Arc :: new ( Mutex :: new ( new_segment) ) )
725
712
}
726
713
727
714
pub fn write ( & self , _ctx : & WriteContext , batch : & LogWriteBatch ) -> Result < SequenceNumber > {
@@ -766,7 +753,10 @@ impl Region {
766
753
let new_segment_id = guard. id + 1 ;
767
754
drop ( guard) ;
768
755
769
- * current_segment = self . create_new_segment ( new_segment_id) ?;
756
+ * current_segment =
757
+ Self :: create_new_segment ( & self . region_dir , new_segment_id, self . segment_size ) ?;
758
+ self . segment_manager
759
+ . add_segment ( new_segment_id, current_segment. clone ( ) ) ?;
770
760
}
771
761
}
772
762
0 commit comments