diff --git a/sessions.py b/sessions.py index 10f95d9..ff8a1b8 100644 --- a/sessions.py +++ b/sessions.py @@ -1,5 +1,5 @@ # will submit a PR to CherryPy project - if it gets merged we can remove it. ESH 8/15/2019 - +import cherrypy from cherrypy.lib.sessions import RamSession as cpRamSession class RamSession(cpRamSession): @@ -8,24 +8,29 @@ class RamSession(cpRamSession): now = self.now() try: - for _id, (data, expiration_time) in list(self.cache.items()): - if expiration_time <= now: - try: - del self.cache[_id] - except KeyError: - pass - try: - if self.locks[_id].acquire(blocking=False): - lock = self.locks.pop(_id) - lock.release() - except KeyError: - pass - - except RuntimeError: + cache_items_copy = self.cache.copy().items() + except RuntimeError as re: """Under heavy load, list(self.cache.items()) will occasionally raise this error for large session caches with message "dictionary changed size during iteration" Better to pause the cleanup than to let the cleanup thread die. """ + cherrypy.log(f'Runtime Error happened while copying the cache entries: {re}') + cherrypy.log('Ref: https://github.com/cherrypy/cherrypy/pull/1804') + return + + for _id, (data, expiration_time) in cache_items_copy: + if expiration_time <= now: + try: + del self.cache[_id] + except KeyError: + pass + try: + if self.locks[_id].acquire(blocking=False): + lock = self.locks.pop(_id) + lock.release() + except KeyError: + pass + return