Merge branch 'db-cfg' into 'master'

Make DB read pool size configurable

See merge request riftenlabs/riftenlabs-indexer!65
This commit is contained in:
Dagur Valberg Johannsson 2026-02-10 14:31:03 +00:00
commit 52ad406cf1
5 changed files with 55 additions and 13 deletions

2
Cargo.lock generated
View file

@ -1737,7 +1737,7 @@ dependencies = [
[[package]]
name = "riftenlabs-indexer"
version = "0.1.0"
version = "0.2.0"
dependencies = [
"anyhow",
"bitcoin_hashes",

View file

@ -1,8 +1,8 @@
[package]
name = "riftenlabs-indexer"
version = "0.1.0"
version = "0.2.0"
edition = "2021"
authors = ["Riften Labs AS <hello@cauldron.quest>"]
authors = ["Whiterun LLC <hello@riftenlabs.com>"]
description = "Riften Labs DeFi contract indexer on Bitcoin Cash"
license = "AGPL-3.0-or-later"
homepage = "https://gitlab.com/riftenlabs/riftenlabs-indexer"

View file

@ -15,3 +15,27 @@ name = "serve_during_ibd"
type = "bool"
doc = "Allow serving API requests during initial block download (for debugging)"
default = "false"
[[param]]
name = "cauldron_read_slots"
type = "u32"
doc = "Number of read connection pool slots for the cauldron database (default: 8)"
default = "32"
[[param]]
name = "bcmr_read_slots"
type = "u32"
doc = "Number of read connection pool slots for the BCMR database (default: 8)"
default = "8"
[[param]]
name = "crc20_read_slots"
type = "u32"
doc = "Number of read connection pool slots for the CRC20 database (default: 8)"
default = "8"
[[param]]
name = "oracle_read_slots"
type = "u32"
doc = "Number of read connection pool slots for the oracle database (default: 8)"
default = "8"

View file

@ -61,9 +61,9 @@ pub fn db_sanity_check(c: &rusqlite::Connection) -> rusqlite::Result<()> {
}
/// Create read and write database pools for a given database path
fn create_db_pool(db_path: &str) -> (bool, DBPool, DBPool) {
fn create_db_pool(db_path: &str, read_max_size: u32) -> (bool, DBPool, DBPool) {
let db_exists = Path::new(db_path).exists();
info!("Initializing connection to {db_path}");
info!("Initializing connection to {db_path} (read_slots={read_max_size})");
let write_manager = r2d2_sqlite::SqliteConnectionManager::file(db_path)
.with_flags(OpenFlags::SQLITE_OPEN_READ_WRITE | OpenFlags::SQLITE_OPEN_CREATE)
@ -82,7 +82,7 @@ fn create_db_pool(db_path: &str) -> (bool, DBPool, DBPool) {
let read_pool = Arc::new(
r2d2::Pool::builder()
.max_size(8) // Read pools can have more for concurrent requests
.max_size(read_max_size)
.build(read_manager)
.expect("Failed to initialize database"),
);
@ -121,14 +121,22 @@ fn db_path(db_dir: &str, filename: &str) -> String {
}
}
/// Per-database read pool sizes
pub struct ReadSlots {
pub cauldron: u32,
pub bcmr: u32,
pub crc20: u32,
pub oracle: u32,
}
/// Initialize all databases and return a DB struct
pub fn initialize_databases(network: &str) -> Result<DB> {
pub fn initialize_databases(network: &str, read_slots: ReadSlots) -> Result<DB> {
let db_dir = get_db_directory(network);
ensure_db_directory(db_dir)?;
// Initialize cauldron database
let (db_exists, cauldron_db_write, cauldron_db_read) =
create_db_pool(&db_path(db_dir, "cauldron.db"));
create_db_pool(&db_path(db_dir, "cauldron.db"), read_slots.cauldron);
if !db_exists {
cauldron_prepare_tables(
&cauldron_db_write
@ -141,7 +149,8 @@ pub fn initialize_databases(network: &str) -> Result<DB> {
}
// Initialize BCMR database
let (db_exists, bcmr_db_write, bcmr_db_read) = create_db_pool(&db_path(db_dir, "bcmr.db"));
let (db_exists, bcmr_db_write, bcmr_db_read) =
create_db_pool(&db_path(db_dir, "bcmr.db"), read_slots.bcmr);
if !db_exists {
bcmr_prepare_tables(
&bcmr_db_write
@ -151,7 +160,8 @@ pub fn initialize_databases(network: &str) -> Result<DB> {
}
// Initialize CRC20 database
let (db_exists, crc20_db_write, crc20_db_read) = create_db_pool(&db_path(db_dir, "crc20.db"));
let (db_exists, crc20_db_write, crc20_db_read) =
create_db_pool(&db_path(db_dir, "crc20.db"), read_slots.crc20);
if !db_exists {
crc20_prepare_tables(
&crc20_db_write
@ -162,7 +172,7 @@ pub fn initialize_databases(network: &str) -> Result<DB> {
// Initialize oracle database
let (db_exists, oracle_db_write, oracle_db_read) =
create_db_pool(&db_path(db_dir, "oracle.db"));
create_db_pool(&db_path(db_dir, "oracle.db"), read_slots.oracle);
if !db_exists {
oracle_prepare_tables(
&oracle_db_write

View file

@ -41,7 +41,7 @@ use crate::bcmr::bcmrdownloader::BCMRDownloader;
use crate::db::cauldron::header::load_all_headers;
use crate::db::cauldron::tokenlist::db_utils::create_cached_token_metrics_table;
use crate::db::cauldron::tokenlist::metrics_cache::spawn_token_metrics_updater;
use crate::db::init::initialize_databases;
use crate::db::init::{initialize_databases, ReadSlots};
use crate::index::{index_blocks, update_mempool};
#[macro_use]
@ -159,7 +159,15 @@ fn start_program(
Network::Chipnet => "chipnet",
_ => "mainnet",
};
let db = initialize_databases(network_str)?;
let db = initialize_databases(
network_str,
ReadSlots {
cauldron: config.cauldron_read_slots,
bcmr: config.bcmr_read_slots,
crc20: config.crc20_read_slots,
oracle: config.oracle_read_slots,
},
)?;
// Create a shared flag for indexing status
let indexing_in_progress = Arc::new(AtomicBool::new(false));