{"record":{"id":"09137ee978623dfb","repo":"risingwavelabs/risingwave","slug":"updatedelete-epoch-different-updateinsert-epoch","errorCode":null,"errorMessage":"UpdateDelete epoch {} different UpdateInsert epoch {}","messagePattern":"UpdateDelete epoch (.+?) different UpdateInsert epoch (.+?)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/stream/src/common/log_store_impl/kv_log_store/serde.rs","lineNumber":812,"sourceCode":"        while let Some(RawLogStoreRow { row_meta, op }) = stream.try_next().await? {\n            if let LogStoreRowOp::Row {\n                seq_id,\n                op: Op::UpdateDelete,\n                row: old_value,\n            } = op\n            {\n                let next_item = stream.try_next().await?;\n                if let Some(row) = next_item {\n                    let next_op = row.op;\n                    let next_row_meta = row.row_meta;\n                    if let LogStoreRowOp::Row {\n                        seq_id: next_seq_id,\n                        op: Op::UpdateInsert,\n                        row: new_value,\n                    } = next_op\n                    {\n                        if row_meta.epoch != next_row_meta.epoch {\n                            return Err(anyhow!(\n                                \"UpdateDelete epoch {} different UpdateInsert epoch {}\",\n                                row_meta.epoch,\n                                next_row_meta.epoch\n                            ));\n                        }\n                        let merged_row_meta = RowMeta {\n                            vnode: row_meta.vnode,\n                            epoch: row_meta.epoch,\n                            size: (row_meta.size + next_row_meta.size),\n                        };\n                        yield LogStoreRow {\n                            op: LogStoreOp::Update {\n                                seq_id: next_seq_id,\n                                new_value,\n                                old_value,\n                            },\n                            row_meta: merged_row_meta,\n                        };","sourceCodeStart":794,"sourceCodeEnd":830,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/stream/src/common/log_store_impl/kv_log_store/serde.rs#L794-L830","documentation":"Guard in the KV log store update decoder: the UpdateInsert half of an update pair belongs to a different epoch than its UpdateDelete half. Both rows of an update must share the same epoch; a mismatch means the stored data is corrupt or the read range straddles updates incorrectly, so decoding fails.","triggerScenarios":"Thrown at src/stream/src/common/log_store_impl/kv_log_store/serde.rs:812 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["An UpdateDelete and its paired UpdateInsert were decoded with different epochs, meaning the update pair is split across epoch boundaries or the log store data is misaligned.","Verify barrier placement so an update pair is never written across epochs; rebuild affected ranges from snapshot if corrupted."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}