From af31ec4ced81ee7fc91cb447d98970f481b33e2b Mon Sep 17 00:00:00 2001 From: astunm Date: Wed, 11 Nov 2026 16:12:35 -0500 Subject: [PATCH] lru: Stop mixed iteration when cursors meet --- pingora-lru/src/linked_list.rs | 36 ++++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/pingora-lru/src/linked_list.rs b/pingora-lru/src/linked_list.rs index f19ec37ee..4446656c1 100644 --- a/pingora-lru/src/linked_list.rs +++ b/pingora-lru/src/linked_list.rs @@ -469,7 +469,7 @@ impl<'a, K: Default + Clone> Iterator for LinkedListIter<'a, K> { fn next(&mut self) -> Option { let next_index = self.list.next_compact(self.head); - if next_index == TAIL || next_index == NULL { + if next_index == self.tail || next_index == NULL { None } else { self.head = next_index; @@ -486,7 +486,7 @@ impl<'a, K: Default + Clone> Iterator for LinkedListIter<'a, K> { impl DoubleEndedIterator for LinkedListIter<'_, K> { fn next_back(&mut self) -> Option { let prev_index = self.list.prev_compact(self.tail); - if prev_index == HEAD || prev_index == NULL { + if prev_index == self.head || prev_index == NULL { None } else { self.tail = prev_index; @@ -511,6 +511,38 @@ mod test { assert_eq!(values, &list_values) } + #[test] + fn test_iter_front_after_back() { + let mut list = LinkedList::with_capacity(3); + for value in 0..3u64 { + list.push_tail(value); + } + let mut iter = list.iter(); + assert_eq!(iter.next_back(), Some(&2)); + assert_eq!(iter.next(), Some(&0)); + assert_eq!(iter.next_back(), Some(&1)); + assert_eq!(iter.size_hint(), (0, Some(0))); + assert_eq!(iter.next(), None); + assert_eq!(iter.next_back(), None); + assert_eq!(iter.size_hint(), (0, Some(0))); + } + + #[test] + fn test_iter_back_after_front() { + let mut list = LinkedList::with_capacity(3); + for value in 0..3u64 { + list.push_tail(value); + } + let mut iter = list.iter(); + assert_eq!(iter.next(), Some(&0)); + assert_eq!(iter.next_back(), Some(&2)); + assert_eq!(iter.next(), Some(&1)); + assert_eq!(iter.size_hint(), (0, Some(0))); + assert_eq!(iter.next_back(), None); + assert_eq!(iter.next(), None); + assert_eq!(iter.size_hint(), (0, Some(0))); + } + #[test] fn test_insert() { let mut list = LinkedList::with_capacity(10);