risingwavelabs/risingwave · error

table id {} not exist

Error message

table id {} not exist

What it means

The rw benchmark tool looked up the committed epoch at which a materialized-view table's data was committed in the pinned Hummock version, and the table ID had no committed epoch entry. This means the table's data is not present in the current pinned Hummock version, so benchmarking reads against it is impossible.

Source

Thrown at src/ctl/src/cmd_impl/bench.rs:104

    match cmd {
        BenchCommands::Scan {
            mv_name,
            threads,
            data_dir,
            use_new_object_prefix_strategy,
        } => {
            let (hummock, metrics) = context
                .hummock_store_with_metrics(HummockServiceOpts::from_env(
                    data_dir,
                    use_new_object_prefix_strategy,
                )?)
                .await?;
            let table = get_table_catalog(meta.clone(), mv_name).await?;
            let committed_epoch = hummock
                .inner()
                .get_pinned_version()
                .table_committed_epoch(table.id)
                .ok_or_else(|| anyhow!("table id {} not exist", table.id))?;
            let mut handlers = vec![];
            for i in 0..threads {
                let table = table.clone();
                let next_cnt = next_cnt.clone();
                let iter_cnt = iter_cnt.clone();
                let hummock = hummock.clone();
                let handler = spawn_okk(async move {
                    tracing::info!(thread = i, "starting scan");
                    let state_table = {
                        let mut tb = make_state_table(hummock, &table).await;
                        tb.init_epoch(EpochPair::new(u64::MAX, committed_epoch))
                            .await?;
                        tb
                    };
                    loop {
                        let sub_range: &(Bound<OwnedRow>, Bound<OwnedRow>) =
                            &(Unbounded, Unbounded);
                        let stream = state_table

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Wait for or force a hummock commit/checkpoint so the table's data epoch is committed, then rerun the bench
  2. Verify the MV name passed to the bench command exists and has committed data (SELECT from it first)
  3. Use a hummock/meta data directory that matches the current catalog (re-run after a clean MV creation)
  4. Check that you are not pointing at an old/backup hummock version directory

Example fix

// before
./risedev ctl bench --mv-name just_created_mv
// after
# ensure the MV is committed (query it or wait for checkpoint) first
./risedev psql -c 'SELECT count(*) FROM just_created_mv;'
./risedev ctl bench --mv-name just_created_mv
Defensive patterns

Strategy: validation

Validate before calling

if hummock.inner().get_pinned_version().table_committed_epoch(table.id).is_none() {
    eprintln!("table {} has no committed epoch; commit/checkpoint first", table.id);
    return;
}

Prevention

When it happens

Trigger: Running `rw bench` against an MV name whose table id exists in the catalog but has no entry in table_committed_epoch of the pinned version — e.g. the MV was created but its data is not committed, or the meta/hummock version pinned is older than the table creation.

Common situations: Pointing the bench command at a freshly created MV before a checkpoint/commit; using a stale hummock data directory; catalog and hummock version out of sync after restore.

Understand the failure class

Background: "Not found" and "does not exist" errors: why "Task not found", "No such folder", and "Can't find" fire when a lookup comes back empty — this error's family across 14 libraries.

Related errors


AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11). Data as JSON: /api/errors/c85d5fe18426c345. Report an issue: GitHub.