risingwavelabs/risingwave · warning · HummockError

Next epoch error

Error message

Next epoch error: {0}

What it means

A request to advance to or fetch Hummock's next epoch failed, with the reason in the String payload. This is thrown when the epoch-advance/next-epoch path (used by writers and barriers) cannot produce the next epoch. The string carries the underlying reason.

Solutions

  1. Retry the operation after confirming the meta node is healthy.
  2. Check meta node logs for barrier/epoch-advance failures and network issues.
  3. Restart the affected node/cluster to rebuild epoch state after an abnormal shutdown.
  4. Report with the wrapped message if epoch advancement repeatedly fails.
Defensive patterns

Strategy: retry

Try / catch

// Rust
match hummock_advance_epoch(...) {
    Err(e) if e.to_string().starts_with("Next epoch error") => {
        // retry after meta health check; escalate if persistent
    }
    r => r?,
}

Prevention

When it happens

Trigger: Writer/barrier paths calling Hummock's next-epoch or epoch-advance APIs when the underlying meta/state operation fails.

Common situations: Meta node unavailability or barrier delivery failure; epoch state corruption after crash; network partition preventing epoch propagation.

Understand the failure class

Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.

Related errors


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

Appendix: source

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

    #[error("Invalid block")]
    InvalidBlock,
    #[error("Encode error: {0}")]
    EncodeError(String),
    #[error("Decode error: {0}")]
    DecodeError(String),
    #[error("ObjectStore failed with IO error: {0}")]
    ObjectIoError(
        #[from]
        #[backtrace]
        ObjectError,
    ),
    #[error("Meta error: {0}")]
    MetaError(String),
    #[error("SharedBuffer error: {0}")]
    SharedBufferError(String),
    #[error("Wait epoch error: {0}")]
    WaitEpoch(String),
    #[error("Next epoch error: {0}")]
    NextEpoch(String),
    #[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}")]

View on GitHub (pinned to 6469eb736d)