risingwavelabs/risingwave · error · HummockError

CompactionGroup error

Error message

CompactionGroup error: {0}

What it means

HummockError::CompactionGroupError (src/storage/src/hummock/error.rs:71-72, constructor compaction_group_error at error.rs:165-167) wraps failures from the compaction-group subsystem, which manages which SSTables belong to which compaction/group configuration (e.g. groups registered with the meta service, ACL/worker-group filtering). It is thrown when group metadata lookup, registration, or update fails or is inconsistent.

Solutions

  1. Verify the compaction group referenced in the error still exists in meta (query meta's compaction-group tables or metrics)
  2. Re-trigger compaction or the table/group registration; transient meta desync often resolves on the next scheduling pass
  3. Ensure cleanup/drop operations completed fully; if a group was manually deleted, restore it or recreate affected tables/materialized views
  4. Upgrade all nodes to the same version if the error appeared after a rolling upgrade

Example fix

// before: compactor panics on missing group state
// after: validate group existence before scheduling
let groups = hummock_manager.list_compaction_groups().await?;
let group_exists = groups.iter().any(|g| g.id == task.compaction_group_id);
if !group_exists {
    // skip/reschedule instead of surfacing CompactionGroup error
    return Ok(CompactionStatus::Ignored);
}
Defensive patterns

Strategy: try-catch

Validate before calling

// before scheduling compaction for a task, confirm the group exists
let groups = hummock_manager.list_compaction_groups().await?;
assert!(
    groups.iter().any(|g| g.id == task.compaction_group_id),
    "compaction group {} no longer exists",
    task.compaction_group_id
);

Type guard

fn is_compaction_group_err(e: &HummockError) -> bool {
    e.to_report_string().starts_with("CompactionGroup error:")
}

Try / catch

match schedule_compaction(task).await {
    Err(e) if is_compaction_group_err(&e) => {
        warn!(error = %e.report(), group = task.compaction_group_id, "group state invalid; rescheduling");
        CompactionStatus::Ignored // let scheduler re-derive group state
    }
    other => other,
}

Prevention

When it happens

Trigger: Looking up or updating a compaction group's config (member tables, compaction config) via the meta client fails; a table is mapped to a group that no longer exists; validating compaction-group state during compactor task scheduling.

Common situations: Objects belonging to a group deleted while a compaction task referencing them is still in flight; manual table/group manipulation or cleanup tools desynchronizing meta state; version upgrade changing group metadata schema.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


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

Appendix: source

Thrown at src/storage/src/hummock/error.rs:71

    #[error("Time-travel version expired: table {table_id}, epoch {epoch}")]
    TimeTravelVersionExpired { table_id: TableId, epoch: u64 },
    #[error(
        "Committed epoch mismatch: table {table_id}, committed_epoch {committed_epoch}, read_epoch {read_epoch}"
    )]
    CommittedEpochMismatch {
        table_id: TableId,
        committed_epoch: u64,
        read_epoch: u64,
    },
    #[error("Barrier read is unavailable for now. Likely the cluster is recovering")]
    ReadCurrentEpoch,
    #[error("CompactionExecutor error: {0}")]
    CompactionExecutor(String),
    #[error("FileCache error: {0}")]
    FileCache(String),
    #[error("SstObjectIdTracker error: {0}")]
    SstObjectIdTrackerError(String),
    #[error("CompactionGroup error: {0}")]
    CompactionGroupError(String),
    #[error("SstableUpload error: {0}")]
    SstableUploadError(String),
    #[error("Read backup error: {0}")]
    ReadBackupError(String),
    #[error("Foyer error: {0}")]
    FoyerError(#[from] foyer::Error),
    #[error("Other error: {0}")]
    Other(String),
}

impl HummockError {
    pub fn invalid_format_version(v: u32) -> HummockError {
        HummockErrorInner::InvalidFormatVersion(v).into()
    }

    pub fn invalid_block() -> HummockError {
        HummockErrorInner::InvalidBlock.into()

View on GitHub (pinned to 6469eb736d)