{"record":{"id":"9ec8fb5e1749e18a","repo":"risingwavelabs/risingwave","slug":"storage-error-0-9ec8fb","errorCode":null,"errorMessage":"Storage error: {0}","messagePattern":"Storage error: (.+?)","errorType":"error_code","errorClass":"ErrorCode::StorageError","httpStatus":null,"severity":"error","filePath":"src/frontend/src/error.rs","lineNumber":67,"sourceCode":"        #[backtrace]\n        anyhow::Error,\n    ),\n    #[error(\"connector error: {0}\")]\n    ConnectorError(\n        #[source]\n        #[backtrace]\n        BoxedError,\n    ),\n    #[error(transparent)]\n    NotImplemented(#[from] NotImplemented),\n    // Tips: Use this only if it's intended to reject the query\n    #[error(\"Not supported: {0}\\nHINT: {1}\")]\n    NotSupported(String, String),\n    #[error(transparent)]\n    NoFunction(#[from] NoFunction),\n    #[error(transparent)]\n    IoError(#[from] std::io::Error),\n    #[error(\"Storage error: {0}\")]\n    StorageError(\n        #[backtrace]\n        #[source]\n        BoxedError,\n    ),\n    #[error(\"Expr error: {0}\")]\n    ExprError(\n        #[source]\n        #[backtrace]\n        BoxedError,\n    ),\n    // TODO(error-handling): there's a limitation that `#[transparent]` can't be used with `#[backtrace]` if no `#[from]`\n    // So we emulate a transparent error with \"{0}\" display here.\n    #[error(\"{0}\")]\n    BatchError(\n        #[source]\n        #[backtrace]\n        // `BatchError`","sourceCodeStart":49,"sourceCodeEnd":85,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/frontend/src/error.rs#L49-L85","documentation":"`ErrorCode::StorageError` wraps a type-erased `BoxedError` propagated from the storage engine (Hummock/state store). The storage layer's own error is preserved as `#[source]`; the display string just prefixes 'Storage error:'.","triggerScenarios":"Frontend or batch/stream operators interact with the state store and it fails: S3/GCS object-store auth or connectivity failures, hummock RPC errors to the meta node, read/write of table state.","commonSituations":"Wrong object-store credentials (access key expired), S3 endpoint misconfiguration, network partition between compute and meta/S3, bucket permissions.","solutions":["Inspect the `#[source]`/chained error for the storage-specific cause","Verify object-store config (endpoint, region, credentials) in the RisingWave configuration","Test bucket access with aws/gs CLI from the same network","Check meta node logs for hummock errors","Restart/restore connectivity and retry the failing operation"],"exampleFix":null,"handlingStrategy":"retry","validationCode":"null","typeGuard":"fn is_storage_error(e: &RwError) -> bool { matches!(e.get_code(), ErrorCode::StorageError(_)) }","tryCatchPattern":"if matches!(err.get_code(), ErrorCode::StorageError(_)) { backoff_retry(op, max_attempts=3); } // only retry transient causes","preventionTips":["Monitor object-store credentials expiry and rotate proactively","Health-check S3/GCS endpoints from the cluster","Alert on meta-node/hummock errors early","Keep object-store config under versioned review"],"tags":["storage","hummock","s3","state-store"],"backgroundTag":"database-query-failed","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}