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
- Run `SHOW SINKS` and verify the exact sink name before running VACUUM.
- Quote the identifier with correct case if it contains uppercase or special characters.
- Confirm the VACUUM command is issued against the database/cluster that owns the sink.
- 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
- Always list sinks (SHOW SINKS) and copy the exact name.
- Use consistent lowercase identifier naming to avoid case issues.
- Check the target sink has a connector type (Iceberg) before vacuuming.
- Run VACUUM against the same database/connection used to create the sink.
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
- `catalog.type` must be set
- Failed to list iceberg namespaces.
- Failed to load iceberg table.
- Failed to drop iceberg table.
- register_table is not supported by JniCatalog
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/83651f7f04795cdc.
Report an issue: GitHub.