risingwavelabs/risingwave · error · Error

invalid manual compaction option: {0}

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.

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)

Solutions

  1. Check the manual compaction options: confirm the compaction group id exists (SELECT from hummock compaction groups / risectl list)
  2. Re-run with valid table ids/SST ids that belong to the target group
  3. Use risectl to list current compaction groups and levels before issuing the request
  4. 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

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


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