risingwavelabs/risingwave · error · Error
invalid manual compaction option
Error message
invalid manual compaction option: {0} What it means
HummockMetaError::InvalidManualCompactionOption wraps validation failures of the options supplied to a manual compaction request. The meta service rejects the request because the provided parameters (e.g. group id, SST id list, epoch range, levels) are empty or logically inconsistent.
Solutions
- Check the manual compaction options: confirm the compaction group id exists (SELECT from hummock compaction groups / risectl list)
- Re-run with valid table ids/SST ids that belong to the target group
- Use risectl to list current compaction groups and levels before issuing the request
- If using scripts, fetch group ids dynamically instead of hardcoding
Example fix
// before risectl hummock manual-compaction --group 99 // after (list valid groups first, then use an existing id) risectl hummock list-compaction-group risectl hummock manual-compaction --group 1
Defensive patterns
Strategy: validation
Validate before calling
let groups = risectl::list_compaction_groups()?;
assert!(groups.contains(&opts.compaction_group_id), "unknown compaction group {}", opts.compaction_group_id);
Type guard
fn validate_manual_compaction_opts(opts: &ManualCompactionOption) -> Result<(), String> {
if opts.compaction_group_id == 0 { Err("compaction_group_id must be set".into()) } else { Ok(()) }
}
Try / catch
match trigger_manual_compaction(opts).await {
Err(e @ HummockMetaError::InvalidManualCompactionOption(_)) => eprintln!("bad options: {e}"),
other => other?,
}
Prevention
- List compaction groups before targeting one
- Fetch group ids dynamically, never hardcode
- Validate options client-side before sending
- Re-check group ids after config/migration changes
When it happens
Trigger: Calling trigger_manual_compaction (via RPC or risectl) with options that fail validation, such as an invalid compaction group id or invalid table/SST selection.
Common situations: Operator typo in risectl hummock manual-compaction arguments; targeting a compaction group that was renamed/removed; scripting compaction with stale group ids after config changes.
Understand the failure class
Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.
Related errors
- invalid epoch range: ..=
- trigger_manual_compaction No compactor is available…
- Unsupported task type for copy-on-write iceberg compaction
- bounded compaction head sequence
- bounded compaction is not supported for copy-on-write tasks
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/43859d6d65e79c2d.
Report an issue: GitHub.
Appendix: source
Thrown at src/meta/src/hummock/error.rs:48
#[error("failed to access meta store")]
MetaStore(
#[source]
#[backtrace]
anyhow::Error,
),
#[error(transparent)]
ObjectStore(
#[from]
#[backtrace]
ObjectError,
),
#[error("compactor {0} is disconnected")]
CompactorUnreachable(HummockContextId),
#[error("compaction group error: {0}")]
CompactionGroup(String),
#[error("SST {0} is invalid")]
InvalidSst(HummockSstableObjectId),
#[error("invalid manual compaction option: {0}")]
InvalidManualCompactionOption(String),
#[error("invalid epoch range: {start_epoch}..={end_epoch}")]
InvalidEpochRange { start_epoch: u64, end_epoch: u64 },
#[error("time-travel version expired: table {table_id}, epoch {epoch}")]
TimeTravelVersionExpired { table_id: TableId, epoch: u64 },
#[error("time travel")]
TimeTravel(
#[source]
#[backtrace]
anyhow::Error,
),
#[error(transparent)]
Internal(
#[from]
#[backtrace]
anyhow::Error,
),
}View on GitHub (pinned to 6469eb736d)