diff --git a/crates/curp/src/server/raw_curp/log.rs b/crates/curp/src/server/raw_curp/log.rs index b8c0750b8..0bddd30bc 100644 --- a/crates/curp/src/server/raw_curp/log.rs +++ b/crates/curp/src/server/raw_curp/log.rs @@ -129,10 +129,16 @@ impl LogEntryVecDeque { self.batch_index.push_back(0); // placeholder self.last_batch_size += entry_size; - while self.last_batch_size > self.batch_limit { + while self.last_batch_size >= self.batch_limit { if let Some(cur_batch_index) = self.batch_index.get_mut(self.first_entry_at_last_batch) { *cur_batch_index = self.entries.len() - 1 - self.first_entry_at_last_batch; + + if self.last_batch_size == self.batch_limit { + // self.last_batch_size == self.batch_limit means the last index must be included in `get_range` + *cur_batch_index += 1; + } + if let Some(cur_entry_size) = self.entry_size.get(self.first_entry_at_last_batch) { self.last_batch_size -= *cur_entry_size; } @@ -160,11 +166,11 @@ impl LogEntryVecDeque { let _ = self .batch_index .pop_front() - .unwrap_or_else(|| unreachable!()); + .unwrap_or_else(|| unreachable!("The batch_index cannot be empty")); let _ = self .entry_size .pop_front() - .unwrap_or_else(|| unreachable!()); + .unwrap_or_else(|| unreachable!("The pop_front cannot be empty")); self.entries.pop_front() } else { None @@ -218,10 +224,7 @@ impl LogEntryVecDeque { /// check whether the log entry range [li,..) exceeds the batch limit or not fn has_next_batch(&self, left: usize) -> bool { if let Some(&offset) = self.batch_index.get(left) { - offset != 0 - || (self.first_entry_at_last_batch == left - && self.batch_limit == self.last_batch_size) - || left == self.batch_index.len() - 1 + offset != 0 || self.first_entry_at_last_batch > left } else { false } @@ -235,6 +238,7 @@ impl LogEntryVecDeque { self.last_batch_size = 0; self.first_entry_at_last_batch = 0; self.batch_index.clear(); + self.entry_size.clear(); let prev_entries = self.entries.clone(); self.entries.clear();