@@ -12,6 +12,16 @@ use crate::pipe_log::{GenericPipeLog, LogQueue};
1212use crate :: util:: HandyRwLock ;
1313use crate :: { GlobalStats , Result } ;
1414
15+ #[ derive( Clone , Default ) ]
16+ pub struct RemovedMemtables ( Arc < Mutex < BinaryHeap < ( Reverse < u64 > , u64 ) > > > ) ;
17+
18+ impl RemovedMemtables {
19+ pub fn remove_memtable ( & self , file_num : u64 , raft_group_id : u64 ) {
20+ let mut tables = self . 0 . lock ( ) . unwrap ( ) ;
21+ tables. push ( ( Reverse ( file_num) , raft_group_id) ) ;
22+ }
23+ }
24+
1525// If a region has some very old raft logs less than this threshold,
1626// rewrite them to clean stale log files ASAP.
1727const REWRITE_ENTRY_COUNT_THRESHOLD : usize = 32 ;
3141 global_stats : Arc < GlobalStats > ,
3242
3343 // Vector of (file_num, raft_group_id).
34- #[ allow( clippy:: type_complexity) ]
35- removed_memtables : Arc < Mutex < BinaryHeap < ( Reverse < u64 > , u64 ) > > > ,
44+ removed_memtables : RemovedMemtables ,
3645
3746 // Only one thread can run `purge_expired_files` at a time.
3847 purge_mutex : Arc < Mutex < ( ) > > ,
@@ -115,9 +124,8 @@ where
115124 }
116125 }
117126
118- pub fn remove_memtable ( & self , file_num : u64 , raft_group_id : u64 ) {
119- let mut tables = self . removed_memtables . lock ( ) . unwrap ( ) ;
120- tables. push ( ( Reverse ( file_num) , raft_group_id) ) ;
127+ pub fn get_removed_memtables ( & self ) -> RemovedMemtables {
128+ self . removed_memtables . clone ( )
121129 }
122130
123131 // Returns (`latest_needs_rewrite`, `latest_needs_force_compact`).
@@ -159,13 +167,16 @@ where
159167 assert ! ( latest_compact <= latest_rewrite) ;
160168 let mut log_batch = LogBatch :: < E , W > :: new ( ) ;
161169
162- while let Some ( item) = self . removed_memtables . lock ( ) . unwrap ( ) . pop ( ) {
163- let ( file_num, raft_id) = ( ( item. 0 ) . 0 , item. 1 ) ;
164- if file_num > latest_rewrite {
165- self . removed_memtables . lock ( ) . unwrap ( ) . push ( item) ;
166- break ;
170+ {
171+ let mut guard = self . removed_memtables . 0 . lock ( ) . unwrap ( ) ;
172+ while let Some ( item) = guard. pop ( ) {
173+ let ( file_num, raft_id) = ( ( item. 0 ) . 0 , item. 1 ) ;
174+ if file_num > latest_rewrite {
175+ guard. push ( item) ;
176+ break ;
177+ }
178+ log_batch. clean_region ( raft_id) ;
167179 }
168- log_batch. clean_region ( raft_id) ;
169180 }
170181
171182 let memtables = self . memtables . collect ( |t| {
@@ -216,7 +227,6 @@ where
216227 Ok ( ( ) )
217228 }
218229
219-
220230 fn rewrite_to_memtable (
221231 & self ,
222232 log_batch : & mut LogBatch < E , W > ,
@@ -227,7 +237,7 @@ where
227237 let memtable = self . memtables . get_or_insert ( item. raft_group_id ) ;
228238 match item. content {
229239 LogItemContent :: Entries ( entries_to_add) => {
230- let entries_index = entries_to_add. entries_index . into_inner ( ) ;
240+ let entries_index = entries_to_add. entries_index ;
231241 memtable. wl ( ) . rewrite ( entries_index, latest_rewrite) ;
232242 }
233243 LogItemContent :: Kv ( kv) => match kv. op_type {
@@ -294,16 +304,17 @@ mod tests {
294304 cfg. dir = dir. path ( ) . to_str ( ) . unwrap ( ) . to_owned ( ) ;
295305 let engine = RaftLogEngine :: new ( cfg. clone ( ) ) ;
296306
297- engine. purge_manager ( ) . remove_memtable ( 3 , 10 ) ;
298- engine. purge_manager ( ) . remove_memtable ( 3 , 9 ) ;
299- engine. purge_manager ( ) . remove_memtable ( 3 , 11 ) ;
300- engine. purge_manager ( ) . remove_memtable ( 2 , 9 ) ;
301- engine. purge_manager ( ) . remove_memtable ( 4 , 4 ) ;
302- engine. purge_manager ( ) . remove_memtable ( 4 , 3 ) ;
307+ let tables = engine. purge_manager ( ) . get_removed_memtables ( ) ;
308+ tables. remove_memtable ( 3 , 10 ) ;
309+ tables. remove_memtable ( 3 , 9 ) ;
310+ tables. remove_memtable ( 3 , 11 ) ;
311+ tables. remove_memtable ( 2 , 9 ) ;
312+ tables. remove_memtable ( 4 , 4 ) ;
313+ tables. remove_memtable ( 4 , 3 ) ;
303314
304- let mut tables = engine . purge_manager ( ) . removed_memtables . lock ( ) . unwrap ( ) ;
315+ let mut guard = tables . 0 . lock ( ) . unwrap ( ) ;
305316 for ( file_num, raft_id) in vec ! [ ( 2 , 9 ) , ( 3 , 11 ) , ( 3 , 10 ) , ( 3 , 9 ) , ( 4 , 4 ) , ( 4 , 3 ) ] {
306- let item = tables . pop ( ) . unwrap ( ) ;
317+ let item = guard . pop ( ) . unwrap ( ) ;
307318 assert_eq ! ( ( item. 0 ) . 0 , file_num) ;
308319 assert_eq ! ( item. 1 , raft_id) ;
309320 }
0 commit comments