risingwavelabs/risingwave · error

object {} not found

Error message

object {} not found

What it means

handle_vacuum looks up the requested object (expected to be an Iceberg sink) by name; if no catalog object matches the given name, it bails with "object {} not found". VACUUM only operates on Iceberg sinks, so the name must resolve to a known sink in the database.

Source

Thrown at src/frontend/src/handler/vacuum.rs:118

            if let Some(connector_type) = sink.properties.get(CONNECTOR_TYPE_KEY) {
                if connector_type == "iceberg" {
                    sink.id
                } else {
                    return Err(ErrorCode::InvalidInputSyntax(format!(
                        "VACUUM can only be used on Iceberg sinks, but sink '{}' is of type '{}'",
                        real_object_name, connector_type
                    ))
                    .into());
                }
            } else {
                return Err(ErrorCode::InvalidInputSyntax(format!(
                    "VACUUM can only be used on Iceberg sinks, but sink '{}' has no connector type specified",
                    real_object_name
                ))
                    .into());
            }
        } else {
            bail!("object {} not found", real_object_name);
        }
    };

    let mut shutdown_rx = session.reset_cancel_query_flag();

    if full {
        // VACUUM FULL compacts data files before rewriting the resulting manifests.
        await_cancelable(
            &mut shutdown_rx,
            session.env().meta_client().compact_iceberg_table(sink_id),
        )
        .await?;
    }

    // Run the same eligibility check as periodic manifest maintenance immediately,
    // then expire snapshots so replaced manifests can be cleaned up.
    await_cancelable(
        &mut shutdown_rx,

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Run `SHOW SINKS` and verify the exact sink name before running VACUUM.
  2. Quote the identifier with correct case if it contains uppercase or special characters.
  3. Confirm the VACUUM command is issued against the database/cluster that owns the sink.
  4. Recreate the sink if it was dropped and then run VACUUM.

Example fix

// before
VACUUM 'my_iceberg_sink';
// after
SHOW SINKS; -- confirm name exists first
VACUUM 'my_iceberg_sink';
Defensive patterns

Strategy: validation

Validate before calling

-- run before VACUUM
SELECT sink_name FROM rw_catalog.rw_sinks WHERE sink_name = 'my_iceberg_sink';

Try / catch

match vacuum_result {
    Err(e) if e.to_string().contains("not found") => eprintln!("Sink does not exist; check SHOW SINKS"),
    other => other?,
}

Prevention

When it happens

Trigger: Running `VACUUM '<name>'` (or the handler API) where real_object_name does not match any existing sink/table in the catalog.

Common situations: Typos in the sink name, the sink was dropped before the VACUUM ran, connecting to the wrong database/cluster, or casing mismatches since names are resolved exactly.

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/83651f7f04795cdc. Report an issue: GitHub.