File tree Expand file tree Collapse file tree 3 files changed +25
-3
lines changed
Expand file tree Collapse file tree 3 files changed +25
-3
lines changed Original file line number Diff line number Diff line change 1+ #![ allow( unused) ]
2+
13use crate :: types:: HeaderIndexView ;
24use ckb_types:: { packed:: Byte32 , prelude:: * } ;
35use sled:: { Config , Db , Mode } ;
Original file line number Diff line number Diff line change @@ -2,6 +2,7 @@ use std::path;
22use std:: sync:: Arc ;
33use std:: sync:: atomic:: { AtomicBool , Ordering } ;
44
5+ use ckb_logger:: info;
56#[ cfg( feature = "stats" ) ]
67use ckb_logger:: info;
78use ckb_metrics:: HistogramTimer ;
@@ -43,7 +44,17 @@ struct HeaderMapKernelStats {
4344
4445impl Drop for HeaderMapKernel {
4546 fn drop ( & mut self ) {
46- todo ! ( "move all memory map to backend when drop" ) ;
47+ loop {
48+ let items = self . memory . front_items ( 1024 ) ;
49+ if items. is_empty ( ) {
50+ break ;
51+ }
52+
53+ self . backend . insert_batch ( & items) ;
54+ self . memory
55+ . remove_batch ( items. iter ( ) . map ( |item| item. hash ( ) ) , false ) ;
56+ }
57+ info ! ( "HeaderMap persisted all items to backend" ) ;
4758 }
4859}
4960
@@ -169,7 +180,7 @@ impl HeaderMapKernel {
169180 let _trace_timer: Option < HistogramTimer > = ckb_metrics:: handle ( )
170181 . map ( |handle| handle. ckb_header_map_limit_memory_duration . start_timer ( ) ) ;
171182
172- if let Some ( values) = self . memory . front_n ( self . memory_limit ) {
183+ if let Some ( values) = self . memory . excess_items ( self . memory_limit ) {
173184 tokio:: task:: block_in_place ( || {
174185 self . backend . insert_batch ( & values) ;
175186 } ) ;
Original file line number Diff line number Diff line change @@ -120,7 +120,16 @@ impl MemoryMap {
120120 } )
121121 }
122122
123- pub ( crate ) fn front_n ( & self , size_limit : usize ) -> Option < Vec < HeaderIndexView > > {
123+ pub ( crate ) fn front_items ( & self , count : usize ) -> Vec < HeaderIndexView > {
124+ let guard = self . 0 . read ( ) ;
125+ guard
126+ . iter ( )
127+ . take ( count)
128+ . map ( |( key, value) | ( key. clone ( ) , value. clone ( ) ) . into ( ) )
129+ . collect ( )
130+ }
131+
132+ pub ( crate ) fn excess_items ( & self , size_limit : usize ) -> Option < Vec < HeaderIndexView > > {
124133 let guard = self . 0 . read ( ) ;
125134 let size = guard. len ( ) ;
126135 if size > size_limit {
You can’t perform that action at this time.
0 commit comments