From 6f1c6a84c39f67fa1ab841af039d9f672a0b15ba Mon Sep 17 00:00:00 2001 From: Yu Feng Date: Mon, 4 Mar 2019 10:09:02 -0800 Subject: [PATCH] Protect against empty heap. I do not understand how this can happen, but we are seeing this stack trace: ``` ../testenv/lib/python3.6/site-packages/nbodykit/tests/test_cache.py:19: in test_cache cache.cache.shrink() /home/travis/miniconda/envs/test/lib/python3.6/site-packages/cachey/cache.py:139: in shrink self._shrink_one() /home/travis/miniconda/envs/test/lib/python3.6/site-packages/cachey/cache.py:126: in _shrink_one key, score = self.heap.popitem() _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ self = def popitem(self): """D.popitem() -> (k, v), remove and return the (key, value) pair with lowest\nvalue; but raise KeyError if D is empty.""" > wrapper = self.heap[0] E IndexError: list index out of range /home/travis/miniconda/envs/test/lib/python3.6/site-packages/heapdict.py:91: IndexError ``` This should fix the stack trace, but it is not clear to me how it can happen when the heap is empty yet total_bytes is not zero. --- cachey/cache.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cachey/cache.py b/cachey/cache.py index b291c1c..d84ded8 100644 --- a/cachey/cache.py +++ b/cachey/cache.py @@ -123,9 +123,13 @@ def retire(self, key): self.total_bytes -= self.nbytes.pop(key) def _shrink_one(self): - key, score = self.heap.popitem() + try: + key, score = self.heap.popitem() + except IndexError: + return self.retire(key) + def resize(self, available_bytes): """ Resize the cache.