Skip to content

Commit 7c5f6d5

Browse files
committed
header_map: impl Drop for HeaderMapKernel to persist header_map from memory to SledBackend
Signed-off-by: Eval EXEC <execvy@gmail.com>
1 parent 2819348 commit 7c5f6d5

File tree

3 files changed

+25
-3
lines changed

3 files changed

+25
-3
lines changed

shared/src/types/header_map/backend_sled.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#![allow(unused)]
2+
13
use crate::types::HeaderIndexView;
24
use ckb_types::{packed::Byte32, prelude::*};
35
use sled::{Config, Db, Mode};

shared/src/types/header_map/kernel_lru.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use std::path;
22
use std::sync::Arc;
33
use std::sync::atomic::{AtomicBool, Ordering};
44

5+
use ckb_logger::info;
56
#[cfg(feature = "stats")]
67
use ckb_logger::info;
78
use ckb_metrics::HistogramTimer;
@@ -43,7 +44,17 @@ struct HeaderMapKernelStats {
4344

4445
impl 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
});

shared/src/types/header_map/memory.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff 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 {

0 commit comments

Comments
 (0)