risingwavelabs/risingwave · error · StorageError

Deserialize row error

Error message

Deserialize row error: {0}

What it means

A StorageError variant wrapping ValueEncodingError. It is raised when a stored row value cannot be decoded with the expected value encoding, usually because bytes on disk do not match the serializer expected by the column/schema.

Solutions

  1. Confirm the reading code uses the same value encoding as the writer (check version/feature flags) and align them
  2. If this follows an upgrade, follow the documented migration path for value-encoding changes instead of reading old-format data directly
  3. If data is corrupt, restore from backup or re-ingest the affected tables
Defensive patterns

Strategy: try-catch

Try / catch

match read_row(key).await {
    Err(e) if matches!(e.kind(), StorageErrorKind::DeserializeRow(_)) => {
        // value written with different encoding/version: handle old data or restore
    }
    other => other,
}

Prevention

When it happens

Trigger: Reading a key whose value bytes fail ValueEncoding deserialization — e.g. data written by an older RisingWave version with a different encoding, or a corrupt value in the state store.

Common situations: Upgrading a cluster across a value-encoding change and reading old data; manual data migration between clusters; bit-rot or bad writes in object storage.

Understand the failure class

Background: "failed to unmarshal" / json.Unmarshal errors: why parsing a response into a Go struct fails and how to fix it — this error's family across 23 libraries.

Related errors


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

Appendix: source

Thrown at src/storage/src/error.rs:31

// limitations under the License.

use risingwave_common::util::value_encoding::error::ValueEncodingError;
use thiserror::Error;

use crate::hummock::HummockError;
use crate::mem_table::MemTableError;

#[derive(Error, thiserror_ext::ReportDebug, thiserror_ext::Box)]
#[thiserror_ext(newtype(name = StorageError, backtrace))]
pub enum ErrorKind {
    #[error("Hummock error: {0}")]
    Hummock(
        #[backtrace]
        #[from]
        HummockError,
    ),

    #[error("Deserialize row error: {0}")]
    DeserializeRow(
        #[from]
        #[backtrace]
        ValueEncodingError,
    ),

    #[error("Serialize/deserialize error: {0}")]
    SerdeError(
        #[from]
        #[backtrace]
        memcomparable::Error,
    ),

    #[error("Sled error: {0}")]
    Sled(
        #[backtrace]
        #[from]
        sled::Error,

View on GitHub (pinned to 6469eb736d)