{"record":{"id":"e87066c03b43d165","repo":"risingwavelabs/risingwave","slug":"compactionexecutor-error-0","errorCode":null,"errorMessage":"CompactionExecutor error: {0}","messagePattern":"CompactionExecutor error: (.+?)","errorType":"exception","errorClass":"HummockError","httpStatus":null,"severity":"error","filePath":"src/storage/src/hummock/error.rs","lineNumber":65,"sourceCode":"    #[error(\"Wait epoch error: {0}\")]\n    WaitEpoch(String),\n    #[error(\"Next epoch error: {0}\")]\n    NextEpoch(String),\n    #[error(\"Change log retention miss: table {table_id}, epoch {epoch}\")]\n    ChangeLogRetentionMiss { table_id: TableId, epoch: u64 },\n    #[error(\"Time-travel version expired: table {table_id}, epoch {epoch}\")]\n    TimeTravelVersionExpired { table_id: TableId, epoch: u64 },\n    #[error(\n        \"Committed epoch mismatch: table {table_id}, committed_epoch {committed_epoch}, read_epoch {read_epoch}\"\n    )]\n    CommittedEpochMismatch {\n        table_id: TableId,\n        committed_epoch: u64,\n        read_epoch: u64,\n    },\n    #[error(\"Barrier read is unavailable for now. Likely the cluster is recovering\")]\n    ReadCurrentEpoch,\n    #[error(\"CompactionExecutor error: {0}\")]\n    CompactionExecutor(String),\n    #[error(\"FileCache error: {0}\")]\n    FileCache(String),\n    #[error(\"SstObjectIdTracker error: {0}\")]\n    SstObjectIdTrackerError(String),\n    #[error(\"CompactionGroup error: {0}\")]\n    CompactionGroupError(String),\n    #[error(\"SstableUpload error: {0}\")]\n    SstableUploadError(String),\n    #[error(\"Read backup error: {0}\")]\n    ReadBackupError(String),\n    #[error(\"Foyer error: {0}\")]\n    FoyerError(#[from] foyer::Error),\n    #[error(\"Other error: {0}\")]\n    Other(String),\n}\n\nimpl HummockError {","sourceCodeStart":47,"sourceCodeEnd":83,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/storage/src/hummock/error.rs#L47-L83","documentation":"A generic wrapper for failures inside the Hummock compaction executor — the component that merges SSTs, runs GC, and executes compaction/backup plans. Any error surfaced by the compaction task machinery (task panic-like conditions, plan execution failures, or explicit cancellations such as the string \"Plan cancelled\", matched in `src/storage/src/hummock/compactor/mod.rs:1621`) is stringified here via `HummockError::compaction_executor(error)` in src/storage/src/hummock/error.rs:157.","triggerScenarios":"Compaction/backup/iceberg-compaction task execution fails or is cancelled; `HummockError::compaction_executor(err.to_string())` is called from compactor task code, including `\"Plan cancelled\"` messages when a compaction plan is aborted (e.g. during shutdown or plan replacement).","commonSituations":"Compactor shutdown or barrier-driven plan cancellation (benign \"Plan cancelled\"); S3/object-store I/O failures during compaction write/upload; compaction task crash or panic under memory pressure; an incompatible or corrupted SST input in a merge.","solutions":["If the message is \"Plan cancelled\", treat it as a benign cancellation — the compaction plan was superseded or the compactor is stopping; no action needed.","Inspect the wrapped message and compactor logs for the underlying cause (object-store errors, task panics) and fix that root cause.","If compaction repeatedly fails, check object storage connectivity/credentials and compactor memory settings.","If needed, re-trigger compaction for the affected compaction group after the compactor is healthy."],"exampleFix":"// before: cancelling is surfaced as a real failure\nif err.inner() == &HummockError::compaction_executor(\"Plan cancelled\") { return Err(err); }\n// after: ignore cancellation, propagate the rest\nfn is_cancelled_iceberg_compaction_error(err: &HummockError) -> bool {\n    matches!(err.inner(), HummockErrorInner::CompactionExecutor(message) if message == \"Plan cancelled\")\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":"fn is_plan_cancelled(err: &HummockError) -> bool {\n    matches!(err.inner(), HummockErrorInner::CompactionExecutor(m) if m == \"Plan cancelled\")\n}","tryCatchPattern":"match err.inner() {\n    HummockErrorInner::CompactionExecutor(msg) if msg == \"Plan cancelled\" => {\n        // benign: plan was superseded or compactor is stopping; ignore or log at info\n    }\n    HummockErrorInner::CompactionExecutor(msg) => {\n        // inspect underlying compaction failure and surface it\n    }\n    _ => return Err(err),\n}","preventionTips":["Explicitly classify \"Plan cancelled\" as benign so shutdowns and plan replacements do not alarm.","Monitor compactor memory and object-store error rates — most non-cancellation causes originate there.","Alert on repeated compaction_executor failures for the same compaction group.","Keep SST merge inputs valid; verify object-store checksums on upload."],"tags":["storage","hummock","compaction","executor"],"backgroundTag":"internal-invariant-violation","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}