{"record":{"id":"2bc50edf1dc66977","repo":"risingwavelabs/risingwave","slug":"sstobjectidtracker-error-0","errorCode":null,"errorMessage":"SstObjectIdTracker error: {0}","messagePattern":"SstObjectIdTracker error: (.+?)","errorType":"exception","errorClass":"HummockError","httpStatus":null,"severity":"error","filePath":"src/storage/src/hummock/error.rs","lineNumber":69,"sourceCode":"    #[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 {\n    pub fn invalid_format_version(v: u32) -> HummockError {\n        HummockErrorInner::InvalidFormatVersion(v).into()\n    }\n","sourceCodeStart":51,"sourceCodeEnd":87,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/storage/src/hummock/error.rs#L51-L87","documentation":"HummockError::SstObjectIdTrackerError (src/storage/src/hummock/error.rs:69-70, constructor sst_object_id_tracker_error at error.rs:161-163) wraps a failure of the SST object-id allocator, the component that hands out monotonically increasing unique IDs for SSTables (typically fetched from the meta service). It signals an object-ID could not be allocated, initialized, or persisted consistently.","triggerScenarios":"The compactor or streaming compute node requests a batch of SST object IDs from the meta node and the allocation fails or the ID tracker state is inconsistent; the tracker's internal range is exhausted or its persisted state cannot be read.","commonSituations":"Meta node connectivity or meta store issues during heavy compaction/write load; version skew after upgrade where tracker metadata format changed; a cluster recovering while ID ranges are being re-acquired.","solutions":["Check meta node health and connectivity from compute/compactor nodes, since ID allocation is served by meta","Retry the operation; ID allocation is transiently retried and usually succeeds once meta is reachable","Verify all nodes run compatible RisingWave versions (tracker metadata format is version-sensitive)","Inspect the meta store (e.g. state tables in the meta backend) for corruption if errors persist after meta recovers"],"exampleFix":"// before: compactor fails hard on SstObjectIdTracker error during meta blip\n// after: retry ID allocation transiently\nlet ids = match hummock_manager.alloc_sst_ids(n).await {\n    Ok(ids) => ids,\n    Err(e) if e.is_meta_error() || e.to_string().contains(\"SstObjectIdTracker\") => {\n        retry::retry_async(RETRY_INTERVAL, |_, _| Ok(())).await?;\n        hummock_manager.alloc_sst_ids(n).await?\n    }\n    Err(e) => return Err(e),\n};","handlingStrategy":"retry","validationCode":"// before heavy write/compaction work, check meta connectivity\nlet health = meta_client.get_cluster_info().await;\nassert!(health.is_ok(), \"meta node unreachable; SST id allocation will fail\");","typeGuard":"fn is_sst_object_id_tracker_err(e: &HummockError) -> bool {\n    e.to_report_string().starts_with(\"SstObjectIdTracker error:\")\n}","tryCatchPattern":"match hummock_manager.alloc_sst_ids(n).await {\n    Err(e) if is_sst_object_id_tracker_err(&e) => {\n        // allocation is transient: back off and retry while meta recovers\n        retry::retry_async(retry::RETRY_INTERVAL, |_, _| Ok(())).await?;\n        hummock_manager.alloc_sst_ids(n).await\n    }\n    other => other,\n}","preventionTips":["Monitor meta node health and meta store latency; ID allocation depends on it","Keep all nodes on the same RisingWave version during rolling upgrades","Retry id-allocation errors instead of dropping tasks; they are usually transient","Avoid running cleanup tools against meta state while the cluster is under write load"],"tags":["storage","hummock","meta","sstable","id-allocation"],"backgroundTag":"resource-not-found","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}