Skip to content

Commit

Permalink
store: fix wrong deletion (#1810)
Browse files Browse the repository at this point in the history
  • Loading branch information
BusyJay authored and siddontang committed May 3, 2017
1 parent 87d3e8c commit 8858485
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 11 deletions.
7 changes: 2 additions & 5 deletions src/raftstore/store/store.rs
Expand Up @@ -1130,11 +1130,8 @@ impl<T: Transport, C: PdClient> Store<T, C> {
}

if !campaigned {
if let Some(pos) = self.pending_votes
.iter()
.rev()
.position(|m| m.get_to_peer() == &peer) {
let msg = self.pending_votes.swap_remove_front(pos).unwrap();
if let Some(msg) = self.pending_votes
.swap_remove_front(|m| m.get_to_peer() == &peer) {
let _ = self.on_raft_message(msg);
}
}
Expand Down
19 changes: 13 additions & 6 deletions src/util/mod.rs
Expand Up @@ -478,8 +478,14 @@ impl<T> RingQueue<T> {
self.buf.iter()
}

pub fn swap_remove_front(&mut self, pos: usize) -> Option<T> {
self.buf.swap_remove_front(pos)
pub fn swap_remove_front<F>(&mut self, f: F) -> Option<T>
where F: FnMut(&T) -> bool
{
if let Some(pos) = self.buf.iter().position(f) {
self.buf.swap_remove_front(pos)
} else {
None
}
}
}

Expand Down Expand Up @@ -532,17 +538,18 @@ mod tests {
queue.push(num);
assert_eq!(queue.len(), cmp::min(num + 1, 10));
}
assert_eq!(None, queue.swap_remove_front(10));
assert_eq!(None, queue.swap_remove_front(|i| *i == 20));
for i in 0..6 {
assert_eq!(Some(12 + i), queue.swap_remove_front(2));
assert_eq!(Some(12 + i), queue.swap_remove_front(|e| *e == 12 + i));
assert_eq!(queue.len(), 9 - i);
}

let left: Vec<_> = queue.iter().cloned().collect();
assert_eq!(vec![10, 11, 18, 19], left);
for _ in 0..4 {
queue.swap_remove_front(0).unwrap();
queue.swap_remove_front(|_| true).unwrap();
}
assert_eq!(None, queue.swap_remove_front(0));
assert_eq!(None, queue.swap_remove_front(|_| true));
}

#[test]
Expand Down

0 comments on commit 8858485

Please sign in to comment.