diem/diem · critical
DB not bootstrapped.
Error message
DB not bootstrapped.
What it means
Executor::new requires a bootstrapped database: get_startup_info() must return Some(startup_info) since the executor needs the latest ledger info/accumulator to build its speculation cache. An empty (never bootstrapped) DB has no startup info, so the constructor panics.
Source
Thrown at execution/executor/src/lib.rs:90
cache: RwLock<SpeculationCache>,
phantom: PhantomData<V>,
}
impl<V> Executor<V>
where
V: VMExecutor,
{
pub fn committed_block_id(&self) -> HashValue {
self.cache.read().committed_block_id()
}
/// Constructs an `Executor`.
pub fn new(db: DbReaderWriter) -> Self {
let startup_info = db
.reader
.get_startup_info()
.expect("Shouldn't fail")
.expect("DB not bootstrapped.");
Self {
db,
cache: RwLock::new(SpeculationCache::new_with_startup_info(startup_info)),
phantom: PhantomData,
}
}
fn reset_cache(&self) -> Result<(), Error> {
let startup_info = self
.db
.reader
.get_startup_info()?
.ok_or_else(|| format_err!("DB not bootstrapped."))?;
*self.cache.write() = SpeculationCache::new_with_startup_info(startup_info);
Ok(())
}
View on GitHub (pinned to fc4714a8ea)
Solutions
- Bootstrap the DB first (commit genesis through the executor bootstrap path) before constructing Executor
- Check your config for the correct existing DB path (db_dir) that contains prior chain state
- If intentional fresh start, run the genesis bootstrap step in your node startup script before creating the Executor
Example fix
// before let executor = Executor::<LibraVM>::new(db); // after executor::commit_genesis(&db, vm_config, genesis_blob, genesis_waypoint)?; let executor = Executor::<LibraVM>::new(db);
Defensive patterns
Strategy: validation
Validate before calling
if db.reader.get_startup_info().map_err(|e| e.to_string())?.is_none() {
// bootstrap genesis before constructing Executor
executor::commit_genesis(&db, vm_config, genesis_exec_output, genesis_waypoint)?;
} Prevention
- Run genesis bootstrap as a mandatory startup step before Executor::new
- Validate db_dir config points at an existing, initialized DB
- Monitor storage initialization in node startup scripts
When it happens
Trigger: Calling Executor::new(db) against a storage instance that has never had the genesis transaction committed via executor::commit_genesis (or equivalent bootstrap).
Common situations: Pointing a node at a fresh/empty DB directory without running bootstrap first; misconfigured DB path pointing to the wrong volume; storage wiped after a crash.
Related errors
- Unable to read key at the specified path
- [BlockStore] failed to insert quorum during build{:?}
- [diem-node] failed fetching synced version.
- Unable to initialize storage
- Unable to write key to file at specified path
AI-assisted analysis of diem/diem@fc4714a8ea (2026-09-04).
Data as JSON: /api/errors/aec769a2ee7caf94.
Report an issue: GitHub.