1
0
mirror of https://github.com/romanz/electrs.git synced 2024-11-19 09:54:09 +01:00

Simplify indexing code a bit

This commit is contained in:
Roman Zeyde 2021-06-18 20:37:53 +03:00
parent 423e4c7922
commit f5884cd172

View File

@ -7,7 +7,7 @@ use std::collections::HashMap;
use crate::{ use crate::{
chain::Chain, chain::Chain,
daemon::Daemon, daemon::Daemon,
db, db::{DBStore, Row, WriteBatch},
metrics::{Histogram, Metrics}, metrics::{Histogram, Metrics},
types::{HeaderRow, ScriptHash, ScriptHashRow, SpendingPrefixRow, TxidRow}, types::{HeaderRow, ScriptHash, ScriptHashRow, SpendingPrefixRow, TxidRow},
}; };
@ -40,15 +40,15 @@ impl Stats {
} }
} }
fn report_stats(&self, batch: &db::WriteBatch) { fn observe_size(&self, label: &str, rows: &[Row]) {
self.update_size self.update_size.observe(label, db_rows_size(rows));
.observe("write_funding_rows", db_rows_size(&batch.funding_rows)); }
self.update_size
.observe("write_spending_rows", db_rows_size(&batch.spending_rows)); fn report_stats(&self, batch: &WriteBatch) {
self.update_size self.observe_size("write_funding_rows", &batch.funding_rows);
.observe("write_txid_rows", db_rows_size(&batch.txid_rows)); self.observe_size("write_spending_rows", &batch.spending_rows);
self.update_size self.observe_size("write_txid_rows", &batch.txid_rows);
.observe("write_header_rows", db_rows_size(&batch.header_rows)); self.observe_size("write_header_rows", &batch.header_rows);
debug!( debug!(
"writing {} funding and {} spending rows from {} transactions, {} blocks", "writing {} funding and {} spending rows from {} transactions, {} blocks",
batch.funding_rows.len(), batch.funding_rows.len(),
@ -67,14 +67,16 @@ struct IndexResult {
} }
impl IndexResult { impl IndexResult {
fn extend(&self, batch: &mut db::WriteBatch) { fn extend(&self, batch: &mut WriteBatch) {
let funding_rows = self.funding_rows.iter().map(ScriptHashRow::to_db_row); let funding_rows = self.funding_rows.iter().map(ScriptHashRow::to_db_row);
let spending_rows = self.spending_rows.iter().map(SpendingPrefixRow::to_db_row);
let txid_rows = self.txid_rows.iter().map(TxidRow::to_db_row);
batch.funding_rows.extend(funding_rows); batch.funding_rows.extend(funding_rows);
let spending_rows = self.spending_rows.iter().map(SpendingPrefixRow::to_db_row);
batch.spending_rows.extend(spending_rows); batch.spending_rows.extend(spending_rows);
let txid_rows = self.txid_rows.iter().map(TxidRow::to_db_row);
batch.txid_rows.extend(txid_rows); batch.txid_rows.extend(txid_rows);
batch.header_rows.push(self.header_row.to_db_row()); batch.header_rows.push(self.header_row.to_db_row());
batch.tip_row = serialize(&self.header_row.header.block_hash()).into_boxed_slice(); batch.tip_row = serialize(&self.header_row.header.block_hash()).into_boxed_slice();
} }
@ -82,13 +84,13 @@ impl IndexResult {
/// Confirmed transactions' address index /// Confirmed transactions' address index
pub struct Index { pub struct Index {
store: db::DBStore, store: DBStore,
chain: Chain, chain: Chain,
stats: Stats, stats: Stats,
} }
impl Index { impl Index {
pub(crate) fn load(store: db::DBStore, mut chain: Chain, metrics: &Metrics) -> Result<Self> { pub(crate) fn load(store: DBStore, mut chain: Chain, metrics: &Metrics) -> Result<Self> {
if let Some(row) = store.get_tip() { if let Some(row) = store.get_tip() {
let tip = deserialize(&row).expect("invalid tip"); let tip = deserialize(&row).expect("invalid tip");
let headers = store let headers = store
@ -154,7 +156,7 @@ impl Index {
let mut heights_map: HashMap<BlockHash, usize> = let mut heights_map: HashMap<BlockHash, usize> =
chunk.iter().map(|h| (h.hash(), h.height())).collect(); chunk.iter().map(|h| (h.hash(), h.height())).collect();
let mut batch = db::WriteBatch::default(); let mut batch = WriteBatch::default();
daemon.for_blocks(blockhashes, |blockhash, block| { daemon.for_blocks(blockhashes, |blockhash, block| {
let height = heights_map.remove(&blockhash).expect("unexpected block"); let height = heights_map.remove(&blockhash).expect("unexpected block");
@ -173,7 +175,7 @@ impl Index {
} }
} }
fn db_rows_size(rows: &[db::Row]) -> usize { fn db_rows_size(rows: &[Row]) -> usize {
rows.iter().map(|key| key.len()).sum() rows.iter().map(|key| key.len()).sum()
} }