59ee532bf6
The secure-messaging store (smsgDB) used the LevelDB API directly. Mass- mapped to the equivalent RocksDB types: leveldb::DB/Status/WriteBatch/ Iterator/Slice/ReadOptions/WriteOptions/WriteBatch::Handler -> rocksdb::*. The RocksDB API surface for our usage is binary-compatible — pure namespace substitution, no semantic changes. Consumers in rpcsmessage.cpp and qt/messagemodel.cpp updated to match. RocksDB now becomes a hard build dependency (was optional behind BUILD_ROCKSDB). The chain-DB rocksdb backend is consequently always available; -chaindb=leveldb remains the default until the Phase-4 LevelDB retirement. Removed the BUILD_ROCKSDB cmake option, the #ifdef BUILD_ROCKSDB guards in txdb*, and the runtime error path that triggered when the flag was off. CI updated: librocksdb-dev (Ubuntu), mingw-w64-x86_64-rocksdb (MSYS2), and rocksdb (Homebrew) added to all build jobs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Chain DB benchmark harness
Measures FastImportBlockFile() speed under each chain-DB backend
(LevelDB vs RocksDB) using a user-supplied blk0001.dat block stream.
Prerequisites
- A
trianglesdbinary (RocksDB is now a hard build dep, both backends are always available):cmake -B build -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_QT=OFF \ -DBUILD_DAEMON=ON cmake --build build - An
blk0001.datfile (old-style block stream). If you have a synced node, copy~/.triangles/blk0001.dat(Linux) or%APPDATA%\triangles\blk0001.dat(Windows). - Free disk space: ~3× the size of
blk0001.datper backend run (raw blocks + chain DB index + working space).
Usage
contrib/bench/bench-chaindb.sh \
--binary=$(pwd)/build/bin/trianglesd \
--bootstrap=/path/to/blk0001.dat
Runs each backend in turn, appends a CSV row to ./bench-results.csv,
and prints a summary to stdout. Default --dbcache=2048 (MB).
Options
| Flag | Default | Notes |
|---|---|---|
--binary=PATH |
(required) | Path to trianglesd |
--bootstrap=PATH |
(required) | Path to blk0001.dat |
--backends=LIST |
leveldb,rocksdb |
Comma-separated subset |
--workdir=DIR |
/tmp/triangles-bench-XXXXXX |
Per-backend datadirs go here |
--dbcache=MB |
2048 |
Chain DB cache size |
--results-csv=FILE |
./bench-results.csv |
Appended to |
--keep-datadirs |
off | Preserve datadirs after run for inspection |
--rpc-port=BASE |
19112 |
Each backend uses BASE+offset |
What it measures
| Column | Source |
|---|---|
wall_ms |
The daemon's own log line: FastImportBlockFile: indexed N blocks in Mms |
peak_rss_kb |
ps -o rss= sampled once per second |
datadir_bytes |
du -sb of the working datadir (includes blk0001.dat) |
blocks_indexed |
Parsed from the same log line |
What it does not measure
- Network IBD (peer fetch, header sync) — this is pure DB ingest.
- UTXO snapshot load —
LoadSnapshotis currently rocksdb-guarded (seesrc/utxosnapshot.cpp); will be unblocked when LevelDB is retired. - Reorg cost — separate test, not yet implemented.
- Disk I/O bytes (read/written) — could be added with
iostatintegration.
Interpreting results
A meaningful comparison requires both rows to have run on the same machine
with the same blk0001.dat. The host column makes mixing runs across
machines visible in the CSV.
Backend-relevant size comparisons should subtract bootstrap_size_bytes
from datadir_bytes to isolate the chain DB tree.
One-liners
# LevelDB only
./bench-chaindb.sh --binary=... --bootstrap=... --backends=leveldb
# Compare 2GB vs 4GB cache on RocksDB
./bench-chaindb.sh --binary=... --bootstrap=... --backends=rocksdb --dbcache=2048
./bench-chaindb.sh --binary=... --bootstrap=... --backends=rocksdb --dbcache=4096
# Keep the datadirs for poking around afterwards
./bench-chaindb.sh --binary=... --bootstrap=... --keep-datadirs