Skip to content

Commit

Permalink
Fix the counting problem of used_weight data field in LruUnit<T>
Browse files Browse the repository at this point in the history
#164

Includes-commit: af11b96
Replicated-from: #174
Signed-off-by: JiajunDu <wonderboy512@163.com>
  • Loading branch information
JiajunDu authored and gumpt committed Apr 5, 2024
1 parent e4bd843 commit 59b60f2
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 1 deletion.
2 changes: 1 addition & 1 deletion .bleep
Original file line number Diff line number Diff line change
@@ -1 +1 @@
f54615d5e74b9ab529695a1400250b54d47a4dd5
162da367b805709c15393fd68df1a8e7b321dc8d
62 changes: 62 additions & 0 deletions pingora-lru/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,7 @@ impl<T> LruUnit<T> {
self.lookup_table.remove(&key).map(|node| {
let list_key = self.order.remove(node.list_index);
assert_eq!(key, list_key);
self.used_weight -= node.weight;
(node.data, node.weight)
})
}
Expand All @@ -322,6 +323,7 @@ impl<T> LruUnit<T> {
weight,
});
self.lookup_table.insert(key, node);
self.used_weight += weight;
true
}

Expand Down Expand Up @@ -658,4 +660,64 @@ mod test_lru_unit {
assert_eq!(lru.used_weight(), 0);
assert_lru(&lru, &[]);
}

#[test]
fn test_remove() {
let mut lru = LruUnit::with_capacity(10);

lru.admit(2, 2, 2);
lru.admit(3, 3, 3);
lru.admit(4, 4, 4);
lru.admit(5, 5, 5);
assert_lru(&lru, &[5, 4, 3, 2]);

assert!(lru.access(4));
assert!(lru.access(3));
assert!(lru.access(3));
assert!(lru.access(2));
assert_lru(&lru, &[2, 3, 4, 5]);

assert_eq!(lru.used_weight(), 2 + 3 + 4 + 5);
assert_eq!(lru.remove(2), Some((2, 2)));
assert_eq!(lru.used_weight(), 3 + 4 + 5);
assert_lru(&lru, &[3, 4, 5]);

assert_eq!(lru.remove(4), Some((4, 4)));
assert_eq!(lru.used_weight(), 3 + 5);
assert_lru(&lru, &[3, 5]);

assert_eq!(lru.remove(5), Some((5, 5)));
assert_eq!(lru.used_weight(), 3);
assert_lru(&lru, &[3]);

assert_eq!(lru.remove(1), None);
assert_eq!(lru.used_weight(), 3);
assert_lru(&lru, &[3]);

assert_eq!(lru.remove(3), Some((3, 3)));
assert_eq!(lru.used_weight(), 0);
assert_lru(&lru, &[]);
}

#[test]
fn test_insert_tail() {
let mut lru = LruUnit::with_capacity(10);
assert_eq!(lru.len(), 0);
assert!(lru.peek(0).is_none());

assert!(lru.insert_tail(2, 2, 1));
assert_eq!(lru.len(), 1);
assert_eq!(lru.peek(2).unwrap(), &2);
assert_eq!(lru.used_weight(), 1);

assert!(!lru.insert_tail(2, 2, 2));
assert!(lru.insert_tail(3, 3, 3));
assert_eq!(lru.used_weight(), 1 + 3);
assert_lru(&lru, &[2, 3]);

assert!(lru.insert_tail(4, 4, 4));
assert!(lru.insert_tail(5, 5, 5));
assert_eq!(lru.used_weight(), 1 + 3 + 4 + 5);
assert_lru(&lru, &[2, 3, 4, 5]);
}
}

0 comments on commit 59b60f2

Please sign in to comment.