diff --git a/src/traft/rpc/cas.rs b/src/traft/rpc/cas.rs index cffc9e811c4941acd869307faff534248c668028..0b0b01d427f8728bc1bd3af8b2f3b0923f240ec9 100644 --- a/src/traft/rpc/cas.rs +++ b/src/traft/rpc/cas.rs @@ -41,18 +41,12 @@ crate::define_rpc_request! { let mut node_impl = node.node_impl(); let status = node.status(); - let check_term = |requested_term| -> Result<()> { - if requested_term != status.term { - Err(TraftError::TermMismatch { - requested: requested_term, - current: status.term, - }) - } else { - Ok(()) - } - }; - - check_term(requested_term)?; + if requested_term != status.term { + return Err(TraftError::TermMismatch { + requested: requested_term, + current: status.term, + }); + } if status.leader_id != Some(node.raft_id()) { // Nearly impossible error indicating invalid request. return Err(TraftError::NotALeader); @@ -75,7 +69,14 @@ crate::define_rpc_request! { // Also check that requested index actually belongs to the // requested term. - check_term(raft_log.term(requested).unwrap_or(0))?; + let entry_term = raft_log.term(requested).unwrap_or(0); + if entry_term != status.term { + return Err(Error::EntryTermMismatch { + index: requested, + expected_term: status.term, + actual_term: entry_term, + }.into()); + } let last_persisted = raft::Storage::last_index(raft_storage)?; assert!(last_persisted <= last); @@ -196,6 +197,14 @@ pub enum Error { conflict_index: RaftIndex, }, + /// Checking the predicate revealed a collision. + #[error("entry at index {index} has term {actual_term}, request implies term {expected_term}")] + EntryTermMismatch { + index: RaftIndex, + expected_term: RaftTerm, + actual_term: RaftTerm, + }, + #[error("space {space} is prohibited for use in a predicate")] SpaceNotAllowed { space: String }, diff --git a/test/int/test_cas.py b/test/int/test_cas.py index eb89cae919d99aebc2d73a083554fe3da48474c9..3fa674406a15444ba3e4c5fcf3c52d533acfca8f 100644 --- a/test/int/test_cas.py +++ b/test/int/test_cas.py @@ -52,7 +52,7 @@ def test_cas_errors(instance: Instance): ) assert e3.value.args == ( "ER_PROC_C", - "operation request from different term 1, current term is 2", + "compare-and-swap request failed: entry at index 1 has term 1, request implies term 2", ) # Wrong index (too big)