risingwavelabs/risingwave · critical · HummockError
Checksum mismatch: expected
Error message
Checksum mismatch: expected {expected}, found: {found} What it means
Hummock verified a data block's checksum after reading it from the object store and the computed value did not match the stored expected value. This indicates the data bytes were corrupted in transit or at rest. The library throws it to prevent serving corrupt data.
Solutions
- Delete/redownload the affected SST and let Hummock re-fetch from the object store.
- Verify object integrity in the object store (re-upload from replica or restore from backup) for the listed file.
- Check hardware health (disk SMART, memory) and network path if corruption recurs.
- Full recovery: restore the cluster's data from backup/snapshot and rebuild the affected tables.
Example fix
// before: keeping suspect object aws s3 cp s3://bucket/hummock_xx ./corrupt --no-verify // after aws s3api head-object s3://bucket/hummock_xx # compare checksum, then delete object and recreate table from backup
Defensive patterns
Strategy: try-catch
Try / catch
// Rust
match hummock_read(...) {
Err(e) if e.to_string().starts_with("Checksum mismatch") => {
// alert on corruption; do not blindly retry same object — delete & recover
}
r => r?,
} Prevention
- Enable checksum verification on uploads to the object store.
- Monitor disk/memory health on nodes touching storage data.
- Keep backups/snapshots of hummock data for recovery.
- Avoid manual modification of objects in the hummock bucket.
When it happens
Trigger: Reading a block from an SST (via BlockHeader/checksum validation) where computed checksum != stored expected: expected u64 vs found u64.
Common situations: Faulty disk or S3 object corruption; network bit-flips without TLS/verified uploads; a truncated or partially written SST; manual tampering with object store contents.
Understand the failure class
Background: Checksum mismatch errors: "checksum verification failed", "digest mismatch", "expected vs actual checksum" — what they mean and how to fix them — this error's family across 41 libraries.
Related errors
- Invalid block
- Barrier read is unavailable for now. Likely the cluster is…
- Change log retention miss: table
- Committed epoch mismatch: table
- CompactionExecutor error
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/b633ddeefe7389f6.
Report an issue: GitHub.
Appendix: source
Thrown at src/storage/src/hummock/error.rs:29
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use risingwave_object_store::object::ObjectError;
use risingwave_pb::id::TableId;
use thiserror::Error;
use thiserror_ext::AsReport;
use tokio::sync::oneshot::error::RecvError;
// TODO(error-handling): should prefer use error types than strings.
#[derive(Error, thiserror_ext::ReportDebug, thiserror_ext::Arc)]
#[thiserror_ext(newtype(name = HummockError, backtrace))]
pub enum HummockErrorInner {
#[error("Magic number mismatch: expected {expected}, found: {found}")]
MagicMismatch { expected: u32, found: u32 },
#[error("Invalid format version: {0}")]
InvalidFormatVersion(u32),
#[error("Checksum mismatch: expected {expected}, found: {found}")]
ChecksumMismatch { expected: u64, found: u64 },
#[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}")]View on GitHub (pinned to 6469eb736d)