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

  1. Bootstrap the DB first (commit genesis through the executor bootstrap path) before constructing Executor
  2. Check your config for the correct existing DB path (db_dir) that contains prior chain state
  3. 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

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


AI-assisted analysis of diem/diem@fc4714a8ea (2026-09-04). Data as JSON: /api/errors/aec769a2ee7caf94. Report an issue: GitHub.