commit
d5fd0928cf
35
sessions.py
35
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
|
||||
|
||||
|
|
Loading…
Reference in New Issue