risingwavelabs/risingwave · error · HummockError

SstObjectIdTracker error: {0}

Error message

SstObjectIdTracker error: {0}

What it means

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.

Source

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

    #[error("Change log retention miss: table {table_id}, epoch {epoch}")]
    ChangeLogRetentionMiss { table_id: TableId, epoch: u64 },
    #[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()
    }

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Check meta node health and connectivity from compute/compactor nodes, since ID allocation is served by meta
  2. Retry the operation; ID allocation is transiently retried and usually succeeds once meta is reachable
  3. Verify all nodes run compatible RisingWave versions (tracker metadata format is version-sensitive)
  4. Inspect the meta store (e.g. state tables in the meta backend) for corruption if errors persist after meta recovers

Example fix

// before: compactor fails hard on SstObjectIdTracker error during meta blip
// after: retry ID allocation transiently
let ids = match hummock_manager.alloc_sst_ids(n).await {
    Ok(ids) => ids,
    Err(e) if e.is_meta_error() || e.to_string().contains("SstObjectIdTracker") => {
        retry::retry_async(RETRY_INTERVAL, |_, _| Ok(())).await?;
        hummock_manager.alloc_sst_ids(n).await?
    }
    Err(e) => return Err(e),
};
Defensive patterns

Strategy: retry

Validate before calling

// before heavy write/compaction work, check meta connectivity
let health = meta_client.get_cluster_info().await;
assert!(health.is_ok(), "meta node unreachable; SST id allocation will fail");

Type guard

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

Try / catch

match hummock_manager.alloc_sst_ids(n).await {
    Err(e) if is_sst_object_id_tracker_err(&e) => {
        // allocation is transient: back off and retry while meta recovers
        retry::retry_async(retry::RETRY_INTERVAL, |_, _| Ok(())).await?;
        hummock_manager.alloc_sst_ids(n).await
    }
    other => other,
}

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Understand the failure class

Background: 'Could not be found', 'does not exist', 'not found in database': the resource-not-found family when an ID, slug, key, or URI lookup comes back empty — this error's family across 20 libraries.

Related errors


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