diff --git a/hydro_optimize_examples/src/compare_and_swap/cas.rs b/hydro_optimize_examples/src/compare_and_swap/cas.rs index 7573cc6..0c152fd 100644 --- a/hydro_optimize_examples/src/compare_and_swap/cas.rs +++ b/hydro_optimize_examples/src/compare_and_swap/cas.rs @@ -16,7 +16,7 @@ pub struct CAS<'a, 'b> { impl<'a, 'b, State, Sender> CASLike<'a, State, Sender> for CAS<'a, 'b> where - State: Clone + Serialize + for<'de> Deserialize<'de> + Ord + 'a, + State: Clone + Serialize + for<'de> Deserialize<'de> + PartialOrd + 'a, Sender: Clone + Serialize + for<'de> Deserialize<'de> + Eq + Hash + 'a, { fn build( diff --git a/hydro_optimize_examples/src/compare_and_swap/cas_distributed.rs b/hydro_optimize_examples/src/compare_and_swap/cas_distributed.rs index 4fff00c..77b8bc4 100644 --- a/hydro_optimize_examples/src/compare_and_swap/cas_distributed.rs +++ b/hydro_optimize_examples/src/compare_and_swap/cas_distributed.rs @@ -247,7 +247,7 @@ impl<'a, 'b> DistributedCAS<'a, 'b> { /// 2. Each client subscribes at most once. (Doesn't break correctness but will duplicate messages). impl<'a, 'b, State, Sender> CASLike<'a, State, Sender> for DistributedCAS<'a, 'b> where - State: Clone + Debug + Serialize + for<'de> Deserialize<'de> + Ord + 'a, + State: Clone + Debug + Serialize + for<'de> Deserialize<'de> + PartialOrd + Eq + 'a, Sender: Clone + Debug + Serialize + for<'de> Deserialize<'de> + Eq + Hash + 'a, { fn build( @@ -380,7 +380,12 @@ where .clone() .map(q!(|(response, _all_agree)| (response.max_ballot, response.state))) .chain(committed_state.into_stream()) - .max(); + .reduce(q!(|(ballot, state), (new_ballot, new_state)| { + if new_ballot >= *ballot { + *ballot = new_ballot; + *state = new_state; + } + }, commutative = manual_proof!(/** Max is commutative. If the new ballot is the same, then state can be overwritten based on order and that's ok. */))); // Propose a valid client write if the election is succesful and all agree let proposed_client_write = write_queue .clone() diff --git a/hydro_optimize_examples/src/compare_and_swap/cas_like.rs b/hydro_optimize_examples/src/compare_and_swap/cas_like.rs index 71db88f..d4c94f4 100644 --- a/hydro_optimize_examples/src/compare_and_swap/cas_like.rs +++ b/hydro_optimize_examples/src/compare_and_swap/cas_like.rs @@ -43,14 +43,6 @@ impl PartialOrd for CASState { } } -impl Ord for CASState { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.version - .cmp(&other.version) - .then_with(|| self.state.cmp(&other.state)) - } -} - #[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] pub struct UniqueRequestId { pub id: u64,