Skip to content

Commit 1498151

Browse files
committed
header_map: change persist backend to rocksdb
1 parent d983b89 commit 1498151

File tree

6 files changed

+73
-38
lines changed

6 files changed

+73
-38
lines changed

db/src/db.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use ckb_db_schema::Col;
88
use ckb_logger::info;
99
use rocksdb::ops::{
1010
CompactRangeCF, CreateCF, DropCF, GetColumnFamilys, GetPinned, GetPinnedCF, IterateCF, OpenCF,
11-
Put, SetOptions, WriteOps,
11+
Put, PutCF, SetOptions, WriteOps,
1212
};
1313
use rocksdb::{
1414
BlockBasedIndexType, BlockBasedOptions, Cache, ColumnFamily, ColumnFamilyDescriptor,
@@ -179,6 +179,16 @@ impl RocksDB {
179179
self.inner.get_pinned(key).map_err(internal_error)
180180
}
181181

182+
/// Put a valueinto the given column under the given key.
183+
pub fn put<K, V>(&self, col: Col, key: K, value: V) -> Result<()>
184+
where
185+
K: AsRef<[u8]>,
186+
V: AsRef<[u8]>,
187+
{
188+
let cf = cf_handle(&self.inner, col)?;
189+
self.inner.put_cf(cf, key, value).map_err(internal_error)
190+
}
191+
182192
/// Insert a value into the database under the given key.
183193
pub fn put_default<K, V>(&self, key: K, value: V) -> Result<()>
184194
where

shared/src/shared_builder.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -364,6 +364,7 @@ impl SharedBuilder {
364364
let ibd_finished = Arc::new(AtomicBool::new(false));
365365

366366
let header_map = Arc::new(HeaderMap::new(
367+
db.clone(),
367368
header_map_memory_limit,
368369
&async_handle,
369370
Arc::clone(&ibd_finished),

shared/src/types/header_map/kernel_lru.rs

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,24 @@
11
use std::sync::Arc;
22
use std::sync::atomic::{AtomicBool, Ordering};
33

4+
use ckb_db::RocksDB;
5+
use ckb_db_schema::COLUMN_BLOCK_HEADER;
46
#[cfg(feature = "stats")]
57
use ckb_logger::info;
68
use ckb_metrics::HistogramTimer;
9+
use ckb_types::packed;
710
#[cfg(feature = "stats")]
811
use ckb_util::{Mutex, MutexGuard};
912
use ckb_util::{RwLock, RwLockReadGuard};
1013

11-
use ckb_types::{U256, core::EpochNumberWithFraction, packed::Byte32};
14+
use ckb_types::{U256, core::EpochNumberWithFraction, packed::Byte32, prelude::*};
1215

1316
use super::MemoryMap;
1417
use crate::types::HeaderIndexView;
1518

1619
pub(crate) struct HeaderMapKernel {
1720
pub(crate) memory: MemoryMap,
21+
db: RocksDB,
1822
// Configuration
1923
memory_limit: usize,
2024
// if ckb is in IBD mode, don't shrink memory map
@@ -39,14 +43,15 @@ struct HeaderMapKernelStats {
3943
}
4044

4145
impl HeaderMapKernel {
42-
pub(crate) fn new(memory_limit: usize, ibd_finished: Arc<AtomicBool>) -> Self {
46+
pub(crate) fn new(db: RocksDB, memory_limit: usize, ibd_finished: Arc<AtomicBool>) -> Self {
4347
let memory = Default::default();
4448
let shared_best_header_value = Self::default_shared_best_header();
4549
let shared_best_header = RwLock::new(shared_best_header_value);
4650

4751
#[cfg(not(feature = "stats"))]
4852
{
4953
Self {
54+
db,
5055
memory,
5156
memory_limit,
5257
ibd_finished,
@@ -57,6 +62,7 @@ impl HeaderMapKernel {
5762
#[cfg(feature = "stats")]
5863
{
5964
Self {
65+
db,
6066
memory,
6167
memory_limit,
6268
ibd_finished,
@@ -80,7 +86,13 @@ impl HeaderMapKernel {
8086
if let Some(metrics) = ckb_metrics::handle() {
8187
metrics.ckb_header_map_memory_hit_miss_count.miss.inc();
8288
}
83-
false
89+
let contains = self
90+
.db
91+
.get_pinned(COLUMN_BLOCK_HEADER, hash.as_slice())
92+
.unwrap()
93+
.is_some();
94+
95+
contains
8496
}
8597

8698
pub(crate) fn get(&self, hash: &Byte32) -> Option<HeaderIndexView> {
@@ -99,27 +111,46 @@ impl HeaderMapKernel {
99111
metrics.ckb_header_map_memory_hit_miss_count.miss.inc();
100112
}
101113

114+
self.db
115+
.get_pinned(COLUMN_BLOCK_HEADER, hash.as_slice())
116+
.unwrap()
117+
.and_then(|slice| {
118+
let reader = packed::HeaderViewReader::from_slice_should_be_ok(slice.as_ref());
119+
120+
let header_view = Unpack::<ckb_types::core::HeaderView>::unpack(&reader);
121+
Some(header_view)
122+
});
123+
102124
None
103125
}
104126

105-
pub(crate) fn insert(&self, view: HeaderIndexView) -> Option<()> {
127+
pub(crate) fn insert(
128+
&self,
129+
view: ckb_types::core::HeaderView,
130+
total_difficulty: U256,
131+
) -> Option<()> {
106132
#[cfg(feature = "stats")]
107133
{
108134
self.trace();
109135
self.stats().tick_primary_insert();
110136
}
111-
self.memory.insert(view)
137+
let packed_header: packed::HeaderView = view.clone().into();
138+
let view: HeaderIndexView = (view, total_difficulty).into();
139+
let hash = view.hash();
140+
self.memory.insert(view.into());
141+
142+
self.db
143+
.put(
144+
COLUMN_BLOCK_HEADER,
145+
hash.as_slice(),
146+
packed_header.as_slice(),
147+
)
148+
.ok()
112149
}
113150

114-
pub(crate) fn remove(&self, hash: &Byte32) {
115-
#[cfg(feature = "stats")]
116-
{
117-
self.trace();
118-
self.stats().tick_primary_delete();
119-
}
120-
// If IBD is not finished, don't shrink memory map
121-
let allow_shrink_to_fit = self.ibd_finished.load(Ordering::Acquire);
122-
self.memory.remove(hash, allow_shrink_to_fit);
151+
pub(crate) fn remove(&self, _hash: &Byte32) {
152+
// TODO
153+
// no need to remove
123154
}
124155

125156
pub(crate) fn limit_memory(&self) {

shared/src/types/header_map/memory.rs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -104,22 +104,6 @@ impl MemoryMap {
104104
ret.map(|_| ())
105105
}
106106

107-
pub(crate) fn remove(&self, key: &Byte32, shrink_to_fit: bool) -> Option<HeaderIndexView> {
108-
let mut guard = self.0.write();
109-
let ret = guard.remove(key);
110-
111-
if shrink_to_fit {
112-
shrink_to_fit!(guard, SHRINK_THRESHOLD);
113-
}
114-
ret.map(|inner| {
115-
if let Some(metrics) = ckb_metrics::handle() {
116-
metrics.ckb_header_map_memory_count.dec();
117-
}
118-
119-
(key.clone(), inner).into()
120-
})
121-
}
122-
123107
pub(crate) fn excess_items(&self, size_limit: usize) -> Option<Vec<HeaderIndexView>> {
124108
let guard = self.0.read();
125109
let size = guard.len();

shared/src/types/header_map/mod.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
use ckb_async_runtime::Handle;
2+
use ckb_db::RocksDB;
23
use ckb_logger::info;
34
use ckb_stop_handler::{CancellationToken, new_tokio_exit_rx};
4-
use ckb_types::packed::Byte32;
5+
use ckb_types::{U256, packed::Byte32};
56
use std::mem::size_of;
67
use std::sync::Arc;
78
use std::sync::atomic::AtomicBool;
@@ -27,7 +28,12 @@ const ITEM_BYTES_SIZE: usize = size_of::<HeaderIndexView>();
2728
const WARN_THRESHOLD: usize = ITEM_BYTES_SIZE * 100_000;
2829

2930
impl HeaderMap {
30-
pub fn new(memory_limit: usize, async_handle: &Handle, ibd_finished: Arc<AtomicBool>) -> Self {
31+
pub fn new(
32+
db: RocksDB,
33+
memory_limit: usize,
34+
async_handle: &Handle,
35+
ibd_finished: Arc<AtomicBool>,
36+
) -> Self {
3137
if memory_limit < ITEM_BYTES_SIZE {
3238
panic!("The limit setting is too low");
3339
}
@@ -38,7 +44,7 @@ impl HeaderMap {
3844
);
3945
}
4046
let size_limit = memory_limit / ITEM_BYTES_SIZE;
41-
let inner = Arc::new(HeaderMapKernel::new(size_limit, ibd_finished));
47+
let inner = Arc::new(HeaderMapKernel::new(db, size_limit, ibd_finished));
4248
let map = Arc::clone(&inner);
4349
let stop_rx: CancellationToken = new_tokio_exit_rx();
4450

@@ -82,15 +88,15 @@ impl HeaderMap {
8288
self.inner.get(hash)
8389
}
8490

85-
pub fn insert(&self, view: HeaderIndexView) -> Option<()> {
91+
pub fn insert(&self, view: ckb_types::core::HeaderView, total_difficulty: U256) -> Option<()> {
8692
let _trace_timer: Option<HistogramTimer> = ckb_metrics::handle().map(|metric| {
8793
metric
8894
.ckb_header_map_ops_duration
8995
.with_label_values(&["insert"])
9096
.start_timer()
9197
});
9298

93-
self.inner.insert(view)
99+
self.inner.insert(view, total_difficulty)
94100
}
95101

96102
pub fn remove(&self, hash: &Byte32) {

sync/src/types/mod.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1131,13 +1131,14 @@ impl SyncShared {
11311131
let parent_header_index = self
11321132
.get_header_index_view(&parent_hash, store_first)
11331133
.expect("parent should be verified");
1134+
let total_difficulty = parent_header_index.total_difficulty() + header.difficulty();
11341135
let mut header_view = HeaderIndexView::new(
11351136
header.hash(),
11361137
header.number(),
11371138
header.epoch(),
11381139
header.timestamp(),
11391140
parent_hash,
1140-
parent_header_index.total_difficulty() + header.difficulty(),
1141+
total_difficulty.clone(),
11411142
);
11421143

11431144
let snapshot = Arc::clone(&self.shared.snapshot());
@@ -1156,7 +1157,9 @@ impl SyncShared {
11561157
}
11571158
},
11581159
);
1159-
self.shared.header_map().insert(header_view.clone());
1160+
self.shared
1161+
.header_map()
1162+
.insert(header.to_owned(), total_difficulty);
11601163
self.state
11611164
.peers()
11621165
.may_set_best_known_header(peer, header_view.as_header_index());

0 commit comments

Comments
 (0)