risingwavelabs/risingwave · error · Error
time travel
Error message
time travel
What it means
HummockMetaError::TimeTravel is a generic wrapper (with #[source]/#[backtrace]) around an anyhow::Error produced by time-travel subsystem operations. It carries the underlying cause (backtrace and source chain) for any failure while reading or resolving time-travel versions that is not covered by a more specific variant.
Source
Thrown at src/meta/src/hummock/error.rs:54
#[error(transparent)]
ObjectStore(
#[from]
#[backtrace]
ObjectError,
),
#[error("compactor {0} is disconnected")]
CompactorUnreachable(HummockContextId),
#[error("compaction group error: {0}")]
CompactionGroup(String),
#[error("SST {0} is invalid")]
InvalidSst(HummockSstableObjectId),
#[error("invalid manual compaction option: {0}")]
InvalidManualCompactionOption(String),
#[error("invalid epoch range: {start_epoch}..={end_epoch}")]
InvalidEpochRange { start_epoch: u64, end_epoch: u64 },
#[error("time-travel version expired: table {table_id}, epoch {epoch}")]
TimeTravelVersionExpired { table_id: TableId, epoch: u64 },
#[error("time travel")]
TimeTravel(
#[source]
#[backtrace]
anyhow::Error,
),
#[error(transparent)]
Internal(
#[from]
#[backtrace]
anyhow::Error,
),
}
impl Error {
pub fn retryable(&self) -> bool {
matches!(self, Error::MetaStore(_))
}
}View on GitHub (pinned to 6469eb736d)
Solutions
- Inspect the wrapped source chain and backtrace to find the root cause
- Check object store / meta connectivity and health
- Retry the operation if the underlying cause was transient
- If persistent, capture logs and the backtrace for a bug report
Defensive patterns
Strategy: try-catch
Type guard
fn is_time_travel_error(err: &HummockMetaError) -> bool {
matches!(err, HummockMetaError::TimeTravel(_) | HummockMetaError::TimeTravelVersionExpired { .. })
}
Try / catch
match res {
Err(e @ HummockMetaError::TimeTravel(src)) => {
tracing::error!("time travel failed: {:#}", src);
// inspect source chain / backtrace for root cause
}
other => other?,
}
Prevention
- Always log the full anyhow source chain, not just the wrapper
- Monitor object store and meta health for time-travel reads
- Retry transient underlying causes with backoff
- Keep RisingWave versions consistent across the cluster
When it happens
Trigger: Time-travel APIs that return anyhow::Error internally (lookup of historical versions, interacting with version timeline storage) are converted into this variant via #[from]/map_err.
Common situations: Storage backend errors while reading historical version metadata; decode failures of time-travel records; network/object-store issues during a time-travel lookup.
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
- time-travel version expired: table {table_id}, epoch {epoch}
- invalid time travel delta chain: delta {} has prev version {
- Cannot find the snapshot id in the iceberg table.
- inconsistent hummock version: expected {}, actual {}
- state table {} is not registered to hummock
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/aeddffe51796f242.
Report an issue: GitHub.