risingwavelabs/risingwave · error · Error

Other error

Error message

Other error: {0}

What it means

The in-memory object store returns Error::Other for any failure that is not a missing key — e.g. I/O errors surfaced while operating on the memory store. It is a generic fallback variant converted into ObjectError for callers.

Solutions

  1. Inspect the embedded message for the underlying cause
  2. If running under madsim, check simulated failure injection settings
  3. Re-run the test or workload — transient simulated faults may not recur
  4. Report a bug if the mem store (which should not fail) returns Other in normal use

Example fix

// before: ignoring the distinction between variants
Err(e) => return Err(e.into()),
// after: branch on the known variants
Err(e @ crate::object::mem::Error::NotFound(_)) => { /* handle absence */ }
Err(e) => return Err(ObjectError::internal(e.to_string())),
Defensive patterns

Strategy: try-catch

Validate before calling

null

Type guard

fn is_other_mem_error(e: &crate::object::mem::Error) -> bool {
    matches!(e, crate::object::mem::Error::Other(_))
}

Try / catch

match mem_store.read(key, None).await {
    Ok(d) => d,
    Err(e @ crate::object::mem::Error::NotFound(_)) => { /* absence path */ }
    Err(e) => return Err(ObjectError::internal(format!("mem store: {}", e))),
}

Prevention

When it happens

Trigger: Any mem-store operation failing for reasons other than absence of the key, such as wrapped IO errors or unexpected state in test/madsim environments.

Common situations: Test harness bugs, simulated IO failures in madsim, or misuse of the mem store API outside its supported behavior.

Related errors


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

Appendix: source

Thrown at src/object_store/src/object/mem.rs:38

use bytes::{BufMut, Bytes, BytesMut};
use fail::fail_point;
use futures::Stream;
use itertools::Itertools;
use risingwave_common::range::RangeBoundsExt;
use thiserror::Error;
use tokio::sync::Mutex;

use super::{
    ObjectError, ObjectMetadata, ObjectRangeBounds, ObjectResult, ObjectStore, StreamingUploader,
};
use crate::object::{ObjectDataStream, ObjectMetadataIter};

#[derive(Error, Debug)]
pub enum Error {
    #[error("NotFound error: {0}")]
    NotFound(String),
    #[error("Other error: {0}")]
    Other(String),
}

impl Error {
    pub fn is_object_not_found_error(&self) -> bool {
        matches!(self, Error::NotFound(_))
    }
}

impl Error {
    fn not_found(msg: impl ToString) -> Self {
        Error::NotFound(msg.to_string())
    }

    fn other(msg: impl ToString) -> Self {
        Error::Other(msg.to_string())
    }
}

View on GitHub (pinned to 6469eb736d)